From 64f448979dd80fe7052584ed9ec78be49e0e0a1d Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Thu, 5 Nov 2015 22:01:29 -0500 Subject: [PATCH] bump portmidi to rev 217 from 2010 --- pd/portmidi/ALL_BUILD.vcproj | 128 + pd/portmidi/CHANGELOG.txt | 34 + pd/portmidi/CMakeLists.txt | 77 + pd/portmidi/Doxyfile | 1472 +++++ pd/portmidi/README.txt | 19 +- pd/portmidi/ZERO_CHECK.vcproj | 128 + pd/portmidi/license.txt | 4 +- pd/portmidi/pm_cl/README_CL.txt | 104 + pd/portmidi/pm_cl/cffi-portmidi.lisp | 384 ++ pd/portmidi/pm_cl/test-no-cm.lisp | 112 + pd/portmidi/pm_common/CMakeLists.txt | 128 + pd/portmidi/pm_common/pminternal.h | 30 +- pd/portmidi/pm_common/pmjni.vcproj | 161 + pd/portmidi/pm_common/pmutil.c | 595 +- pd/portmidi/pm_common/pmutil.h | 19 +- pd/portmidi/pm_common/portmidi-dynamic.vcproj | 179 + pd/portmidi/pm_common/portmidi-static.vcproj | 141 + pd/portmidi/pm_common/portmidi.c | 2321 ++++--- pd/portmidi/pm_common/portmidi.h | 1260 ++-- pd/portmidi/pm_csharp/README.txt | 20 + .../pm_csharp/pm_managed/AssemblyInfo.cpp | 40 + pd/portmidi/pm_csharp/pm_managed/ReadMe.txt | 31 + pd/portmidi/pm_csharp/pm_managed/Stdafx.cpp | 5 + pd/portmidi/pm_csharp/pm_managed/Stdafx.h | 7 + pd/portmidi/pm_csharp/pm_managed/app.ico | Bin 0 -> 1078 bytes pd/portmidi/pm_csharp/pm_managed/app.rc | 63 + .../pm_csharp/pm_managed/pm_managed.cpp | 6 + pd/portmidi/pm_csharp/pm_managed/pm_managed.h | 53 + .../pm_csharp/pm_managed/pm_managed.vcproj | 260 + pd/portmidi/pm_csharp/pm_managed/resource.h | 3 + pd/portmidi/pm_dylib/CMakeLists.txt | 127 + pd/portmidi/pm_dylib/README.txt | 11 + pd/portmidi/pm_dylib/portmidi-dynamic.vcproj | 158 + pd/portmidi/pm_java/CMakeLists.txt | 47 + pd/portmidi/pm_java/JavaExe.exe | Bin 0 -> 131072 bytes pd/portmidi/pm_java/README.txt | 48 + pd/portmidi/pm_java/UpdateRsrcJavaExe.exe | Bin 0 -> 102400 bytes pd/portmidi/pm_java/jportmidi/JPortMidi.java | 539 ++ .../pm_java/jportmidi/JPortMidiApi.java | 117 + .../pm_java/jportmidi/JPortMidiException.java | 12 + pd/portmidi/pm_java/mac-make.sh | 26 + pd/portmidi/pm_java/make.bat | 47 + .../pm_java/pmdefaults-setup-script.iss | 44 + .../pm_java/pmdefaults/PmDefaults.java | 11 + .../pm_java/pmdefaults/PmDefaultsFrame.java | 428 ++ pd/portmidi/pm_java/pmdefaults/README.txt | 21 + pd/portmidi/pm_java/pmdefaults/manifest.txt | 1 + pd/portmidi/pm_java/pmdefaults/pmdefaults | 1 + .../pm_java/pmdefaults/pmdefaults-icon.bmp | Bin 0 -> 17464 bytes .../pm_java/pmdefaults/pmdefaults-icon.gif | Bin 0 -> 6976 bytes .../pm_java/pmdefaults/pmdefaults-icon.png | Bin 0 -> 6986 bytes .../pm_java/pmdefaults/pmdefaults-icon.xcf | Bin 0 -> 19957 bytes .../pm_java/pmdefaults/pmdefaults-license.txt | 37 + .../pm_java/pmdefaults/pmdefaults.icns | Bin 0 -> 36751 bytes pd/portmidi/pm_java/pmdefaults/pmdefaults.ico | Bin 0 -> 99678 bytes .../pm_java/pmdefaults/portmusic_logo.png | Bin 0 -> 753 bytes .../pm_java/pmdefaults/readme-win32.txt | 11 + .../pm_java/pmjni/jportmidi_JportMidiApi.h | 293 + pd/portmidi/pm_java/pmjni/pmjni-VC8.vcproj | 225 + pd/portmidi/pm_java/pmjni/pmjni.c | 354 ++ pd/portmidi/pm_java/pmjni/pmjni.rc | 63 + .../pm_java/setup/pmdefaults-setup.exe | Bin 0 -> 485013 bytes pd/portmidi/pm_linux/README_LINUX.txt | 98 +- pd/portmidi/pm_linux/finddefault.c | 92 + pd/portmidi/pm_linux/pmlinux.c | 23 +- pd/portmidi/pm_linux/pmlinux.h | 0 pd/portmidi/pm_linux/pmlinuxalsa.c | 11 +- pd/portmidi/pm_linux/pmlinuxalsa.h | 0 pd/portmidi/pm_mac/Makefile.osx | 129 + pd/portmidi/pm_mac/README_MAC.txt | 163 + pd/portmidi/pm_mac/finddefault.c | 57 + .../pm_mac/pm_mac.xcodeproj/project.pbxproj | 594 ++ pd/portmidi/pm_mac/pmdefaults/make/build.xml | 87 + .../pm_mac/pmdefaults/make/find-classrefs.sh | 31 + .../resources/English.lproj/Credits.rtf | 14 + .../resources/English.lproj/InfoPlist.strings | Bin 0 -> 220 bytes .../pm_mac/pmdefaults/resources/Info.plist | 40 + .../pm_mac/pmdefaults/resources/Manifest | 1 + pd/portmidi/pm_mac/pmmac.c | 25 +- pd/portmidi/pm_mac/pmmac.h | 0 pd/portmidi/pm_mac/pmmacosxcm.c | 206 +- pd/portmidi/pm_mac/pmmacosxcm.h | 4 +- pd/portmidi/pm_mac/readbinaryplist.c | 1115 ++++ pd/portmidi/pm_mac/readbinaryplist.h | 88 + pd/portmidi/pm_mingw/README-MINGW.txt | 11 + pd/portmidi/pm_mingw/eclipse/README.txt | 23 + pd/portmidi/pm_mingw/eclipse/dot-cproject | 710 +++ pd/portmidi/pm_mingw/eclipse/dot-project | 69 + pd/portmidi/pm_mingw/msys/README-MSYS.txt | 8 + pd/portmidi/pm_python/README_PYTHON.txt | 34 + pd/portmidi/pm_python/pyportmidi/__init__.py | 3 + .../pm_python/pyportmidi/_pyportmidi.c | 5663 +++++++++++++++++ .../pm_python/pyportmidi/_pyportmidi.pyx | 537 ++ pd/portmidi/pm_python/pyportmidi/midi.py | 566 ++ pd/portmidi/pm_python/setup.py | 185 + pd/portmidi/pm_qt/README_QT.txt | 15 + pd/portmidi/pm_qt/portmidi.pro | 47 + pd/portmidi/pm_test/CMakeLists.txt | 26 + pd/portmidi/pm_test/latency.c | 290 + pd/portmidi/pm_test/latency.vcproj | 148 + pd/portmidi/pm_test/midiclock.c | 287 + pd/portmidi/pm_test/midiclock.vcproj | 148 + pd/portmidi/pm_test/midithread.c | 329 + pd/portmidi/pm_test/midithread.vcproj | 148 + pd/portmidi/pm_test/midithru.c | 366 ++ pd/portmidi/pm_test/midithru.vcproj | 148 + pd/portmidi/pm_test/mm.c | 572 ++ pd/portmidi/pm_test/mm.vcproj | 148 + pd/portmidi/pm_test/qtest.c | 174 + pd/portmidi/pm_test/qtest.vcproj | 148 + pd/portmidi/pm_test/sysex.c | 528 ++ pd/portmidi/pm_test/sysex.vcproj | 148 + pd/portmidi/pm_test/test.c | 489 ++ pd/portmidi/pm_test/test.vcproj | 148 + pd/portmidi/pm_test/txdata.syx | 257 + pd/portmidi/pm_win/README_WIN.txt | 218 +- pd/portmidi/pm_win/clean_cmake.bat | 6 + pd/portmidi/pm_win/clean_up_vcproj.awk | 70 + pd/portmidi/pm_win/clean_up_vcproj.bat | 76 + pd/portmidi/pm_win/copy-dll.bat | 17 - pd/portmidi/pm_win/debugging_dlls.txt | 0 pd/portmidi/pm_win/pm_dll.dsp | 107 - pd/portmidi/pm_win/pmdll.c | 49 - pd/portmidi/pm_win/pmdll.h | 5 - pd/portmidi/pm_win/pmwin.c | 101 +- pd/portmidi/pm_win/pmwinmm.c | 149 +- pd/portmidi/pm_win/pmwinmm.h | 0 pd/portmidi/pm_win/static.cmake | 16 + pd/portmidi/portmidi.sln | 147 + pd/portmidi/portmidi_cdt.zip | Bin 0 -> 210271 bytes pd/portmidi/portmusic_logo.png | Bin 0 -> 753 bytes pd/portmidi/porttime/porttime-VC8.vcproj | 225 + pd/portmidi/porttime/porttime.c | 0 pd/portmidi/porttime/porttime.dsp | 0 pd/portmidi/porttime/porttime.h | 128 +- pd/portmidi/porttime/porttime.vcproj | 184 + pd/portmidi/porttime/ptlinux.c | 15 +- pd/portmidi/porttime/ptmacosx_cf.c | 5 + pd/portmidi/porttime/ptmacosx_mach.c | 9 +- pd/portmidi/porttime/ptwinmm.c | 19 +- 140 files changed, 24451 insertions(+), 2651 deletions(-) create mode 100644 pd/portmidi/ALL_BUILD.vcproj create mode 100644 pd/portmidi/CMakeLists.txt create mode 100644 pd/portmidi/Doxyfile mode change 100644 => 100755 pd/portmidi/README.txt create mode 100644 pd/portmidi/ZERO_CHECK.vcproj create mode 100644 pd/portmidi/pm_cl/README_CL.txt create mode 100644 pd/portmidi/pm_cl/cffi-portmidi.lisp create mode 100644 pd/portmidi/pm_cl/test-no-cm.lisp create mode 100644 pd/portmidi/pm_common/CMakeLists.txt mode change 100644 => 100755 pd/portmidi/pm_common/pminternal.h create mode 100644 pd/portmidi/pm_common/pmjni.vcproj mode change 100644 => 100755 pd/portmidi/pm_common/pmutil.c mode change 100644 => 100755 pd/portmidi/pm_common/pmutil.h create mode 100644 pd/portmidi/pm_common/portmidi-dynamic.vcproj create mode 100644 pd/portmidi/pm_common/portmidi-static.vcproj mode change 100644 => 100755 pd/portmidi/pm_common/portmidi.c mode change 100644 => 100755 pd/portmidi/pm_common/portmidi.h create mode 100644 pd/portmidi/pm_csharp/README.txt create mode 100755 pd/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp create mode 100755 pd/portmidi/pm_csharp/pm_managed/ReadMe.txt create mode 100755 pd/portmidi/pm_csharp/pm_managed/Stdafx.cpp create mode 100755 pd/portmidi/pm_csharp/pm_managed/Stdafx.h create mode 100755 pd/portmidi/pm_csharp/pm_managed/app.ico create mode 100755 pd/portmidi/pm_csharp/pm_managed/app.rc create mode 100755 pd/portmidi/pm_csharp/pm_managed/pm_managed.cpp create mode 100755 pd/portmidi/pm_csharp/pm_managed/pm_managed.h create mode 100755 pd/portmidi/pm_csharp/pm_managed/pm_managed.vcproj create mode 100755 pd/portmidi/pm_csharp/pm_managed/resource.h create mode 100644 pd/portmidi/pm_dylib/CMakeLists.txt create mode 100644 pd/portmidi/pm_dylib/README.txt create mode 100644 pd/portmidi/pm_dylib/portmidi-dynamic.vcproj create mode 100644 pd/portmidi/pm_java/CMakeLists.txt create mode 100644 pd/portmidi/pm_java/JavaExe.exe create mode 100644 pd/portmidi/pm_java/README.txt create mode 100644 pd/portmidi/pm_java/UpdateRsrcJavaExe.exe create mode 100644 pd/portmidi/pm_java/jportmidi/JPortMidi.java create mode 100644 pd/portmidi/pm_java/jportmidi/JPortMidiApi.java create mode 100644 pd/portmidi/pm_java/jportmidi/JPortMidiException.java create mode 100644 pd/portmidi/pm_java/mac-make.sh create mode 100644 pd/portmidi/pm_java/make.bat create mode 100644 pd/portmidi/pm_java/pmdefaults-setup-script.iss create mode 100644 pd/portmidi/pm_java/pmdefaults/PmDefaults.java create mode 100644 pd/portmidi/pm_java/pmdefaults/PmDefaultsFrame.java create mode 100644 pd/portmidi/pm_java/pmdefaults/README.txt create mode 100644 pd/portmidi/pm_java/pmdefaults/manifest.txt create mode 100755 pd/portmidi/pm_java/pmdefaults/pmdefaults create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.bmp create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.gif create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.png create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.xcf create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults-license.txt create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults.icns create mode 100644 pd/portmidi/pm_java/pmdefaults/pmdefaults.ico create mode 100644 pd/portmidi/pm_java/pmdefaults/portmusic_logo.png create mode 100644 pd/portmidi/pm_java/pmdefaults/readme-win32.txt create mode 100644 pd/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h create mode 100644 pd/portmidi/pm_java/pmjni/pmjni-VC8.vcproj create mode 100644 pd/portmidi/pm_java/pmjni/pmjni.c create mode 100644 pd/portmidi/pm_java/pmjni/pmjni.rc create mode 100644 pd/portmidi/pm_java/setup/pmdefaults-setup.exe mode change 100644 => 100755 pd/portmidi/pm_linux/README_LINUX.txt create mode 100644 pd/portmidi/pm_linux/finddefault.c mode change 100644 => 100755 pd/portmidi/pm_linux/pmlinux.c mode change 100644 => 100755 pd/portmidi/pm_linux/pmlinux.h mode change 100644 => 100755 pd/portmidi/pm_linux/pmlinuxalsa.c mode change 100644 => 100755 pd/portmidi/pm_linux/pmlinuxalsa.h create mode 100755 pd/portmidi/pm_mac/Makefile.osx create mode 100644 pd/portmidi/pm_mac/README_MAC.txt create mode 100644 pd/portmidi/pm_mac/finddefault.c create mode 100755 pd/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj create mode 100644 pd/portmidi/pm_mac/pmdefaults/make/build.xml create mode 100755 pd/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh create mode 100644 pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf create mode 100644 pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings create mode 100644 pd/portmidi/pm_mac/pmdefaults/resources/Info.plist create mode 100644 pd/portmidi/pm_mac/pmdefaults/resources/Manifest mode change 100644 => 100755 pd/portmidi/pm_mac/pmmac.c mode change 100644 => 100755 pd/portmidi/pm_mac/pmmac.h mode change 100644 => 100755 pd/portmidi/pm_mac/pmmacosxcm.c mode change 100644 => 100755 pd/portmidi/pm_mac/pmmacosxcm.h create mode 100644 pd/portmidi/pm_mac/readbinaryplist.c create mode 100644 pd/portmidi/pm_mac/readbinaryplist.h create mode 100644 pd/portmidi/pm_mingw/README-MINGW.txt create mode 100644 pd/portmidi/pm_mingw/eclipse/README.txt create mode 100644 pd/portmidi/pm_mingw/eclipse/dot-cproject create mode 100644 pd/portmidi/pm_mingw/eclipse/dot-project create mode 100644 pd/portmidi/pm_mingw/msys/README-MSYS.txt create mode 100644 pd/portmidi/pm_python/README_PYTHON.txt create mode 100644 pd/portmidi/pm_python/pyportmidi/__init__.py create mode 100644 pd/portmidi/pm_python/pyportmidi/_pyportmidi.c create mode 100644 pd/portmidi/pm_python/pyportmidi/_pyportmidi.pyx create mode 100644 pd/portmidi/pm_python/pyportmidi/midi.py create mode 100644 pd/portmidi/pm_python/setup.py create mode 100644 pd/portmidi/pm_qt/README_QT.txt create mode 100644 pd/portmidi/pm_qt/portmidi.pro create mode 100644 pd/portmidi/pm_test/CMakeLists.txt create mode 100755 pd/portmidi/pm_test/latency.c create mode 100755 pd/portmidi/pm_test/latency.vcproj create mode 100644 pd/portmidi/pm_test/midiclock.c create mode 100644 pd/portmidi/pm_test/midiclock.vcproj create mode 100755 pd/portmidi/pm_test/midithread.c create mode 100755 pd/portmidi/pm_test/midithread.vcproj create mode 100755 pd/portmidi/pm_test/midithru.c create mode 100755 pd/portmidi/pm_test/midithru.vcproj create mode 100755 pd/portmidi/pm_test/mm.c create mode 100755 pd/portmidi/pm_test/mm.vcproj create mode 100644 pd/portmidi/pm_test/qtest.c create mode 100755 pd/portmidi/pm_test/qtest.vcproj create mode 100755 pd/portmidi/pm_test/sysex.c create mode 100755 pd/portmidi/pm_test/sysex.vcproj create mode 100755 pd/portmidi/pm_test/test.c create mode 100755 pd/portmidi/pm_test/test.vcproj create mode 100755 pd/portmidi/pm_test/txdata.syx mode change 100644 => 100755 pd/portmidi/pm_win/README_WIN.txt create mode 100644 pd/portmidi/pm_win/clean_cmake.bat create mode 100644 pd/portmidi/pm_win/clean_up_vcproj.awk create mode 100644 pd/portmidi/pm_win/clean_up_vcproj.bat delete mode 100644 pd/portmidi/pm_win/copy-dll.bat mode change 100644 => 100755 pd/portmidi/pm_win/debugging_dlls.txt delete mode 100644 pd/portmidi/pm_win/pm_dll.dsp delete mode 100644 pd/portmidi/pm_win/pmdll.c delete mode 100644 pd/portmidi/pm_win/pmdll.h mode change 100644 => 100755 pd/portmidi/pm_win/pmwin.c mode change 100644 => 100755 pd/portmidi/pm_win/pmwinmm.c mode change 100644 => 100755 pd/portmidi/pm_win/pmwinmm.h create mode 100644 pd/portmidi/pm_win/static.cmake create mode 100755 pd/portmidi/portmidi.sln create mode 100644 pd/portmidi/portmidi_cdt.zip create mode 100644 pd/portmidi/portmusic_logo.png create mode 100644 pd/portmidi/porttime/porttime-VC8.vcproj mode change 100644 => 100755 pd/portmidi/porttime/porttime.c mode change 100644 => 100755 pd/portmidi/porttime/porttime.dsp mode change 100644 => 100755 pd/portmidi/porttime/porttime.h create mode 100755 pd/portmidi/porttime/porttime.vcproj mode change 100644 => 100755 pd/portmidi/porttime/ptlinux.c mode change 100644 => 100755 pd/portmidi/porttime/ptmacosx_cf.c mode change 100644 => 100755 pd/portmidi/porttime/ptmacosx_mach.c mode change 100644 => 100755 pd/portmidi/porttime/ptwinmm.c diff --git a/pd/portmidi/ALL_BUILD.vcproj b/pd/portmidi/ALL_BUILD.vcproj new file mode 100644 index 000000000..a04c3d528 --- /dev/null +++ b/pd/portmidi/ALL_BUILD.vcproj @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="ALL_BUILD" + ProjectGUID="{E1C2664B-91BB-4D4F-868C-433164F81101}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="ALL_BUILD.dir\Debug" + ConfigurationType="10" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + ExceptionHandling="0" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="ALL_BUILD.dir\Release" + ConfigurationType="10" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + ExceptionHandling="0" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + </Configuration> + </Configurations> + <Files> + <File + RelativePath=".\CMakeFiles\ALL_BUILD"> + </File> + <Filter + Name="CMake Rules" + Filter=""> + <File + RelativePath=".\CMakeFiles\ALL_BUILD.rule"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="Build all projects" + CommandLine="" + AdditionalDependencies=".\CMakeFiles\ALL_BUILD.rule" + Outputs=".\CMakeFiles\ALL_BUILD"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="Build all projects" + CommandLine="" + AdditionalDependencies=".\CMakeFiles\ALL_BUILD.rule" + Outputs=".\CMakeFiles\ALL_BUILD"/> + </FileConfiguration> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/CHANGELOG.txt b/pd/portmidi/CHANGELOG.txt index fd118e814..c2a083a56 100644 --- a/pd/portmidi/CHANGELOG.txt +++ b/pd/portmidi/CHANGELOG.txt @@ -1,4 +1,38 @@ /* CHANGELOG FOR PORTMIDI + * + * 19Oct09 Roger Dannenberg + * - Changes dynamic library names from portmidi_d to portmidi to + * be backward-compatible with programs expecting a library by + * the old name. + * + * 04Oct09 Roger Dannenberg + * - Converted to using Cmake. + * - Renamed static and dynamic library files to portmidi_s and portmidi_d + * - Eliminated VC9 and VC8 files (went back to simply test.vcproj, etc., + * use Cmake to switch from the provided VC9 files to VC8 or other) + * - Many small changes to prepare for 64-bit architectures (but only + * tested on 32-bit machines) + * + * 16Jun09 Roger Dannenberg + * - Started using Microsoft Visual C++ Version 9 (Express). Converted + * all *-VC9.vcproj file to *.vcproj and renamed old project files to + * *-VC8.proj. Previously, output from VC9 went to special VC9 files, + * that breaks any program or script looking for output in release or + * debug files, so now both compiler version output to the same folders. + * Now, debug version uses static linking with debug DLL runtime, and + * release version uses static linking with statically linked runtime. + * Converted to Inno Setup and worked on scripts to make things build + * properly, especially pmdefaults. + * + * 02Jan09 Roger Dannenberg + * - Created Java interface and wrote PmDefaults application to set + * values for Pm_GetDefaultInputDeviceID() and + * Pm_GetDefaultOutputDeviceID(). Other fixes. + * + * 19Jun08 Roger Dannenberg and Austin Sung + * - Removed USE_DLL_FOR_CLEANUP -- Windows 2000 through Vista seem to be + * fixed now, and can recover if MIDI ports are left open + * - Various other minor patches * * 17Jan07 Roger Dannenberg * - Lots more help for Common Lisp user in pm_cl diff --git a/pd/portmidi/CMakeLists.txt b/pd/portmidi/CMakeLists.txt new file mode 100644 index 000000000..4919b78df --- /dev/null +++ b/pd/portmidi/CMakeLists.txt @@ -0,0 +1,77 @@ +# portmidi +# Roger B. Dannenberg +# 20 Sep 2009 + +cmake_minimum_required(VERSION 2.6) + +if(UNIX) + # allow user to set Release or Debug + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Semicolon-separate list of supported configuration types") + # set default directories but don't override cached values... + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "libraries go here") + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "libraries go here") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "executables go here") + +else(UNIX) + # this does not seem to work for xcode: + set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING + "Semicolon-separate list of supported configuration types") +endif(UNIX) + +#set(CMAKE_RELATIVE_PATHS ON CACHE STRING "avoid absolute paths" FORCE) + +# Clear out the built-in C++ compiler and link flags for each of the +# unused configurations. +set(CMAKE_CXX_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused") +set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused") +set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused") +set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "" CACHE INTERNAL "Unused") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused") +set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused") +set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused") +set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "" CACHE INTERNAL "Unused") + +set(CMAKE_OSX_ARCHITECTURES i386 ppc x86_64 CACHE STRING "change to needed architecture for a smaller library" FORCE) + +PROJECT(portmidi) + +if(UNIX) + # Problem: if there was an old Debug build and you change + # CMAKE_BUILD_TYPE to Release, then the OUTPUT_DIRECTORY's will + # still be Debug. Try to fix this by checking if the DIRECTORY's + # look wrong, and if so, force them to the defaults: + if(CMAKE_BUILD_TYPE MATCHES "Debug") + set(BAD_DIR "Release") + else(CMAKE_BUILD_TYPE MATCHES "Debug") + set(BAD_DIR "Debug") + endif(CMAKE_BUILD_TYPE MATCHES "Debug") + # use library as reference -- if you give it a non-BAD_DIR location + # then every other path is left alone + if(CMAKE_LIBRARY_OUTPUT_DIRECTORY MATCHES ${BAD_DIR}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "executables go here" FORCE) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "libraries go here" FORCE) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_CACHEFILE_DIR}/${CMAKE_BUILD_TYPE} + CACHE STRING "libraries go here" FORCE) + endif(CMAKE_LIBRARY_OUTPUT_DIRECTORY MATCHES ${BAD_DIR}) +endif(UNIX) + +include_directories(pm_common porttime) +add_subdirectory(pm_common) + +add_subdirectory(pm_test) + +add_subdirectory(pm_dylib) + +# Cannot figure out how to make an xcode Java application with CMake +add_subdirectory(pm_java) + diff --git a/pd/portmidi/Doxyfile b/pd/portmidi/Doxyfile new file mode 100644 index 000000000..0adb68293 --- /dev/null +++ b/pd/portmidi/Doxyfile @@ -0,0 +1,1472 @@ +# Doxyfile 1.5.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = PortMidi + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 2.2.x + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = . + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. +# 1.5.7 +#IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols +# 1.5.7 +# SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. +# 1.5.7 +# SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. +# 1.5.7 +# SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. +# 1.5.7 +# LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = \ + pm_common/portmidi.h \ + pm_common/portmidi.c \ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h \ + *.c + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = ./pm_test + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = *.cxx \ + *.h \ + *.H \ + *.fl + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = Pm_ + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = YES + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. +# 1.5.7 +# CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. +# 1.5.7 +# GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. +# 1.5.7 +# QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>. +# 1.5.7 +# QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>. +# 1.5.7 +# QHP_VIRTUAL_FOLDER = doc + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file . +# 1.5.7 +# QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 200 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. +# 1.5.7 +# FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = FL_DOXYGEN \ + HAVE_CAIRO \ + HAVE_GL \ + HAVE_GL_OVERLAY \ + FL_EXPORT:= + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. +# 1.5.7 +# DOT_FONTNAME = FreeSans + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. +# 1.5.7 +# DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/pd/portmidi/README.txt b/pd/portmidi/README.txt old mode 100644 new mode 100755 index 0ab950d03..32608231b --- a/pd/portmidi/README.txt +++ b/pd/portmidi/README.txt @@ -1,7 +1,8 @@ README for PortMidi -Roger Dannenberg -VERSION: this is the 17-Jan-07 version of PortMidi. +Roger B. Dannenberg + +VERSION: please use "svn info" to get info. Documentation for PortMidi is found in pm_common/portmidi.h. @@ -10,6 +11,10 @@ Additional documentation: - Linux: see pm_linux/README_LINUX.txt - Mac OSX: see pm_mac/README_MAC.txt - Common Lisp: see pm_cl/README_CL.txt + - Eclipse: see portmidi_cdt.zip (this was contributed as is; the dlls here + are now -- Sep 09 -- out of date. What is really needed is a script + to generate this release automatically so we can maintain it.) + - C-Sharp: see pm_csharp.zip (also contributed as is) ---------- some notes on the design of PortMidi ---------- @@ -27,7 +32,7 @@ ERROR HANDLING Error handling turned out to be much more complicated than expected. PortMidi functions return error codes that the caller can check. -In addition, errors may occur asynchronously due to MIDI input. +In addition, errors may occur asynchronously due to MIDI input. However, for Windows, there are virtually no errors that can occur if the code is correct and not passing bogus values. One exception is an error that the system is out of memory, but my @@ -39,8 +44,8 @@ Ordinarily, the caller checks for an error code. If the error is system-dependent, pmHostError is returned and the caller can call Pm_GetHostErrorText to get a text description of the error. -Host error codes are system-specific and are recorded in the -system-specific data allocated for each open MIDI port. +Host error codes are system-specific and are recorded in the +system-specific data allocated for each open MIDI port. However, if an error occurs on open or close, we cannot store the error with the device because there will be no device data (assuming PortMidi cleans up after devices that @@ -56,7 +61,7 @@ overhead even if the user does not want to look at the error data. The system-specific Read, Write, Poll, etc. implementations should check for asynchronous errors and return immediately if one is -found so that these get reported. This happens in the Mac OS X +found so that these get reported. This happens in the Mac OS X code, where lots of things are happening in callbacks, but again, in Windows, there are no error codes recorded in callbacks. @@ -64,7 +69,7 @@ DEBUGGING If you are building a console application for research, we suggest compiling with the option PM_CHECK_ERRORS. This will insert a -check for error return values at the end of each PortMidi +check for error return values at the end of each PortMidi function. If an error is encountered, a text message is printed using printf(), the user is asked to type ENTER, and then exit(-1) is called to clean up and terminate the program. diff --git a/pd/portmidi/ZERO_CHECK.vcproj b/pd/portmidi/ZERO_CHECK.vcproj new file mode 100644 index 000000000..23d96278d --- /dev/null +++ b/pd/portmidi/ZERO_CHECK.vcproj @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="ZERO_CHECK" + ProjectGUID="{28779535-7541-4FF5-AC12-FAFD66E894EC}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="ZERO_CHECK.dir\Debug" + ConfigurationType="10" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + ExceptionHandling="0" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="ZERO_CHECK.dir\Release" + ConfigurationType="10" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + ExceptionHandling="0" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories=".\pm_common;.\porttime;" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + </Configuration> + </Configurations> + <Files> + <File + RelativePath=".\CMakeFiles\ZERO_CHECK"> + </File> + <Filter + Name="CMake Rules" + Filter=""> + <File + RelativePath=".\CMakeFiles\ZERO_CHECK.rule"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="" + CommandLine="" + AdditionalDependencies=".\CMakeFiles\ZERO_CHECK.rule" + Outputs=".\CMakeFiles\ZERO_CHECK"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="" + CommandLine="" + AdditionalDependencies=".\CMakeFiles\ZERO_CHECK.rule" + Outputs=".\CMakeFiles\ZERO_CHECK"/> + </FileConfiguration> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/license.txt b/pd/portmidi/license.txt index b04523be4..c757b3713 100644 --- a/pd/portmidi/license.txt +++ b/pd/portmidi/license.txt @@ -3,10 +3,10 @@ * * license.txt -- a copy of the PortMidi copyright notice and license information * - * Latest version available at: http://www.cs.cmu.edu/~music/portmidi/ + * Latest version available at: http://sourceforge.net/projects/portmedia * * Copyright (c) 1999-2000 Ross Bencina and Phil Burk - * Copyright (c) 2001-2006 Roger B. Dannenberg + * Copyright (c) 2001-2009 Roger B. Dannenberg * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files diff --git a/pd/portmidi/pm_cl/README_CL.txt b/pd/portmidi/pm_cl/README_CL.txt new file mode 100644 index 000000000..be4c63591 --- /dev/null +++ b/pd/portmidi/pm_cl/README_CL.txt @@ -0,0 +1,104 @@ +README_CL.txt for PortMidi +Roger B. Dannenberg +17 Jan 2007 + +This is a Common Lisp interface to PortMidi. + +On Mac OSX, you need to build PortMidi as a dynamic link library +before you can use PortMidi from Common Lisp. + +You can build PortMidi as a dynamic link library by running this: + +cd portmidi +make -F pm_mac/Makefile.osx install-with-xcode + +This is just a shortcut for: + +cd portmidi/pm_mac +sudo xcodebuild -project pm_mac.xcodeproj -configuration Deployment install DSTROOT=/ + +You can check the file and the architecture for which it is built using: + file /usr/local/lib/libportmidi.dylib + +If you've done this install of portmidi, then you should also have + /usr/local/include/portmidi.h +This will be necessary to successfully build the cffi interface below. + +To test PortMidi with Common Lisp, I (RBD) am using SBCL, which I +downloaded from http://prdownloads.sourceforge.net/sbcl. Currently, I use + sbcl-0.9.17-x86-darwin-binary.tar.bz2 +To install this, I unpacked it by just double-clicking in the finder. Then, +from a command window, I became root using "sudo sh", and then typed: +# INSTALL_ROOT=/usr/local +# sh install.sh +# exit + +I also downloaded cffi-061012.tar.gz from + http://common-lisp.net/project/cffi/tarballs/?M=D + +To compile cffi, use the following, where "/Lisp/cffi/" is replaced by +the actual directory of cffi, e.g. + "/Users/rbd/sbcl-0.9.17-x86-darwin/cffi-061012": + +% sbcl +* (require 'asdf) +* (push "/Lisp/cffi/" asdf:*central-registry*) +* (asdf:oos 'asdf:load-op :cffi) +* (quit) + +Download Common Music's portmidi module from cvs and build the c side: +(Replace "/Lisp" with your lisp directory, e.g. +"/Users/rbd/sbcl-0.9.17-x86-darwin". These cvs commands will create +a new directory, portmidi.) + +% cd /Lisp +% export CVSROOT=:pserver:anonymous@commonmusic.cvs.sourceforge.net:/cvsroot/commonmusic +% cvs login # press Return at password prompt +% cvs checkout portmidi +% cd portmidi +% ./configure +% make +% cd .. + +Now compile/load the portmidi module just like cffi. Again, change +"/Lisp/cffi/" and "/Lisp/portmidi" to correspond to your local file system. +(Note that /Lisp becomes your lisp directory, and "cffi" becomes your +cffi folder name, e.g. "cffi-061012". + +% sbcl +* (require 'asdf) +* (push "/Lisp/cffi/" asdf:*central-registry*) +* (asdf:oos 'asdf:load-op :cffi) +* (push "/Lisp/portmidi/" asdf:*central-registry*) +* (asdf:oos 'asdf:load-op :portmidi) + +Look in the file /Lisp/portmidi/test.lisp for a test of the lisp interface to +portmidi. For example, while still running sbcl: + +* (pm:portmidi) ; initialize portmidi +* (pt:start) ; start time +* (pt:time) ; get time +* (pprint (pm:GetDeviceInfo)) ; get list of devices +((:ID 0 :NAME "IAC Driver Bus 1" :TYPE :INPUT :OPEN NIL) + (:ID 1 :NAME "IAC Driver Bus 1" :TYPE :OUTPUT :OPEN NIL)) + +Notice that test.lisp assumes MIDI input devices are connected +and uses some hard-wired device numbers, so it may not run +as is without error. + +Since test.lisp uses some Common Music calls, I (RBD) wrote a +simpler test, test-no-cm.lisp, which is in the same folder as +this (README_CL.txt) file. To use it, first check that the +values for outid (4) and inid (1) actually match PortMidi device +id's for output and input devices, and make sure the input +device is a keyboard that can generate a middle-C -- otherwise +the program will hang waiting for input. Run sbcl from this +pm_cl folder, and type: + +(load "test-no-cm.lisp") + +The program pauses frequently by calling (READ), so you +should type t or something, then <RETURN> to continue. + + +(Thanks to Leigh Smith and Rick Taube) diff --git a/pd/portmidi/pm_cl/cffi-portmidi.lisp b/pd/portmidi/pm_cl/cffi-portmidi.lisp new file mode 100644 index 000000000..4b3ad9c3e --- /dev/null +++ b/pd/portmidi/pm_cl/cffi-portmidi.lisp @@ -0,0 +1,384 @@ +;;; ********************************************************************** +;;; Copyright (C) 2005 Heinrich Taube, <taube (at) uiuc (dot) edu> +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the Lisp Lesser Gnu Public License. +;;; See http://www.cliki.net/LLGPL for the text of this agreement. +;;; ********************************************************************** + + +;;; A CFFI interface to Portmidi. Should run in most Common Lisp +;;; implementations on Linux, OS X and Windows. For information about +;;; CFFI see http://common-lisp.net/project/cffi/ + +(in-package :cl-user) + +(defvar *libportmidi* + (let ((type #+(or darwin macos macosx) "dylib" + #+(or linux linux-target (and unix pc386) freebsd) "so" + #+(or win32 microsoft-32 cygwin) "dll") + (paths (list "/usr/lib/" "/usr/local/lib/" *load-pathname*))) + (loop for d in paths + for p = (make-pathname :name "libportmidi" :type type + :defaults d) + when (probe-file p) do (return p) + finally + (error "Library \"portmidi.~A\" not found. Fix *libportmidi*." + type)))) + +;;; linux: guess i need to load porttime.so first (?) osx doesnt seem +;;; to need this lib at all... + +#+(or linux (and clisp unix (not macos))) +(let ((lpt (merge-pathnames "libporttime" *libportmidi*))) + (if (probe-file lpt) + (cffi:load-foreign-library lpt) + (error "Porttime: ~a not found. Fix *libportmidi* path." lpt))) + +;;; load portmidi lib + +(cffi:load-foreign-library *libportmidi*) + +(defpackage :portmidi + (:use :common-lisp) + (:nicknames :pm :pt) + (:shadow :initialize :terminate :time :start :stop :abort + :close :read :write :poll) + (:export :Initialize :Terminate + :HasHostError :GetErrorText :GetHostErrorText + :CountDevices :GetDefaultInputDeviceID + :GetDefaultOutputDeviceID :GetDeviceInfo + :Message :Message.status :Message.data1 :Message.data2 + :Event.message :Event.timestamp + ;; event buffers added to api + :EventBufferNew :EventBufferFree :EventBufferElt + :EventBufferMap + :OpenInput :OpenOutput :SetFilter :SetChannelMask + :Abort :Close :Read :Write :Poll :WriteShort :WriteSysex + ;; filtering constants + :filt-active :filt-sysex :filt-clock :filt-play :filt-f9 + :filt-fd :filt-reset :filt-note :filt-channel-aftertouch + :filt-poly-aftertouch :filt-program :filt-control + :filt-pitchbend :filt-mtc :filt-song-position + :filt-song-select :filt-tune :filt-tick :filt-undefined + :filt-realtime :filt-aftertouch :filt-systemcommon + ;; porttime. + :Start :Stop :Started :Time + ;; initialization insurers added to api + :portmidi :*portmidi* )) + +(in-package :portmidi) + +(cffi:defcstruct pm-device-info + (struct-version :int) + (interf :pointer) + (name :pointer) + (input :int) + (output :int) + (opened :int)) + +(cffi:define-foreign-type pm-message () ':long) +(cffi:define-foreign-type pm-timestamp () ':long) +(cffi:defcstruct pm-event + (message pm-message) + (timestamp pm-timestamp)) +(cffi:define-foreign-type pm-error () ':int) + +(cffi:define-foreign-type port-midi-stream () ':void) +(cffi:define-foreign-type pm-device-id () ':int) +(cffi:define-foreign-type pm-time-proc-ptr () ':pointer) +(cffi:defcfun ("Pm_WriteSysEx" pm-write-sys-ex) pm-error (stream :pointer) (when pm-timestamp) (msg :pointer)) +(cffi:defcfun ("Pm_WriteShort" pm-write-short) pm-error (stream :pointer) (when pm-timestamp) (msg :long)) +(cffi:defcfun ("Pm_Write" pm-write) pm-error (stream :pointer) (buffer :pointer) (length :long)) +(cffi:defcfun ("Pm_Poll" pm-poll) pm-error (stream :pointer)) +(cffi:defcfun ("Pm_Read" pm-read) pm-error (stream :pointer) (buffer :pointer) (length :long)) +(cffi:defcfun ("Pm_Close" pm-close) pm-error (stream :pointer)) +(cffi:defcfun ("Pm_Abort" pm-abort) pm-error (stream :pointer)) +;(cffi:defcfun ("Pm_SetChannelMask" pm-set-channel-mask) pm-error (stream :pointer) (mask :int)) +(cffi:defcfun ("Pm_SetFilter" pm-set-filter) pm-error (stream :pointer) (filters :long)) +(cffi:defcfun ("Pm_OpenOutput" pm-open-output) pm-error (stream :pointer) (output-device pm-device-id) (output-driver-info :pointer) (buffer-size :long) (time-proc pm-time-proc-ptr) (time-info :pointer) (latency :long)) +(cffi:defcfun ("Pm_OpenInput" pm-open-input) pm-error (stream :pointer) (input-device pm-device-id) (input-driver-info :pointer) (buffer-size :long) (time-proc pm-time-proc-ptr) (time-info :pointer)) +(cffi:defcfun ("Pm_GetDeviceInfo" pm-get-device-info) :pointer (id pm-device-id)) +(cffi:defcfun ("Pm_GetDefaultOutputDeviceID" pm-get-default-output-device-id) pm-device-id) +(cffi:defcfun ("Pm_GetDefaultInputDeviceID" pm-get-default-input-device-id) pm-device-id) +(cffi:defcfun ("Pm_CountDevices" pm-count-devices) :int) +(cffi:defcfun ("Pm_GetHostErrorText" pm-get-host-error-text) :void (msg :pointer) (len :unsigned-int)) +(cffi:defcfun ("Pm_GetErrorText" pm-get-error-text) :pointer (errnum pm-error)) +(cffi:defcfun ("Pm_HasHostError" pm-has-host-error) :int (stream :pointer)) +(cffi:defcfun ("Pm_Terminate" pm-terminate) pm-error) +(cffi:defcfun ("Pm_Initialize" pm-initialize) pm-error) + +;;; porttime.h + +(cffi:define-foreign-type pt-error () ':int) +(cffi:define-foreign-type pt-timestamp () ':long) +(cffi:defcfun ("Pt_Start" pt-start) pt-error (a :int) (b :pointer) (c :pointer)) +(cffi:defcfun ("Pt_Stop" pt-stop) pt-error ) +(cffi:defcfun ("Pt_Started" pt-started) :int) +(cffi:defcfun ("Pt_Time" pt-time) pt-timestamp) + +(defconstant true 1) +(defconstant false 0) +(defconstant pmNoError 0) +(defconstant pmHostError -10000) +(defconstant pm-no-device -1) +(defconstant pm-default-sysex-buffer-size 1024) +(defconstant filt-active 1) +(defconstant filt-sysex 2) +(defconstant filt-clock 4) +(defconstant filt-play 8) +(defconstant filt-f9 16) +(defconstant filt-fd 32) +(defconstant filt-reset 64) +(defconstant filt-note 128) +(defconstant filt-channel-aftertouch 256) +(defconstant filt-poly-aftertouch 512) +(defconstant filt-program 1024) +(defconstant filt-control 2048) +(defconstant filt-pitchbend 4096) +(defconstant filt-mtc 8192) +(defconstant filt-song-position 16384) +(defconstant filt-song-select 32768) +(defconstant filt-tune 65536) +(defconstant filt-tick filt-f9) +(defconstant filt-undefined (logior filt-f9 filt-fd)) +(defconstant filt-realtime (logior filt-active filt-sysex + filt-clock filt-play + filt-undefined filt-reset)) +(defconstant filt-aftertouch (logior filt-channel-aftertouch + filt-poly-aftertouch )) +(defconstant filt-systemcommon (logior filt-mtc filt-song-position + filt-song-select filt-tune)) +(defvar *portmidi* nil) ; t if loaded + +;;; +;;; utils +;;; + +(defvar host-error-text (make-string 256 :initial-element #\*)) + +(defmacro with-pm-error (form) + (let ((v (gensym))) + `(let ((,v ,form)) + (if (not (= ,v pmNoError)) + (if (= ,v pmHostError) + (cffi:with-foreign-string (host-error host-error-text) + (pm-get-host-error-text host-error + (length host-error-text)) + (error "Host error is: ~a" + (cffi:foreign-string-to-lisp host-error))) + (error (cffi:foreign-string-to-lisp + (pm-get-error-text ,v)))) + ,v)))) + +(defun portmidi () + ;; initializer, call before using lib + (or *portmidi* + (progn (pm-initialize) + (setq *portmidi* t)))) + +(defun Message (status data1 data2) + ;; portmidi messages are just unsigneds + (logior (logand (ash data2 16) #xFF0000) + (logand (ash data1 08) #xFF00) + (logand status #xFF))) + +(defun Message.status (m) + (logand m #xFF)) + +(defun Message.data1 (m) + (logand (ash m -08) #xFF)) + +(defun Message.data2 (m) + (logand (ash m -16) #xFF)) + +;;; accessors + +(defun DeviceInfo.interf (ptr) + (cffi:foreign-string-to-lisp + (cffi:foreign-slot-value ptr 'pm-device-info 'interf))) + +(defun DeviceInfo.name (ptr) + (cffi:foreign-string-to-lisp + (cffi:foreign-slot-value ptr 'pm-device-info 'name))) + +(defun DeviceInfo.input (ptr) + (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'input) 0) + nil + t)) + +(defun DeviceInfo.output (ptr) + (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'output) 0) + nil + t)) + +(defun DeviceInfo.opened (ptr) + (if (= (cffi:foreign-slot-value ptr 'pm-device-info 'opened) 0) + nil + t)) + +(defun Event.message (e &optional (v nil vp)) + (if vp + (progn + (setf (cffi:foreign-slot-value e 'pm-event 'message) v) + v) + (cffi:foreign-slot-value e 'pm-event 'message))) + +(defun Event.timestamp (e &optional (v nil vp)) + (if vp + (progn + (setf (cffi:foreign-slot-value e 'pm-event 'timestamp) v) + v) + (cffi:foreign-slot-value e 'pm-event 'timestamp))) + +;;; functions + +(defun Initialize () + (with-pm-error (pm-initialize))) + +(defun terminate () + (with-pm-error (pm-terminate))) + + +(defun HasHostError (pms) + (pm-has-host-error pms)) + +(defun GetErrorText (err) + (pm-get-error-text err)) + +; how do i do this? +;(progn +; (defalien "pm-GetHostErrorText" void (a c-string) (b unsigned-int)) +; (defun GetHostErrorText () +; (pm-GetHostErrorText 256))) + +(defun CountDevices () + (portmidi) + (pm-count-devices )) + +(defun GetDefaultInputDeviceID () + (let ((id (pm-get-default-input-device-id ))) + (if (= id pm-no-device) nil id))) + +(defun GetDefaultOutputDeviceID () + (let ((id (pm-get-default-output-device-id ))) + (if (= id pm-no-device) nil id))) + +;replaced by lispy version end of file. +;(defun GetDeviceInfo (id) (pm-get-device-info id)) + +(defun OpenInput (device bufsiz) + ;; portmidi: timer must be running before opening + (unless (Started) (Start)) + (cffi:with-foreign-object (p1 :pointer) + (let ((err (pm-open-input p1 device (cffi:null-pointer) + bufsiz (cffi:null-pointer) (cffi:null-pointer)))) + (if (= err pmNoError) + (cffi:mem-ref p1 :pointer) + (error (pm-get-error-text err)))))) + +(defun OpenOutput (device bufsiz latency) + (unless (Started) (Start)) + (cffi:with-foreign-object (p1 :pointer) ;(p (* PortMidi)) + (let ((err (pm-open-output p1 device (cffi:null-pointer) + bufsiz (cffi:null-pointer) (cffi:null-pointer) + latency))) + (if (= err pmNoError) + (cffi:mem-ref p1 :pointer) + (error (pm-get-error-text err)))))) + +(defun SetFilter (a filts) + (with-pm-error + (pm-set-filter a filts))) + +;(defun SetChannelMask (pms mask) +; (with-pm-error (pm-set-channel-mask pms mask))) + +(defun Abort (pms) + (with-pm-error (pm-abort pms))) + +(defun Close (pms) + (with-pm-error (pm-close pms))) + +(defun EventBufferFree (buf) + (cffi:foreign-free buf)) + +(defun EventBufferNew (len) + (cffi:foreign-alloc 'pm-event :count len)) + +(defun EventBufferElt (buf i) + ;; buf is POINTER to buf + (cffi:mem-aref buf 'pm-event i)) + +(defun EventBufferSet (buffer index timestamp message) + (setf (cffi:foreign-slot-value + (cffi:mem-aref buffer 'pm-event index) 'pm-event 'timestamp) + timestamp) + (setf (cffi:foreign-slot-value + (cffi:mem-aref buffer 'pm-event index) 'pm-event 'message) + message) + (values)) + +(defun EventBufferMap (fn buf end) + (loop for i below end + for e = (EventBufferElt buf i) + do (funcall fn (Event.message e) (Event.timestamp e))) + (values)) + +(defun Read (pms *evbuf len) + (let ((res (pm-read pms *evbuf len))) + (if (< res 0) + (error (pm-get-error-text res)) + res))) + +(defun Poll (pms) + (let ((res (pm-poll pms))) + (cond ((= res 0) nil) + ((= res 1) t) + (t (error (pm-get-error-text res)))))) + +(defun Write (pms *evbuf len) + (with-pm-error (pm-write pms *evbuf len))) + +(defun WriteShort (pms when msg) + (with-pm-error (pm-write-short pms when msg))) + +(defun WriteSysex (pms when string) + (cffi:with-foreign-string (ptr string) + (with-pm-error (pm-write-sys-ex pms when ptr)))) + +;;; porttime.h + +(defun Started () + (let ((res (pt-started))) + (if (= res false) nil t))) + +(defun Start () + ;; NB: This has to be called before opening output or input. + ;; it seems that if its called 2x we get an error. + (unless (Started) + (with-pm-error (pt-start 1 (cffi:null-pointer) (cffi:null-pointer)))) + (values)) + +(defun Stop () + (when (Started) + (with-pm-error (pt-stop))) + (values)) + +(defun Time () + (pt-time)) + +(defun GetDeviceInfo (&optional id) + (flet ((getone (id) + (let ((d (pm-get-device-info id))) + (list :id id + :name (DeviceInfo.name d) + :type (if (DeviceInfo.input d) ':input ':output) + :open (DeviceInfo.opened d))))) + ;; make sure lib is initialized before checking devices + (portmidi) + (if id (getone id) + (loop for i below (CountDevices) + collect (getone i))))) + +(pushnew ':portmidi *features*) diff --git a/pd/portmidi/pm_cl/test-no-cm.lisp b/pd/portmidi/pm_cl/test-no-cm.lisp new file mode 100644 index 000000000..fd8527e62 --- /dev/null +++ b/pd/portmidi/pm_cl/test-no-cm.lisp @@ -0,0 +1,112 @@ +;; this is a half-baked sequence of PortMidi calls to test the interface +;; No calls to Common Music are made, hence test-no-cm.lisp + +; setup cffi if it has not been done already +(if (not (boundp '*clpath*)) + (load "setup-pm.lisp")) + +(defun println (s) (print s) (terpri)) + +;; initialize portmidi lib +(pm:portmidi) +;; timer testing +(pt:Start ) +(pt:Started) +(format t "time is ~A, type something~%" (pt:Time)) +(read) +(format t "time is ~A, type something~%" (pt:Time)) +(read) +(pt:Time) +(format t "time is ~A, type something~%" (pt:Time)) + +;; device testing +(pm:CountDevices) +(pprint (pm:GetDeviceInfo )) +(defparameter inid (pm:GetDefaultInputDeviceID )) +(pm:GetDeviceInfo inid) +(defparameter outid (pm:GetDefaultOutputDeviceID )) +(pm:GetDeviceInfo outid) +;; output testing +(defparameter outid 4) ; 4 = my SimpleSynth +(defparameter outdev (pm:OpenOutput outid 100 1000)) +(pm:getDeviceInfo outid) ; :OPEN should be T +;; message tests +(defun pm (m &optional (s t)) + (format s "#<message :op ~2,'0x :ch ~2,'0d :data1 ~3,'0d :data2 ~3,'0d>" + (ash (logand (pm:Message.status m) #xf0) -4) + (logand (pm:Message.status m) #x0f) + (pm:Message.data1 m) + (pm:Message.data2 m))) +(defparameter on (pm:message #b10010000 60 64)) +(terpri) +(pm on) +(pm:Message.status on) +(logand (ash (pm:Message.status on) -4) #x0f) +(pm:Message.data1 on) +(pm:Message.data2 on) +(pm:WriteShort outdev (+ (pm:time) 100) on) +(defparameter off (pm:message #b10000000 60 64)) +(terpri) +(pm off) +(terpri) +(println "type something for note off") +(read) +(pm:WriteShort outdev (+ (pm:time) 100) off) +(println "type something to close output device") +(read) +(pm:Close outdev) +;; event buffer testing +(defparameter buff (pm:EventBufferNew 8)) +(loop for i below 8 for x = (pm:EventBufferElt buff i) + ;; set buffer events + do + (pm:Event.message x (pm:message #b1001000 (+ 60 i) (+ 100 i))) + (pm:Event.timestamp x (* 1000 i))) +(loop for i below 8 for x = (pm:EventBufferElt buff i) + ;; check buffer contents + collect (list (pm:Event.timestamp x) + (pm:Message.data1 (pm:Event.message x)) + (pm:Message.data2 (pm:Event.message x)))) +(pm:EventBufferFree buff) +;; input testing -- requires external midi keyboard +(println (pm:GetDeviceInfo )) +(defparameter inid 1) ; 1 = my external keyboard +(defparameter indev (pm:OpenInput inid 256)) +(pm:GetDeviceInfo inid) ; :OPEN should be T +(pm:SetFilter indev pm:filt-realtime) ; ignore active sensing etc. +(println "poll says:") +(println (pm:Poll indev)) +(println "play midi keyboard and type something") +(read) +;; +;; ...play midi keyboard, then ... +;; +(println "poll says") +(println (pm:Poll indev)) +(defparameter buff (pm:EventBufferNew 32)) +(defparameter num (pm:Read indev buff 32)) +(println "pm:Read gets") +(println num) +(println "input messages:") +(pm:EventBufferMap (lambda (a b) b (terpri) (pm a)) + buff num) +(pm:Poll indev) + +(println "play keyboard, to stop, play middle-C") + +;;; recv testing + +(defparameter pitch 0) +(loop while (/= pitch 60) do + (let ((n (pm:Read indev buff 1))) + (cond ((= n 1) + (pm:EventBufferMap + (lambda (a b) + b (pm a) (terpri) + (setf pitch (pm:Message.data1 a))) + buff n))))) + +(pm:EventBufferFree buff) +(pm:Close indev) + + diff --git a/pd/portmidi/pm_common/CMakeLists.txt b/pd/portmidi/pm_common/CMakeLists.txt new file mode 100644 index 000000000..e1710474a --- /dev/null +++ b/pd/portmidi/pm_common/CMakeLists.txt @@ -0,0 +1,128 @@ +# pm_common + +# set the build directory for libportmidi.a to be in portmidi, not in +# portmidi/pm_common +if(APPLE OR WIN32) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + # set the build directory for .dylib libraries + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + + # the first time CMake configures, save off CMake's built-in flags + if(NOT DEFAULT_DEBUG_FLAGS) + set(DEFAULT_DEBUG_FLAGS ${CMAKE_C_FLAGS_DEBUG} CACHE + STRING "CMake's default debug flags" FORCE) + set(DEFAULT_RELEASE_FLAGS ${CMAKE_C_FLAGS_RELEASE} CACHE + STRING "CMake's default release flags" FORCE) + else(NOT DEFAULT_DEBUG_FLAGS) + message(STATUS "DEFAULT_DEBUG_FLAGS not nil: " ${DEFAULT_DEBUG_FLAGS}) + endif(NOT DEFAULT_DEBUG_FLAGS) +else(APPLE OR WIN32) + set(LINUX_FLAGS "-DPMALSA") +endif(APPLE OR WIN32) + +if(APPLE) + set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk CACHE + PATH "-isysroot parameter for compiler" FORCE) + set(CMAKE_C_FLAGS "-mmacosx-version-min=10.5" CACHE + STRING "needed in conjunction with CMAKE_OSX_SYSROOT" FORCE) +endif(APPLE) + +macro(prepend_path RESULT PATH) + set(${RESULT}) + foreach(FILE ${ARGN}) + list(APPEND ${RESULT} "${PATH}${FILE}") + endforeach(FILE) +endmacro(prepend_path) + +set(CMAKE_C_FLAGS_DEBUG + "${DEFAULT_DEBUG_FLAGS} -DPM_CHECK_ERRORS=1 -DDEBUG ${LINUX_FLAGS}" + CACHE STRING "enable extra checks for debugging" FORCE) + +set(CMAKE_C_FLAGS_RELEASE "${DEFAULT_RELEASE_FLAGS} ${LINUX_FLAGS}" + CACHE STRING "flags for release version" FORCE) + +# first include the appropriate system-dependent file: +if(UNIX) + # add the -g switch for Linux and Mac OS X (not used in Win32) + set (CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}" + CACHE STRING "enable extra checks for debugging" FORCE) + if(APPLE) + set(MACSRC pmmacosxcm pmmac readbinaryplist finddefault) + prepend_path(LIBSRC ../pm_mac/ ${MACSRC}) + list(APPEND LIBSRC ../porttime/ptmacosx_mach) + + include_directories(${CMAKE_OSX_SYSROOT}/Developer/Headers/FlatCarbon) + set(FRAMEWORK_PATH ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks) + set(COREAUDIO_LIB "${FRAMEWORK_PATH}/CoreAudio.framework") + set(COREFOUNDATION_LIB "${FRAMEWORK_PATH}/CoreFoundation.framework") + set(COREMIDI_LIB "${FRAMEWORK_PATH}/CoreMIDI.framework") + set(CORESERVICES_LIB "${FRAMEWORK_PATH}/CoreServices.framework") + set(PM_NEEDED_LIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB} + ${COREMIDI_LIB} ${CORESERVICES_LIB} + CACHE INTERNAL "") + + set(JAVAVM_LIB "${FRAMEWORK_PATH}/JavaVM.framework") + set(JAVA_INCLUDE_PATHS ${JAVAVM_LIB}/Headers) + message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT}) + else(APPLE) + # LINUX settings... + include(FindJNI) + message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH}) + message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH}) + message(STATUS "JAVA_INCLUDE_PATH2 is " ${JAVA_INCLUDE_PATH2}) + message(STATUS "JAVA_JVM_LIBRARY is " ${JAVA_JVM_LIBRARY}) + set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) + # libjvm.so is found relative to JAVA_INCLUDE_PATH: + set(JAVAVM_LIB ${JAVA_JVM_LIBRARY}/libjvm.so) + + set(LINUXSRC pmlinuxalsa pmlinux finddefault) + prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC}) + list(APPEND LIBSRC ../porttime/ptlinux) + + set(PM_NEEDED_LIBS pthread asound) + endif(APPLE) +else(UNIX) + if(WIN32) + # /MDd is multithread debug DLL, /MTd is multithread debug + # /MD is multithread DLL, /MT is multithread. Change to static: + include(../pm_win/static.cmake) + + include(FindJNI) + + set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) + # message(STATUS "JAVA_INCLUDE_PATHS: " ${JAVA_INCLUDE_PATHS}) + + set(WINSRC pmwin pmwinmm) + prepend_path(LIBSRC ../pm_win/ ${WINSRC}) + list(APPEND LIBSRC ../porttime/ptwinmm) + set(PM_NEEDED_LIBS winmm.lib) + endif(WIN32) +endif(UNIX) +set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVA_JVM_LIBRARY}) + +# this completes the list of library sources by adding shared code +list(APPEND LIBSRC pmutil portmidi) + +# now add the shared files to make the complete list of library sources +add_library(portmidi-static ${LIBSRC}) +set_target_properties(portmidi-static PROPERTIES OUTPUT_NAME "portmidi_s") +target_link_libraries(portmidi-static ${PM_NEEDED_LIBS}) + +# define the jni library +include_directories(${JAVA_INCLUDE_PATHS}) + +set(JNISRC ${LIBSRC} ../pm_java/pmjni/pmjni.c) +add_library(pmjni SHARED ${JNISRC}) +target_link_libraries(pmjni ${JNI_EXTRA_LIBS}) +set_target_properties(pmjni PROPERTIES EXECUTABLE_EXTENSION "jnilib") + +# install the libraries (Linux and Mac OS X command line) +if(UNIX) + INSTALL(TARGETS portmidi-static pmjni + LIBRARY DESTINATION /usr/local/lib + ARCHIVE DESTINATION /usr/local/lib) +# .h files installed by pm_dylib/CMakeLists.txt, so don't need them here +# INSTALL(FILES portmidi.h ../porttime/porttime.h +# DESTINATION /usr/local/include) +endif(UNIX) diff --git a/pd/portmidi/pm_common/pminternal.h b/pd/portmidi/pm_common/pminternal.h old mode 100644 new mode 100755 index b8c032325..f7c62705b --- a/pd/portmidi/pm_common/pminternal.h +++ b/pd/portmidi/pm_common/pminternal.h @@ -21,6 +21,8 @@ extern "C" { #endif +extern int pm_initialized; /* see note in portmidi.c */ + /* these are defined in system-specific file */ void *pm_alloc(size_t s); void pm_free(void *ptr); @@ -93,7 +95,7 @@ extern int pm_descriptor_max; extern descriptor_type descriptors; extern int pm_descriptor_index; -typedef unsigned long (*time_get_proc_type)(void *time_info); +typedef uint32_t (*time_get_proc_type)(void *time_info); typedef struct pm_internal_struct { int device_id; /* which device is open (index to descriptors) */ @@ -101,18 +103,10 @@ typedef struct pm_internal_struct { PmTimeProcPtr time_proc; /* where to get the time */ void *time_info; /* pass this to get_time() */ - long buffer_len; /* how big is the buffer or queue? */ -#ifdef NEWBUFFER + int32_t buffer_len; /* how big is the buffer or queue? */ PmQueue *queue; -#else - PmEvent *buffer; /* storage for: - - midi input - - midi output w/latency != 0 */ - long head; - long tail; - int overflow; /* set to non-zero if input is dropped */ -#endif - long latency; /* time delay in ms between timestamps and actual output */ + + int32_t latency; /* time delay in ms between timestamps and actual output */ /* set to zero to get immediate, simple blocking output */ /* if latency is zero, timestamps will be ignored; */ /* if midi input device, this field ignored */ @@ -128,8 +122,8 @@ typedef struct pm_internal_struct { PmMessage sysex_message; /* buffer for 4 bytes of sysex data */ int sysex_message_count; /* how many bytes in sysex_message so far */ - long filters; /* flags that filter incoming message classes */ - int channel_mask; /* flter incoming messages based on channel */ + int32_t filters; /* flags that filter incoming message classes */ + int32_t channel_mask; /* filter incoming messages based on channel */ PmTimestamp last_msg_time; /* timestamp of last message */ PmTimestamp sync_time; /* time of last synchronization */ PmTimestamp now; /* set by PmWrite to current time */ @@ -143,8 +137,8 @@ typedef struct pm_internal_struct { * important */ unsigned char *fill_base; /* addr of ptr to sysex data */ - int *fill_offset_ptr; /* offset of next sysex byte */ - int fill_length; /* how many sysex bytes to write */ + uint32_t *fill_offset_ptr; /* offset of next sysex byte */ + int32_t fill_length; /* how many sysex bytes to write */ } PmInternal; @@ -163,7 +157,7 @@ PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp); PmError pm_success_fn(PmInternal *midi); PmError pm_add_device(char *interf, char *name, int input, void *descriptor, pm_fns_type dictionary); -unsigned int pm_read_bytes(PmInternal *midi, unsigned char *data, int len, +uint32_t pm_read_bytes(PmInternal *midi, const unsigned char *data, int len, PmTimestamp timestamp); void pm_read_short(PmInternal *midi, PmEvent *event); @@ -176,6 +170,8 @@ void pm_read_short(PmInternal *midi, PmEvent *event); #define is_real_time(msg) \ ((Pm_MessageStatus(msg) & MIDI_REALTIME_MASK) == MIDI_REALTIME_MASK) +int pm_find_default_device(char *pattern, int is_input); + #ifdef __cplusplus } #endif diff --git a/pd/portmidi/pm_common/pmjni.vcproj b/pd/portmidi/pm_common/pmjni.vcproj new file mode 100644 index 000000000..5f3c663a7 --- /dev/null +++ b/pd/portmidi/pm_common/pmjni.vcproj @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="pmjni" + ProjectGUID="{87B548BD-F5CE-4D1F-9181-390966AC5855}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="pmjni.dir\Debug" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",pmjni_EXPORTS" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Debug/pmjni.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",pmjni_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",pmjni_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "C:\Program Files\Java\jdk1.6.0_16\include\..\lib\jvm.lib" " + OutputFile="..\Debug\pmjni.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="..\Debug\pmjni.pdb" + GenerateDebugInformation="TRUE" + ImportLibrary="..\Debug\pmjni.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="pmjni.dir\Release" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",pmjni_EXPORTS" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Release/pmjni.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",pmjni_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",pmjni_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib "C:\Program Files\Java\jdk1.6.0_16\include\..\lib\jvm.lib" " + OutputFile="..\Release\pmjni.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="..\Release\pmjni.pdb" + ImportLibrary="..\Release\pmjni.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_win\pmwin.c"> + </File> + <File + RelativePath="..\pm_win\pmwinmm.c"> + </File> + <File + RelativePath="..\porttime\ptwinmm.c"> + </File> + <File + RelativePath="..\pm_common\pmutil.c"> + </File> + <File + RelativePath="..\pm_common\portmidi.c"> + </File> + <File + RelativePath="..\pm_java\pmjni\pmjni.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_common/pmutil.c b/pd/portmidi/pm_common/pmutil.c old mode 100644 new mode 100755 index 42f386c1d..a70fe2fa1 --- a/pd/portmidi/pm_common/pmutil.c +++ b/pd/portmidi/pm_common/pmutil.c @@ -1,311 +1,284 @@ -/* pmutil.c -- some helpful utilities for building midi - applications that use PortMidi - */ -#include "stdlib.h" -#include "assert.h" -#include "memory.h" -#include "portmidi.h" -#include "pmutil.h" -#include "pminternal.h" - -#ifdef WIN32 -#define bzero(addr, siz) memset(addr, 0, siz) -#endif - -// #define QUEUE_DEBUG 1 -#ifdef QUEUE_DEBUG -#include "stdio.h" -#endif - -/* code is based on 4-byte words -- it should work on a 64-bit machine - as long as a "long" has 4 bytes. This code could be generalized to - be independent of the size of "long" */ - -typedef long int32; - -typedef struct { - long head; - long tail; - long len; - long msg_size; /* number of int32 in a message including extra word */ - long overflow; - long peek_overflow; - int32 *buffer; - int32 *peek; - int peek_flag; -} PmQueueRep; - - -PmQueue *Pm_QueueCreate(long num_msgs, long bytes_per_msg) -{ - PmQueueRep *queue = (PmQueueRep *) pm_alloc(sizeof(PmQueueRep)); - int int32s_per_msg = ((bytes_per_msg + sizeof(int32) - 1) & - ~(sizeof(int32) - 1)) / sizeof(int32); - /* arg checking */ - if (!queue) - return NULL; - - /* need extra word per message for non-zero encoding */ - queue->len = num_msgs * (int32s_per_msg + 1); - queue->buffer = (int32 *) pm_alloc(queue->len * sizeof(int32)); - bzero(queue->buffer, queue->len * sizeof(int32)); - if (!queue->buffer) { - pm_free(queue); - return NULL; - } else { /* allocate the "peek" buffer */ - queue->peek = (int32 *) pm_alloc(int32s_per_msg * sizeof(int32)); - if (!queue->peek) { - /* free everything allocated so far and return */ - pm_free(queue->buffer); - pm_free(queue); - return NULL; - } - } - bzero(queue->buffer, queue->len * sizeof(int32)); - queue->head = 0; - queue->tail = 0; - /* msg_size is in words */ - queue->msg_size = int32s_per_msg + 1; /* note extra word is counted */ - queue->overflow = FALSE; - queue->peek_overflow = FALSE; - queue->peek_flag = FALSE; - return queue; -} - - -PmError Pm_QueueDestroy(PmQueue *q) -{ - PmQueueRep *queue = (PmQueueRep *) q; - - /* arg checking */ - if (!queue || !queue->buffer || !queue->peek) - return pmBadPtr; - - pm_free(queue->peek); - pm_free(queue->buffer); - pm_free(queue); - return pmNoError; -} - - -PmError Pm_Dequeue(PmQueue *q, void *msg) -{ - long head; - PmQueueRep *queue = (PmQueueRep *) q; - int i; - int32 *msg_as_int32 = (int32 *) msg; - - /* arg checking */ - if (!queue) - return pmBadPtr; - /* a previous peek operation encountered an overflow, but the overflow - * has not yet been reported to client, so do it now. No message is - * returned, but on the next call, we will return the peek buffer. - */ - if (queue->peek_overflow) { - queue->peek_overflow = FALSE; - return pmBufferOverflow; - } - if (queue->peek_flag) { -#ifdef QUEUE_DEBUG - printf("Pm_Dequeue returns peek msg:"); - for (i = 0; i < queue->msg_size - 1; i++) { - printf(" %d", queue->peek[i]); - } - printf("\n"); -#endif - memcpy(msg, queue->peek, (queue->msg_size - 1) * sizeof(int32)); - queue->peek_flag = FALSE; - return 1; - } - - head = queue->head; - /* if writer overflows, it writes queue->overflow = tail+1 so that - * when the reader gets to that position in the buffer, it can - * return the overflow condition to the reader. The problem is that - * at overflow, things have wrapped around, so tail == head, and the - * reader will detect overflow immediately instead of waiting until - * it reads everything in the buffer, wrapping around again to the - * point where tail == head. So the condition also checks that - * queue->buffer[head] is zero -- if so, then the buffer is now - * empty, and we're at the point in the msg stream where overflow - * occurred. It's time to signal overflow to the reader. If - * queue->buffer[head] is non-zero, there's a message there and we - * should read all the way around the buffer before signalling overflow. - * There is a write-order dependency here, but to fail, the overflow - * field would have to be written while an entire buffer full of - * writes are still pending. I'm assuming out-of-order writes are - * possible, but not that many. - */ - if (queue->overflow == head + 1 && !queue->buffer[head]) { - queue->overflow = 0; /* non-overflow condition */ - return pmBufferOverflow; - } - - /* test to see if there is data in the queue -- test from back - * to front so if writer is simultaneously writing, we don't - * waste time discovering the write is not finished - */ - for (i = queue->msg_size - 1; i >= 0; i--) { - if (!queue->buffer[head + i]) { - return 0; - } - } -#ifdef QUEUE_DEBUG - printf("Pm_Dequeue:"); - for (i = 0; i < queue->msg_size; i++) { - printf(" %d", queue->buffer[head + i]); - } - printf("\n"); -#endif - memcpy(msg, (char *) &queue->buffer[head + 1], - sizeof(int32) * (queue->msg_size - 1)); - /* fix up zeros */ - i = queue->buffer[head]; - while (i < queue->msg_size) { - int32 j; - i--; /* msg does not have extra word so shift down */ - j = msg_as_int32[i]; - msg_as_int32[i] = 0; - i = j; - } - /* signal that data has been removed by zeroing: */ - bzero((char *) &queue->buffer[head], sizeof(int32) * queue->msg_size); - - /* update head */ - head += queue->msg_size; - if (head == queue->len) head = 0; - queue->head = head; - return 1; /* success */ -} - - - -PmError Pm_SetOverflow(PmQueue *q) -{ - PmQueueRep *queue = (PmQueueRep *) q; - long tail; - /* no more enqueue until receiver acknowledges overflow */ - if (queue->overflow) return pmBufferOverflow; - if (!queue) - return pmBadPtr; - tail = queue->tail; - queue->overflow = tail + 1; - return pmBufferOverflow; -} - - -PmError Pm_Enqueue(PmQueue *q, void *msg) -{ - PmQueueRep *queue = (PmQueueRep *) q; - long tail; - int i; - int32 *src = (int32 *) msg; - int32 *ptr; - - int32 *dest; - - int rslt; - /* no more enqueue until receiver acknowledges overflow */ - if (!queue) return pmBadPtr; - if (queue->overflow) return pmBufferOverflow; - rslt = Pm_QueueFull(q); - /* already checked above: if (rslt == pmBadPtr) return rslt; */ - tail = queue->tail; - if (rslt) { - queue->overflow = tail + 1; - return pmBufferOverflow; - } - - /* queue is has room for message, and overflow flag is cleared */ - ptr = &queue->buffer[tail]; - dest = ptr + 1; - for (i = 1; i < queue->msg_size; i++) { - int32 j = src[i - 1]; - if (!j) { - *ptr = i; - ptr = dest; - } else { - *dest = j; - } - dest++; - } - *ptr = i; -#ifdef QUEUE_DEBUG - printf("Pm_Enqueue:"); - for (i = 0; i < queue->msg_size; i++) { - printf(" %d", queue->buffer[tail + i]); - } - printf("\n"); -#endif - tail += queue->msg_size; - if (tail == queue->len) tail = 0; - queue->tail = tail; - return pmNoError; -} - - -int Pm_QueueEmpty(PmQueue *q) -{ - PmQueueRep *queue = (PmQueueRep *) q; - if (!queue) return TRUE; - return (queue->buffer[queue->head] == 0); -} - - -int Pm_QueueFull(PmQueue *q) -{ - PmQueueRep *queue = (PmQueueRep *) q; - int tail; - int i; - /* arg checking */ - if (!queue) - return pmBadPtr; - tail = queue->tail; - /* test to see if there is space in the queue */ - for (i = 0; i < queue->msg_size; i++) { - if (queue->buffer[tail + i]) { - return TRUE; - } - } - return FALSE; -} - -void *Pm_QueuePeek(PmQueue *q) -{ - PmQueueRep *queue = (PmQueueRep *) q; - PmError rslt; - long temp; - - /* arg checking */ - if (!queue) - return NULL; - - if (queue->peek_flag) { - return queue->peek; - } - /* this is ugly: if peek_overflow is set, then Pm_Dequeue() - * returns immediately with pmBufferOverflow, but here, we - * want Pm_Dequeue() to really check for data. If data is - * there, we can return it - */ - temp = queue->peek_overflow; - queue->peek_overflow = FALSE; - rslt = Pm_Dequeue(q, queue->peek); - queue->peek_overflow = temp; - - if (rslt == 1) { - queue->peek_flag = TRUE; - return queue->peek; - } else if (rslt == pmBufferOverflow) { - /* when overflow is indicated, the queue is empty and the - * first message that was dropped by Enqueue (signalling - * pmBufferOverflow to its caller) would have been the next - * message in the queue. Pm_QueuePeek will return NULL, but - * remember that an overflow occurred. (see Pm_Dequeue) - */ - queue->peek_overflow = TRUE; - } - return NULL; -} - +/* pmutil.c -- some helpful utilities for building midi + applications that use PortMidi + */ +#include <stdlib.h> +#include <assert.h> +#include <string.h> +#include "portmidi.h" +#include "pmutil.h" +#include "pminternal.h" + +#ifdef WIN32 +#define bzero(addr, siz) memset(addr, 0, siz) +#endif + +// #define QUEUE_DEBUG 1 +#ifdef QUEUE_DEBUG +#include "stdio.h" +#endif + +typedef struct { + long head; + long tail; + long len; + long overflow; + int32_t msg_size; /* number of int32_t in a message including extra word */ + int32_t peek_overflow; + int32_t *buffer; + int32_t *peek; + int32_t peek_flag; +} PmQueueRep; + + +PMEXPORT PmQueue *Pm_QueueCreate(long num_msgs, int32_t bytes_per_msg) +{ + int32_t int32s_per_msg = + (int32_t) (((bytes_per_msg + sizeof(int32_t) - 1) & + ~(sizeof(int32_t) - 1)) / sizeof(int32_t)); + PmQueueRep *queue = (PmQueueRep *) pm_alloc(sizeof(PmQueueRep)); + if (!queue) /* memory allocation failed */ + return NULL; + + /* need extra word per message for non-zero encoding */ + queue->len = num_msgs * (int32s_per_msg + 1); + queue->buffer = (int32_t *) pm_alloc(queue->len * sizeof(int32_t)); + bzero(queue->buffer, queue->len * sizeof(int32_t)); + if (!queue->buffer) { + pm_free(queue); + return NULL; + } else { /* allocate the "peek" buffer */ + queue->peek = (int32_t *) pm_alloc(int32s_per_msg * sizeof(int32_t)); + if (!queue->peek) { + /* free everything allocated so far and return */ + pm_free(queue->buffer); + pm_free(queue); + return NULL; + } + } + bzero(queue->buffer, queue->len * sizeof(int32_t)); + queue->head = 0; + queue->tail = 0; + /* msg_size is in words */ + queue->msg_size = int32s_per_msg + 1; /* note extra word is counted */ + queue->overflow = FALSE; + queue->peek_overflow = FALSE; + queue->peek_flag = FALSE; + return queue; +} + + +PMEXPORT PmError Pm_QueueDestroy(PmQueue *q) +{ + PmQueueRep *queue = (PmQueueRep *) q; + + /* arg checking */ + if (!queue || !queue->buffer || !queue->peek) + return pmBadPtr; + + pm_free(queue->peek); + pm_free(queue->buffer); + pm_free(queue); + return pmNoError; +} + + +PMEXPORT PmError Pm_Dequeue(PmQueue *q, void *msg) +{ + long head; + PmQueueRep *queue = (PmQueueRep *) q; + int i; + int32_t *msg_as_int32 = (int32_t *) msg; + + /* arg checking */ + if (!queue) + return pmBadPtr; + /* a previous peek operation encountered an overflow, but the overflow + * has not yet been reported to client, so do it now. No message is + * returned, but on the next call, we will return the peek buffer. + */ + if (queue->peek_overflow) { + queue->peek_overflow = FALSE; + return pmBufferOverflow; + } + if (queue->peek_flag) { + memcpy(msg, queue->peek, (queue->msg_size - 1) * sizeof(int32_t)); + queue->peek_flag = FALSE; + return pmGotData; + } + + head = queue->head; + /* if writer overflows, it writes queue->overflow = tail+1 so that + * when the reader gets to that position in the buffer, it can + * return the overflow condition to the reader. The problem is that + * at overflow, things have wrapped around, so tail == head, and the + * reader will detect overflow immediately instead of waiting until + * it reads everything in the buffer, wrapping around again to the + * point where tail == head. So the condition also checks that + * queue->buffer[head] is zero -- if so, then the buffer is now + * empty, and we're at the point in the msg stream where overflow + * occurred. It's time to signal overflow to the reader. If + * queue->buffer[head] is non-zero, there's a message there and we + * should read all the way around the buffer before signalling overflow. + * There is a write-order dependency here, but to fail, the overflow + * field would have to be written while an entire buffer full of + * writes are still pending. I'm assuming out-of-order writes are + * possible, but not that many. + */ + if (queue->overflow == head + 1 && !queue->buffer[head]) { + queue->overflow = 0; /* non-overflow condition */ + return pmBufferOverflow; + } + + /* test to see if there is data in the queue -- test from back + * to front so if writer is simultaneously writing, we don't + * waste time discovering the write is not finished + */ + for (i = queue->msg_size - 1; i >= 0; i--) { + if (!queue->buffer[head + i]) { + return pmNoData; + } + } + memcpy(msg, (char *) &queue->buffer[head + 1], + sizeof(int32_t) * (queue->msg_size - 1)); + /* fix up zeros */ + i = queue->buffer[head]; + while (i < queue->msg_size) { + int32_t j; + i--; /* msg does not have extra word so shift down */ + j = msg_as_int32[i]; + msg_as_int32[i] = 0; + i = j; + } + /* signal that data has been removed by zeroing: */ + bzero((char *) &queue->buffer[head], sizeof(int32_t) * queue->msg_size); + + /* update head */ + head += queue->msg_size; + if (head == queue->len) head = 0; + queue->head = head; + return pmGotData; /* success */ +} + + + +PMEXPORT PmError Pm_SetOverflow(PmQueue *q) +{ + PmQueueRep *queue = (PmQueueRep *) q; + long tail; + /* arg checking */ + if (!queue) + return pmBadPtr; + /* no more enqueue until receiver acknowledges overflow */ + if (queue->overflow) return pmBufferOverflow; + tail = queue->tail; + queue->overflow = tail + 1; + return pmBufferOverflow; +} + + +PMEXPORT PmError Pm_Enqueue(PmQueue *q, void *msg) +{ + PmQueueRep *queue = (PmQueueRep *) q; + long tail; + int i; + int32_t *src = (int32_t *) msg; + int32_t *ptr; + int32_t *dest; + int rslt; + if (!queue) + return pmBadPtr; + /* no more enqueue until receiver acknowledges overflow */ + if (queue->overflow) return pmBufferOverflow; + rslt = Pm_QueueFull(q); + /* already checked above: if (rslt == pmBadPtr) return rslt; */ + tail = queue->tail; + if (rslt) { + queue->overflow = tail + 1; + return pmBufferOverflow; + } + + /* queue is has room for message, and overflow flag is cleared */ + ptr = &queue->buffer[tail]; + dest = ptr + 1; + for (i = 1; i < queue->msg_size; i++) { + int32_t j = src[i - 1]; + if (!j) { + *ptr = i; + ptr = dest; + } else { + *dest = j; + } + dest++; + } + *ptr = i; + tail += queue->msg_size; + if (tail == queue->len) tail = 0; + queue->tail = tail; + return pmNoError; +} + + +PMEXPORT int Pm_QueueEmpty(PmQueue *q) +{ + PmQueueRep *queue = (PmQueueRep *) q; + return (!queue) || /* null pointer -> return "empty" */ + (queue->buffer[queue->head] == 0 && !queue->peek_flag); +} + + +PMEXPORT int Pm_QueueFull(PmQueue *q) +{ + long tail; + int i; + PmQueueRep *queue = (PmQueueRep *) q; + /* arg checking */ + if (!queue) + return pmBadPtr; + tail = queue->tail; + /* test to see if there is space in the queue */ + for (i = 0; i < queue->msg_size; i++) { + if (queue->buffer[tail + i]) { + return TRUE; + } + } + return FALSE; +} + + +PMEXPORT void *Pm_QueuePeek(PmQueue *q) +{ + PmError rslt; + int32_t temp; + PmQueueRep *queue = (PmQueueRep *) q; + /* arg checking */ + if (!queue) + return NULL; + + if (queue->peek_flag) { + return queue->peek; + } + /* this is ugly: if peek_overflow is set, then Pm_Dequeue() + * returns immediately with pmBufferOverflow, but here, we + * want Pm_Dequeue() to really check for data. If data is + * there, we can return it + */ + temp = queue->peek_overflow; + queue->peek_overflow = FALSE; + rslt = Pm_Dequeue(q, queue->peek); + queue->peek_overflow = temp; + + if (rslt == 1) { + queue->peek_flag = TRUE; + return queue->peek; + } else if (rslt == pmBufferOverflow) { + /* when overflow is indicated, the queue is empty and the + * first message that was dropped by Enqueue (signalling + * pmBufferOverflow to its caller) would have been the next + * message in the queue. Pm_QueuePeek will return NULL, but + * remember that an overflow occurred. (see Pm_Dequeue) + */ + queue->peek_overflow = TRUE; + } + return NULL; +} + diff --git a/pd/portmidi/pm_common/pmutil.h b/pd/portmidi/pm_common/pmutil.h old mode 100644 new mode 100755 index 8e4294670..40dabbff0 --- a/pd/portmidi/pm_common/pmutil.h +++ b/pd/portmidi/pm_common/pmutil.h @@ -44,8 +44,8 @@ typedef void PmQueue; Pm_QueueDestroy() destroys the queue and frees its storage. */ -PmQueue *Pm_QueueCreate(long num_msgs, long bytes_per_msg); -PmError Pm_QueueDestroy(PmQueue *queue); +PMEXPORT PmQueue *Pm_QueueCreate(long num_msgs, int32_t bytes_per_msg); +PMEXPORT PmError Pm_QueueDestroy(PmQueue *queue); /* Pm_Dequeue() removes one item from the queue, copying it into msg. @@ -56,7 +56,7 @@ PmError Pm_QueueDestroy(PmQueue *queue); overflow report. This protocol ensures that the reader will be notified when data is lost due to overflow. */ -PmError Pm_Dequeue(PmQueue *queue, void *msg); +PMEXPORT PmError Pm_Dequeue(PmQueue *queue, void *msg); /* @@ -64,7 +64,7 @@ PmError Pm_Dequeue(PmQueue *queue, void *msg); Returns pmNoError if successful and pmBufferOverflow if the queue was already full. If pmBufferOverflow is returned, the overflow flag is set. */ -PmError Pm_Enqueue(PmQueue *queue, void *msg); +PMEXPORT PmError Pm_Enqueue(PmQueue *queue, void *msg); /* @@ -78,9 +78,12 @@ PmError Pm_Enqueue(PmQueue *queue, void *msg); Pm_Dequeue() could still return 0 after Pm_QueueEmpty() returns false. On the other hand, Pm_QueueFull() is pessimistic: if it returns false, then Pm_Enqueue() is guaranteed to succeed. + + Error conditions: Pm_QueueFull() returns pmBadPtr if queue is NULL. + Pm_QueueEmpty() returns FALSE if queue is NULL. */ -int Pm_QueueFull(PmQueue *queue); -int Pm_QueueEmpty(PmQueue *queue); +PMEXPORT int Pm_QueueFull(PmQueue *queue); +PMEXPORT int Pm_QueueEmpty(PmQueue *queue); /* @@ -106,7 +109,7 @@ int Pm_QueueEmpty(PmQueue *queue); Note that Pm_QueuePeek() is not a fast check, so if possible, you might as well just call Pm_Dequeue() and accept the data if it is there. */ -void *Pm_QueuePeek(PmQueue *queue); +PMEXPORT void *Pm_QueuePeek(PmQueue *queue); /* Pm_SetOverflow() allows the writer (enqueuer) to signal an overflow @@ -117,7 +120,7 @@ void *Pm_QueuePeek(PmQueue *queue); is NULL, returns pmBufferOverflow if buffer is already in an overflow state, returns pmNoError if successfully set overflow state. */ -PmError Pm_SetOverflow(PmQueue *queue); +PMEXPORT PmError Pm_SetOverflow(PmQueue *queue); #ifdef __cplusplus } diff --git a/pd/portmidi/pm_common/portmidi-dynamic.vcproj b/pd/portmidi/pm_common/portmidi-dynamic.vcproj new file mode 100644 index 000000000..788c36963 --- /dev/null +++ b/pd/portmidi/pm_common/portmidi-dynamic.vcproj @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="portmidi-dynamic" + ProjectGUID="{7283FAD1-7415-4061-A19A-FF5C7BCE9306}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="portmidi-dynamic.dir\Debug" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="3" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="C:/Users/rbd/portmedia/portmidi/Debug/portmidi.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib " + OutputFile="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.pdb" + GenerateDebugInformation="TRUE" + ImportLibrary="C:\Users\rbd\portmedia\portmidi\Debug\portmidi.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="portmidi-dynamic.dir\Release" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="2" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="C:/Users/rbd/portmedia/portmidi/Release/portmidi.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="C:\Users\rbd\portmedia\portmidi\pm_common;C:\Users\rbd\portmedia\portmidi\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib " + OutputFile="C:\Users\rbd\portmedia\portmidi\Release\portmidi.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="C:\Users\rbd\portmedia\portmidi\Release\portmidi.pdb" + ImportLibrary="C:\Users\rbd\portmedia\portmidi\Release\portmidi.lib"/> + </Configuration> + </Configurations> + <Files> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="Building Custom Rule C:/Users/rbd/portmedia/portmidi/pm_common/CMakeLists.txt" + CommandLine=""C:\Program Files\CMake 2.6\bin\cmake.exe" -HC:/Users/rbd/portmedia/portmidi -BC:/Users/rbd/portmedia/portmidi --check-stamp-file CMakeFiles/generate.stamp" + AdditionalDependencies="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;"C:\Program Files\CMake 2.6\share\cmake-2.6\Modules\FindJNI.cmake";C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;" + Outputs="CMakeFiles\generate.stamp"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCustomBuildTool" + Description="Building Custom Rule C:/Users/rbd/portmedia/portmidi/pm_common/CMakeLists.txt" + CommandLine=""C:\Program Files\CMake 2.6\bin\cmake.exe" -HC:/Users/rbd/portmedia/portmidi -BC:/Users/rbd/portmedia/portmidi --check-stamp-file CMakeFiles/generate.stamp" + AdditionalDependencies="C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;"C:\Program Files\CMake 2.6\share\cmake-2.6\Modules\FindJNI.cmake";C:\Users\rbd\portmedia\portmidi\pm_common\CMakeLists.txt;" + Outputs="CMakeFiles\generate.stamp"/> + </FileConfiguration> + </File> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\pm_win\pmwin.c"> + </File> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\pm_win\pmwinmm.c"> + </File> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\porttime\ptwinmm.c"> + </File> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\pmutil.c"> + </File> + <File + RelativePath="C:\Users\rbd\portmedia\portmidi\pm_common\portmidi.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_common/portmidi-static.vcproj b/pd/portmidi/pm_common/portmidi-static.vcproj new file mode 100644 index 000000000..91918d56f --- /dev/null +++ b/pd/portmidi/pm_common/portmidi-static.vcproj @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="portmidi-static" + ProjectGUID="{2985D5DA-D91E-44E0-924B-E612B6AA33F6}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="portmidi-static.dir\Debug" + ConfigurationType="4" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Debug/portmidi_s.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLibrarianTool" + OutputFile="..\Debug\portmidi_s.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="portmidi-static.dir\Release" + ConfigurationType="4" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Release/portmidi_s.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;"C:\Program Files\Java\jdk1.6.0_16\include";"C:\Program Files\Java\jdk1.6.0_16\include\win32";" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLibrarianTool" + OutputFile="..\Release\portmidi_s.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_win\pmwin.c"> + </File> + <File + RelativePath="..\pm_win\pmwinmm.c"> + </File> + <File + RelativePath="..\porttime\ptwinmm.c"> + </File> + <File + RelativePath="..\pm_common\pmutil.c"> + </File> + <File + RelativePath="..\pm_common\portmidi.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_common/portmidi.c b/pd/portmidi/pm_common/portmidi.c old mode 100644 new mode 100755 index 71988e471..b7161700d --- a/pd/portmidi/pm_common/portmidi.c +++ b/pd/portmidi/pm_common/portmidi.c @@ -1,1184 +1,1137 @@ -#include "stdlib.h" -#include "string.h" -#include "portmidi.h" -#include "porttime.h" -#ifdef NEWBUFFER -#include "pmutil.h" -#endif -#include "pminternal.h" -#include <assert.h> - -#define MIDI_CLOCK 0xf8 -#define MIDI_ACTIVE 0xfe -#define MIDI_STATUS_MASK 0x80 -#define MIDI_SYSEX 0xf0 -#define MIDI_EOX 0xf7 -#define MIDI_START 0xFA -#define MIDI_STOP 0xFC -#define MIDI_CONTINUE 0xFB -#define MIDI_F9 0xF9 -#define MIDI_FD 0xFD -#define MIDI_RESET 0xFF -#define MIDI_NOTE_ON 0x90 -#define MIDI_NOTE_OFF 0x80 -#define MIDI_CHANNEL_AT 0xD0 -#define MIDI_POLY_AT 0xA0 -#define MIDI_PROGRAM 0xC0 -#define MIDI_CONTROL 0xB0 -#define MIDI_PITCHBEND 0xE0 -#define MIDI_MTC 0xF1 -#define MIDI_SONGPOS 0xF2 -#define MIDI_SONGSEL 0xF3 -#define MIDI_TUNE 0xF6 - -#define is_empty(midi) ((midi)->tail == (midi)->head) - -static int pm_initialized = FALSE; -int pm_hosterror; -char pm_hosterror_text[PM_HOST_ERROR_MSG_LEN]; - -#ifdef PM_CHECK_ERRORS - -#include <stdio.h> - -#define STRING_MAX 80 - -static void prompt_and_exit(void) -{ - char line[STRING_MAX]; - printf("type ENTER..."); - fgets(line, STRING_MAX, stdin); - /* this will clean up open ports: */ - exit(-1); -} - - -static PmError pm_errmsg(PmError err) -{ - if (err == pmHostError) { - /* it seems pointless to allocate memory and copy the string, - * so I will do the work of Pm_GetHostErrorText directly - */ - printf("PortMidi found host error...\n %s\n", pm_hosterror_text); - pm_hosterror = FALSE; - pm_hosterror_text[0] = 0; /* clear the message */ - prompt_and_exit(); - } else if (err < 0) { - printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err)); - prompt_and_exit(); - } - return err; -} -#else -#define pm_errmsg(err) err -#endif - -/* -==================================================================== -system implementation of portmidi interface -==================================================================== -*/ - -int pm_descriptor_max = 0; -int pm_descriptor_index = 0; -descriptor_type descriptors = NULL; - -/* pm_add_device -- describe interface/device pair to library - * - * This is called at intialization time, once for each - * interface (e.g. DirectSound) and device (e.g. SoundBlaster 1) - * The strings are retained but NOT COPIED, so do not destroy them! - * - * returns pmInvalidDeviceId if device memory is exceeded - * otherwise returns pmNoError - */ -PmError pm_add_device(char *interf, char *name, int input, - void *descriptor, pm_fns_type dictionary) { - if (pm_descriptor_index >= pm_descriptor_max) { - // expand descriptors - descriptor_type new_descriptors = - pm_alloc(sizeof(descriptor_node) * (pm_descriptor_max + 32)); - if (!new_descriptors) return pmInsufficientMemory; - if (descriptors) { - memcpy(new_descriptors, descriptors, - sizeof(descriptor_node) * pm_descriptor_max); - free(descriptors); - } - pm_descriptor_max += 32; - descriptors = new_descriptors; - } - descriptors[pm_descriptor_index].pub.interf = interf; - descriptors[pm_descriptor_index].pub.name = name; - descriptors[pm_descriptor_index].pub.input = input; - descriptors[pm_descriptor_index].pub.output = !input; - - /* default state: nothing to close (for automatic device closing) */ - descriptors[pm_descriptor_index].pub.opened = FALSE; - - /* ID number passed to win32 multimedia API open */ - descriptors[pm_descriptor_index].descriptor = descriptor; - - /* points to PmInternal, allows automatic device closing */ - descriptors[pm_descriptor_index].internalDescriptor = NULL; - - descriptors[pm_descriptor_index].dictionary = dictionary; - - pm_descriptor_index++; - - return pmNoError; -} - - -/* -==================================================================== -portmidi implementation -==================================================================== -*/ - -int Pm_CountDevices( void ) { - Pm_Initialize(); - /* no error checking -- Pm_Initialize() does not fail */ - return pm_descriptor_index; -} - - -const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ) { - Pm_Initialize(); /* no error check needed */ - if (id >= 0 && id < pm_descriptor_index) { - return &descriptors[id].pub; - } - return NULL; -} - -/* pm_success_fn -- "noop" function pointer */ -PmError pm_success_fn(PmInternal *midi) { - return pmNoError; -} - -/* none_write -- returns an error if called */ -PmError none_write_short(PmInternal *midi, PmEvent *buffer) { - return pmBadPtr; -} - -/* pm_fail_timestamp_fn -- placeholder for begin_sysex and flush */ -PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp) { - return pmBadPtr; -} - -PmError none_write_byte(PmInternal *midi, unsigned char byte, - PmTimestamp timestamp) { - return pmBadPtr; -} - -/* pm_fail_fn -- generic function, returns error if called */ -PmError pm_fail_fn(PmInternal *midi) { - return pmBadPtr; -} - -static PmError none_open(PmInternal *midi, void *driverInfo) { - return pmBadPtr; -} -static void none_get_host_error(PmInternal * midi, char * msg, unsigned int len) { - strcpy(msg, ""); -} -static unsigned int none_has_host_error(PmInternal * midi) { - return FALSE; -} -PmTimestamp none_synchronize(PmInternal *midi) { - return 0; -} - -#define none_abort pm_fail_fn -#define none_close pm_fail_fn - -pm_fns_node pm_none_dictionary = { - none_write_short, - none_sysex, - none_sysex, - none_write_byte, - none_write_short, - none_write_flush, - none_synchronize, - none_open, - none_abort, - none_close, - none_poll, - none_has_host_error, - none_get_host_error -}; - - -const char *Pm_GetErrorText( PmError errnum ) { - const char *msg; - - switch(errnum) - { - case pmNoError: - msg = ""; - break; - case pmHostError: - msg = "PortMidi: `Host error'"; - break; - case pmInvalidDeviceId: - msg = "PortMidi: `Invalid device ID'"; - break; - case pmInsufficientMemory: - msg = "PortMidi: `Insufficient memory'"; - break; - case pmBufferTooSmall: - msg = "PortMidi: `Buffer too small'"; - break; - case pmBadPtr: - msg = "PortMidi: `Bad pointer'"; - break; - case pmInternalError: - msg = "PortMidi: `Internal PortMidi Error'"; - break; - case pmBufferOverflow: - msg = "PortMidi: `Buffer overflow'"; - break; - case pmBadData: - msg = "PortMidi: `Invalid MIDI message Data'"; - break; - case pmBufferMaxSize: - msg = "PortMidi: `Buffer cannot be made larger'"; - break; - default: - msg = "PortMidi: `Illegal error number'"; - break; - } - return msg; -} - - -/* This can be called whenever you get a pmHostError return value. - * The error will always be in the global pm_hosterror_text. - */ -void Pm_GetHostErrorText(char * msg, unsigned int len) { - assert(msg); - assert(len > 0); - if (pm_hosterror) { - strncpy(msg, (char *) pm_hosterror_text, len); - pm_hosterror = FALSE; - pm_hosterror_text[0] = 0; /* clear the message; not necessary, but it - might help with debugging */ - msg[len - 1] = 0; /* make sure string is terminated */ - } else { - msg[0] = 0; /* no string to return */ - } -} - - -int Pm_HasHostError(PortMidiStream * stream) { - if (pm_hosterror) return TRUE; - if (stream) { - PmInternal * midi = (PmInternal *) stream; - pm_hosterror = (*midi->dictionary->has_host_error)(midi); - if (pm_hosterror) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - /* now error message is global */ - return TRUE; - } - } - return FALSE; -} - - -PmError Pm_Initialize( void ) { - if (!pm_initialized) { - pm_hosterror = FALSE; - pm_hosterror_text[0] = 0; /* the null string */ - pm_init(); - pm_initialized = TRUE; - } - return pmNoError; -} - - -PmError Pm_Terminate( void ) { - if (pm_initialized) { - pm_term(); - // if there are no devices, descriptors might still be NULL - if (descriptors != NULL) { - free(descriptors); - descriptors = NULL; - } - pm_descriptor_index = 0; - pm_descriptor_max = 0; - pm_initialized = FALSE; - } - return pmNoError; -} - - -/* Pm_Read -- read up to length longs from source into buffer */ -/* - * returns number of longs actually read, or error code - */ -PmError Pm_Read(PortMidiStream *stream, PmEvent *buffer, long length) { - PmInternal *midi = (PmInternal *) stream; - int n = 0; -#ifndef NEWBUFFER - long head; -#endif - PmError err = pmNoError; - pm_hosterror = FALSE; - /* arg checking */ - if(midi == NULL) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.input) - err = pmBadPtr; - /* First poll for data in the buffer... - * This either simply checks for data, or attempts first to fill the buffer - * with data from the MIDI hardware; this depends on the implementation. - * We could call Pm_Poll here, but that would redo a lot of redundant - * parameter checking, so I copied some code from Pm_Poll to here: */ - else err = (*(midi->dictionary->poll))(midi); - - if (err != pmNoError) { - if (err == pmHostError) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - pm_hosterror = TRUE; - } - return pm_errmsg(err); - } - -#ifdef NEWBUFFER - while (n < length) { - PmError err = Pm_Dequeue(midi->queue, buffer++); - if (err == pmBufferOverflow) { - /* ignore the data we have retreived so far */ - return pm_errmsg(pmBufferOverflow); - } else if (err == 0) { /* empty queue */ - break; - } - n++; - } -#else - head = midi->head; - while (head != midi->tail && n < length) { - PmEvent event = midi->buffer[head++]; - *buffer++ = event; - if (head == midi->buffer_len) head = 0; - n++; - } - midi->head = head; - if (midi->overflow) { - midi->head = midi->tail; - midi->overflow = FALSE; - return pm_errmsg(pmBufferOverflow); - } -#endif - return n; -} - -PmError Pm_Poll( PortMidiStream *stream ) -{ - PmInternal *midi = (PmInternal *) stream; - PmError err; -#ifdef NEWBUFFER - PmEvent *event; -#endif - - pm_hosterror = FALSE; - /* arg checking */ - if(midi == NULL) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.input) - err = pmBadPtr; - else - err = (*(midi->dictionary->poll))(midi); - - if (err != pmNoError) { - if (err == pmHostError) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - pm_hosterror = TRUE; - } - return pm_errmsg(err); - } - -#ifdef NEWBUFFER - event = (PmEvent *) Pm_QueuePeek(midi->queue); - return event != NULL; -#else - return midi->head != midi->tail; -#endif -} - - -/* this is called from Pm_Write and Pm_WriteSysEx to issue a - * call to the system-dependent end_sysex function and handle - * the error return - */ -static PmError pm_end_sysex(PmInternal *midi) -{ - PmError err = (*midi->dictionary->end_sysex)(midi, 0); - midi->sysex_in_progress = FALSE; - if (err == pmHostError) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - pm_hosterror = TRUE; - } - return err; -} - - -/* to facilitate correct error-handling, Pm_Write, Pm_WriteShort, and - Pm_WriteSysEx all operate a state machine that "outputs" calls to - write_short, begin_sysex, write_byte, end_sysex, and write_realtime */ - -PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, long length) -{ - PmInternal *midi = (PmInternal *) stream; - PmError err; - int i; - int bits; - - pm_hosterror = FALSE; - /* arg checking */ - if(midi == NULL) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - else if(!descriptors[midi->device_id].pub.output) - err = pmBadPtr; - else - err = pmNoError; - - if (err != pmNoError) goto pm_write_error; - - if (midi->latency == 0) { - midi->now = 0; - } else { - midi->now = (*(midi->time_proc))(midi->time_info); - if (midi->first_message || midi->sync_time + 100 /*ms*/ < midi->now) { - /* time to resync */ - midi->now = (*midi->dictionary->synchronize)(midi); - midi->first_message = FALSE; - } - } - /* error recovery: when a sysex is detected, we call - * dictionary->begin_sysex() followed by calls to - * dictionary->write_byte() and dictionary->write_realtime() - * until an end-of-sysex is detected, when we call - * dictionary->end_sysex(). After an error occurs, - * Pm_Write() continues to call functions. For example, - * it will continue to call write_byte() even after - * an error sending a sysex message, and end_sysex() will be - * called when an EOX or non-real-time status is found. - * When errors are detected, Pm_Write() returns immediately, - * so it is possible that this will drop data and leave - * sysex messages in a partially transmitted state. - */ - for (i = 0; i < length; i++) { - unsigned long msg = buffer[i].message; - bits = 0; - /* is this a sysex message? */ - if (Pm_MessageStatus(msg) == MIDI_SYSEX) { - if (midi->sysex_in_progress) { - /* error: previous sysex was not terminated by EOX */ - midi->sysex_in_progress = FALSE; - err = pmBadData; - goto pm_write_error; - } - midi->sysex_in_progress = TRUE; - if ((err = (*midi->dictionary->begin_sysex)(midi, - buffer[i].timestamp)) != pmNoError) - goto pm_write_error; - if ((err = (*midi->dictionary->write_byte)(midi, MIDI_SYSEX, - buffer[i].timestamp)) != pmNoError) - goto pm_write_error; - bits = 8; - /* fall through to continue sysex processing */ - } else if ((msg & MIDI_STATUS_MASK) && - (Pm_MessageStatus(msg) != MIDI_EOX)) { - /* a non-sysex message */ - if (midi->sysex_in_progress) { - /* this should be a realtime message */ - if (is_real_time(msg)) { - if ((err = (*midi->dictionary->write_realtime)(midi, - &(buffer[i]))) != pmNoError) - goto pm_write_error; - } else { - midi->sysex_in_progress = FALSE; - err = pmBadData; - /* ignore any error from this, because we already have one */ - /* pass 0 as timestamp -- it's ignored */ - (*midi->dictionary->end_sysex)(midi, 0); - goto pm_write_error; - } - } else { /* regular short midi message */ - if ((err = (*midi->dictionary->write_short)(midi, - &(buffer[i]))) != pmNoError) - goto pm_write_error; - continue; - } - } - if (midi->sysex_in_progress) { /* send sysex bytes until EOX */ - /* see if we can accelerate data transfer */ - if (bits == 0 && midi->fill_base && /* 4 bytes to copy */ - (*midi->fill_offset_ptr) + 4 <= midi->fill_length && - (msg & 0x80808080) == 0) { /* all data */ - /* copy 4 bytes from msg to fill_base + fill_offset */ - unsigned char *ptr = midi->fill_base + - *(midi->fill_offset_ptr); - ptr[0] = msg; ptr[1] = msg >> 8; - ptr[2] = msg >> 18; ptr[3] = msg >> 24; - (*midi->fill_offset_ptr) += 4; - continue; - } - /* no acceleration, so do byte-by-byte copying */ - while (bits < 32) { - unsigned char midi_byte = (unsigned char) (msg >> bits); - if ((err = (*midi->dictionary->write_byte)(midi, midi_byte, - buffer[i].timestamp)) != pmNoError) - goto pm_write_error; - if (midi_byte == MIDI_EOX) { - err = pm_end_sysex(midi); - if (err != pmNoError) goto error_exit; - break; /* from while loop */ - } - bits += 8; - } - } else { - /* not in sysex mode, but message did not start with status */ - err = pmBadData; - goto pm_write_error; - } - } - /* after all messages are processed, send the data */ - if (!midi->sysex_in_progress) - err = (*midi->dictionary->write_flush)(midi, 0); -pm_write_error: - if (err == pmHostError) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - pm_hosterror = TRUE; - } -error_exit: - return pm_errmsg(err); -} - - -PmError Pm_WriteShort( PortMidiStream *stream, long when, long msg) -{ - PmEvent event; - - event.timestamp = when; - event.message = msg; - return Pm_Write(stream, &event, 1); -} - - -PmError Pm_WriteSysEx(PortMidiStream *stream, PmTimestamp when, - unsigned char *msg) -{ - /* allocate buffer space for PM_DEFAULT_SYSEX_BUFFER_SIZE bytes */ - /* each PmEvent holds sizeof(PmMessage) bytes of sysex data */ -#define BUFLEN (PM_DEFAULT_SYSEX_BUFFER_SIZE / sizeof(PmMessage)) - PmEvent buffer[BUFLEN]; - int buffer_size = 1; /* first time, send 1. After that, it's BUFLEN */ - PmInternal *midi = (PmInternal *) stream; - /* the next byte in the buffer is represented by an index, bufx, and - a shift in bits */ - int shift = 0; - int bufx = 0; - buffer[0].message = 0; - buffer[0].timestamp = when; - - while (1) { - /* insert next byte into buffer */ - buffer[bufx].message |= ((*msg) << shift); - shift += 8; - if (*msg++ == MIDI_EOX) break; - if (shift == 32) { - shift = 0; - bufx++; - if (bufx == buffer_size) { - PmError err = Pm_Write(stream, buffer, buffer_size); - /* note: Pm_Write has already called errmsg() */ - if (err) return err; - /* prepare to fill another buffer */ - bufx = 0; - buffer_size = BUFLEN; - /* optimization: maybe we can just copy bytes */ - if (midi->fill_base) { - PmError err; - while (*(midi->fill_offset_ptr) < midi->fill_length) { - midi->fill_base[(*midi->fill_offset_ptr)++] = *msg; - if (*msg++ == MIDI_EOX) { - err = pm_end_sysex(midi); - if (err != pmNoError) return pm_errmsg(err); - goto end_of_sysex; - } - } - /* I thought that I could do a pm_Write here and - * change this if to a loop, avoiding calls in Pm_Write - * to the slower write_byte, but since - * sysex_in_progress is true, this will not flush - * the buffer, and we'll infinite loop: */ - /* err = Pm_Write(stream, buffer, 0); - if (err) return err; */ - /* instead, the way this works is that Pm_Write calls - * write_byte on 4 bytes. The first, since the buffer - * is full, will flush the buffer and allocate a new - * one. This primes the buffer so - * that we can return to the loop above and fill it - * efficiently without a lot of function calls. - */ - buffer_size = 1; /* get another message started */ - } - } - buffer[bufx].message = 0; - buffer[bufx].timestamp = when; - } - /* keep inserting bytes until you find MIDI_EOX */ - } -end_of_sysex: - /* we're finished sending full buffers, but there may - * be a partial one left. - */ - if (shift != 0) bufx++; /* add partial message to buffer len */ - if (bufx) { /* bufx is number of PmEvents to send from buffer */ - PmError err = Pm_Write(stream, buffer, bufx); - if (err) return err; - } - return pmNoError; -} - - - -PmError Pm_OpenInput(PortMidiStream** stream, - PmDeviceID inputDevice, - void *inputDriverInfo, - long bufferSize, - PmTimeProcPtr time_proc, - void *time_info) { - PmInternal *midi; - PmError err = pmNoError; - pm_hosterror = FALSE; - *stream = NULL; - - /* arg checking */ - if (inputDevice < 0 || inputDevice >= pm_descriptor_index) - err = pmInvalidDeviceId; - else if (!descriptors[inputDevice].pub.input) - err = pmBadPtr; - else if(descriptors[inputDevice].pub.opened) - err = pmBadPtr; - - if (err != pmNoError) - goto error_return; - - /* create portMidi internal data */ - midi = (PmInternal *) pm_alloc(sizeof(PmInternal)); - *stream = midi; - if (!midi) { - err = pmInsufficientMemory; - goto error_return; - } - midi->device_id = inputDevice; - midi->write_flag = FALSE; - midi->time_proc = time_proc; - midi->time_info = time_info; - /* windows adds timestamps in the driver and these are more accurate than - using a time_proc, so do not automatically provide a time proc. Non-win - implementations may want to provide a default time_proc in their - system-specific midi_out_open() method. - */ - if (bufferSize <= 0) bufferSize = 256; /* default buffer size */ -#ifdef NEWBUFFER - midi->queue = Pm_QueueCreate(bufferSize, sizeof(PmEvent)); - if (!midi->queue) { -#else - else bufferSize++; /* buffer holds N-1 msgs, so increase request by 1 */ - midi->buffer = (PmEvent *) pm_alloc(sizeof(PmEvent) * midi->buffer_len); - midi->head = 0; - midi->tail = 0; - midi->overflow = FALSE; - if (!midi->buffer) { -#endif - /* free portMidi data */ - *stream = NULL; - pm_free(midi); - err = pmInsufficientMemory; - goto error_return; - } - midi->buffer_len = bufferSize; /* portMidi input storage */ - midi->latency = 0; /* not used */ - midi->sysex_in_progress = FALSE; - midi->sysex_message = 0; - midi->sysex_message_count = 0; - midi->filters = PM_FILT_ACTIVE; - midi->channel_mask = 0xFFFF; - midi->sync_time = 0; - midi->first_message = TRUE; - midi->dictionary = descriptors[inputDevice].dictionary; - midi->fill_base = NULL; - midi->fill_offset_ptr = NULL; - midi->fill_length = 0; - descriptors[inputDevice].internalDescriptor = midi; - /* open system dependent input device */ - err = (*midi->dictionary->open)(midi, inputDriverInfo); - if (err) { - *stream = NULL; - descriptors[inputDevice].internalDescriptor = NULL; - /* free portMidi data */ -#ifdef NEWBUFFER - Pm_QueueDestroy(midi->queue); -#else - pm_free(midi->buffer); -#endif - pm_free(midi); - } else { - /* portMidi input open successful */ - descriptors[inputDevice].pub.opened = TRUE; - } -error_return: - /* note: if there is a pmHostError, it is the responsibility - * of the system-dependent code (*midi->dictionary->open)() - * to set pm_hosterror and pm_hosterror_text - */ - return pm_errmsg(err); -} - - -PmError Pm_OpenOutput(PortMidiStream** stream, - PmDeviceID outputDevice, - void *outputDriverInfo, - long bufferSize, - PmTimeProcPtr time_proc, - void *time_info, - long latency ) { - PmInternal *midi; - PmError err = pmNoError; - pm_hosterror = FALSE; - *stream = NULL; - - /* arg checking */ - if (outputDevice < 0 || outputDevice >= pm_descriptor_index) - err = pmInvalidDeviceId; - else if (!descriptors[outputDevice].pub.output) - err = pmInvalidDeviceId; - else if (descriptors[outputDevice].pub.opened) - err = pmInvalidDeviceId; - if (err != pmNoError) - goto error_return; - - /* create portMidi internal data */ - midi = (PmInternal *) pm_alloc(sizeof(PmInternal)); - *stream = midi; - if (!midi) { - err = pmInsufficientMemory; - goto error_return; - } - midi->device_id = outputDevice; - midi->write_flag = TRUE; - midi->time_proc = time_proc; - /* if latency > 0, we need a time reference. If none is provided, - use PortTime library */ - if (time_proc == NULL && latency != 0) { - if (!Pt_Started()) - Pt_Start(1, 0, 0); - /* time_get does not take a parameter, so coerce */ - midi->time_proc = (PmTimeProcPtr) Pt_Time; - } - midi->time_info = time_info; - midi->buffer_len = bufferSize; -#ifdef NEWBUFFER - midi->queue = NULL; /* unused by output */ -#else - midi->buffer = NULL; - midi->head = 0; /* unused by output */ - midi->tail = 0; /* unused by output */ - midi->overflow = FALSE; /* not used */ -#endif - /* if latency zero, output immediate (timestamps ignored) */ - /* if latency < 0, use 0 but don't return an error */ - if (latency < 0) latency = 0; - midi->latency = latency; - midi->sysex_in_progress = FALSE; - midi->sysex_message = 0; /* unused by output */ - midi->sysex_message_count = 0; /* unused by output */ - midi->filters = 0; /* not used for output */ - midi->channel_mask = 0xFFFF; - midi->sync_time = 0; - midi->first_message = TRUE; - midi->dictionary = descriptors[outputDevice].dictionary; - midi->fill_base = NULL; - midi->fill_offset_ptr = NULL; - midi->fill_length = 0; - descriptors[outputDevice].internalDescriptor = midi; - /* open system dependent output device */ - err = (*midi->dictionary->open)(midi, outputDriverInfo); - if (err) { - *stream = NULL; - descriptors[outputDevice].internalDescriptor = NULL; - /* free portMidi data */ - pm_free(midi); - } else { - /* portMidi input open successful */ - descriptors[outputDevice].pub.opened = TRUE; - } -error_return: - /* note: system-dependent code must set pm_hosterror and - * pm_hosterror_text if a pmHostError occurs - */ - return pm_errmsg(err); -} - - -PmError Pm_SetChannelMask(PortMidiStream *stream, int mask) -{ - PmInternal *midi = (PmInternal *) stream; - PmError err = pmNoError; - - if (midi == NULL) - err = pmBadPtr; - else - midi->channel_mask = mask; - - return pm_errmsg(err); -} - - -PmError Pm_SetFilter(PortMidiStream *stream, long filters) { - PmInternal *midi = (PmInternal *) stream; - PmError err = pmNoError; - - /* arg checking */ - if (midi == NULL) - err = pmBadPtr; - else if (!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - else - midi->filters = filters; - return pm_errmsg(err); -} - - -PmError Pm_Close( PortMidiStream *stream ) { - PmInternal *midi = (PmInternal *) stream; - PmError err = pmNoError; - - pm_hosterror = FALSE; - /* arg checking */ - if (midi == NULL) /* midi must point to something */ - err = pmBadPtr; - /* if it is an open device, the device_id will be valid */ - else if (midi->device_id < 0 || midi->device_id >= pm_descriptor_index) - err = pmBadPtr; - /* and the device should be in the opened state */ - else if (!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - - if (err != pmNoError) - goto error_return; - - /* close the device */ - err = (*midi->dictionary->close)(midi); - /* even if an error occurred, continue with cleanup */ - descriptors[midi->device_id].internalDescriptor = NULL; - descriptors[midi->device_id].pub.opened = FALSE; -#ifdef NEWBUFFER - if (midi->queue) Pm_QueueDestroy(midi->queue); -#else - if (midi->buffer) pm_free(midi->buffer); -#endif - pm_free(midi); -error_return: - /* system dependent code must set pm_hosterror and - * pm_hosterror_text if a pmHostError occurs. - */ - return pm_errmsg(err); -} - - -PmError Pm_Abort( PortMidiStream* stream ) { - PmInternal *midi = (PmInternal *) stream; - PmError err; - /* arg checking */ - if (midi == NULL) - err = pmBadPtr; - if (!descriptors[midi->device_id].pub.output) - err = pmBadPtr; - if (!descriptors[midi->device_id].pub.opened) - err = pmBadPtr; - else - err = (*midi->dictionary->abort)(midi); - - if (err == pmHostError) { - midi->dictionary->host_error(midi, pm_hosterror_text, - PM_HOST_ERROR_MSG_LEN); - pm_hosterror = TRUE; - } - return pm_errmsg(err); -} - -#ifndef NEWBUFFER -/* this is apparently an orphan routine -- I can find no reference to it now -RBD */ - -/* in win32 multimedia API (via callbacks) some of these functions used; assume never fail */ -long pm_next_time(PmInternal *midi) { - - /* arg checking */ - assert(midi != NULL); - - return midi->buffer[midi->head].timestamp; -} -#endif - - -/* pm_channel_filtered returns non-zero if the channel mask is blocking the current channel */ -#define pm_channel_filtered(status, mask) \ - ((((status) & 0xF0) != 0xF0) && (!(Pm_Channel((status) & 0x0F) & (mask)))) - - -/* The following two functions will checks to see if a MIDI message matches - the filtering criteria. Since the sysex routines only want to filter realtime messages, - we need to have separate routines. - */ - - -/* pm_realtime_filtered returns non-zero if the filter will kill the current message. - Note that only realtime messages are checked here. - */ -#define pm_realtime_filtered(status, filters) \ - ((((status) & 0xF0) == 0xF0) && ((1 << ((status) & 0xF)) & (filters))) - -/* - return ((status == MIDI_ACTIVE) && (filters & PM_FILT_ACTIVE)) - || ((status == MIDI_CLOCK) && (filters & PM_FILT_CLOCK)) - || ((status == MIDI_START) && (filters & PM_FILT_PLAY)) - || ((status == MIDI_STOP) && (filters & PM_FILT_PLAY)) - || ((status == MIDI_CONTINUE) && (filters & PM_FILT_PLAY)) - || ((status == MIDI_F9) && (filters & PM_FILT_F9)) - || ((status == MIDI_FD) && (filters & PM_FILT_FD)) - || ((status == MIDI_RESET) && (filters & PM_FILT_RESET)) - || ((status == MIDI_MTC) && (filters & PM_FILT_MTC)) - || ((status == MIDI_SONGPOS) && (filters & PM_FILT_SONG_POSITION)) - || ((status == MIDI_SONGSEL) && (filters & PM_FILT_SONG_SELECT)) - || ((status == MIDI_TUNE) && (filters & PM_FILT_TUNE)); -}*/ - - -/* pm_status_filtered returns non-zero if a filter will kill the current message, based on status. - Note that sysex and real time are not checked. It is up to the subsystem (winmm, core midi, alsa) - to filter sysex, as it is handled more easily and efficiently at that level. - Realtime message are filtered in pm_realtime_filtered. - */ -#define pm_status_filtered(status, filters) ((1 << (16 + ((status) >> 4))) & (filters)) - - -/* - return ((status == MIDI_NOTE_ON) && (filters & PM_FILT_NOTE)) - || ((status == MIDI_NOTE_OFF) && (filters & PM_FILT_NOTE)) - || ((status == MIDI_CHANNEL_AT) && (filters & PM_FILT_CHANNEL_AFTERTOUCH)) - || ((status == MIDI_POLY_AT) && (filters & PM_FILT_POLY_AFTERTOUCH)) - || ((status == MIDI_PROGRAM) && (filters & PM_FILT_PROGRAM)) - || ((status == MIDI_CONTROL) && (filters & PM_FILT_CONTROL)) - || ((status == MIDI_PITCHBEND) && (filters & PM_FILT_PITCHBEND)); - -} -*/ - -void pm_flush_sysex(PmInternal *midi, PmTimestamp timestamp) -{ - PmEvent event; - - /* there may be nothing in the buffer */ - if (midi->sysex_message_count == 0) return; /* nothing to flush */ - - event.message = midi->sysex_message; - event.timestamp = timestamp; - /* copied from pm_read_short, avoids filtering */ - if (Pm_Enqueue(midi->queue, &event) == pmBufferOverflow) { - midi->sysex_in_progress = FALSE; - } - midi->sysex_message_count = 0; - midi->sysex_message = 0; -} - - -/* pm_read_short and pm_read_bytes - are the interface between system-dependent MIDI input handlers - and the system-independent PortMIDI code. - The input handler MUST obey these rules: - 1) all short input messages must be sent to pm_read_short, which - enqueues them to a FIFO for the application. - 2) eash buffer of sysex bytes should be reported by calling pm_read_bytes - (which sets midi->sysex_in_progress). After the eox byte, - pm_read_bytes will clear sysex_in_progress - */ - -/* pm_read_short is the place where all input messages arrive from - system-dependent code such as pmwinmm.c. Here, the messages - are entered into the PortMidi input buffer. - */ -void pm_read_short(PmInternal *midi, PmEvent *event) -{ -#ifndef NEWBUFFER - long tail; -#endif - int status; - /* arg checking */ - assert(midi != NULL); - /* midi filtering is applied here */ - status = Pm_MessageStatus(event->message); - if (!pm_status_filtered(status, midi->filters) - && (!is_real_time(status) || - !pm_realtime_filtered(status, midi->filters)) - && !pm_channel_filtered(status, midi->channel_mask)) { - /* if sysex is in progress and we get a status byte, it had - better be a realtime message or the starting SYSEX byte; - otherwise, we exit the sysex_in_progress state - */ - if (midi->sysex_in_progress && (status & MIDI_STATUS_MASK)) { - /* two choices: real-time or not. If it's real-time, then - * this should be delivered as a sysex byte because it is - * embedded in a sysex message - */ - if (is_real_time(status)) { - midi->sysex_message |= - (status << (8 * midi->sysex_message_count++)); - if (midi->sysex_message_count == 4) { - pm_flush_sysex(midi, event->timestamp); - } - } else { /* otherwise, it's not real-time. This interrupts - * a sysex message in progress */ - midi->sysex_in_progress = FALSE; - } -#ifdef NEWBUFFER - } else if (Pm_Enqueue(midi->queue, event) == pmBufferOverflow) { - midi->sysex_in_progress = FALSE; - } -#else - } else { - /* don't try to do anything more in an overflow state */ - if (midi->overflow) return; - - /* insert the message */ - tail = midi->tail; - midi->buffer[tail++] = *event; - if (tail == midi->buffer_len) tail = 0; - if (tail == midi->head || midi->overflow) { - midi->overflow = TRUE; - midi->sysex_in_progress = FALSE; - /* drop the rest of the message, this must be cleared - by caller when EOX is received */ - return; - } - midi->tail = tail; /* complete the write */ - } -#endif - } -} - -/* pm_read_bytes -- read one (partial) sysex msg from MIDI data */ -/* - * returns how many bytes processed - */ -unsigned int pm_read_bytes(PmInternal *midi, unsigned char *data, - int len, PmTimestamp timestamp) -{ - unsigned int i = 0; /* index into data */ - PmEvent event; - event.timestamp = timestamp; - assert(midi); - /* note that since buffers may not have multiples of 4 bytes, - * pm_read_bytes may be called in the middle of an outgoing - * 4-byte PortMidi message. sysex_in_progress indicates that - * a sysex has been sent but no eox. - */ - if (len == 0) return 0; /* sanity check */ - if (!midi->sysex_in_progress) { - while (i < len) { /* process all data */ - unsigned char byte = data[i++]; - if (byte == MIDI_SYSEX && - !pm_realtime_filtered(byte, midi->filters)) { - midi->sysex_in_progress = TRUE; - i--; /* back up so code below will get SYSEX byte */ - break; /* continue looping below to process msg */ - } else if (byte == MIDI_EOX) { - midi->sysex_in_progress = FALSE; - return i; /* done with one message */ - } else if (byte & MIDI_STATUS_MASK) { - /* We're getting MIDI but no sysex in progress. - * Either the SYSEX status byte was dropped or - * the message was filtered. Drop the data, but - * send any embedded realtime bytes. - */ - /* assume that this is a real-time message: - * it is an error to pass non-real-time messages - * to pm_read_bytes - */ - event.message = byte; - pm_read_short(midi, &event); - } - } /* all bytes in the buffer are processed */ - } - /* Now, i<len implies sysex_in_progress. If sysex_in_progress - * becomes false in the loop, there must have been an overflow - * and we can just drop all remaining bytes - */ - while (i < len && midi->sysex_in_progress) { - if (midi->sysex_message_count == 0 && i <= len - 4 && - ((event.message = (((long) data[i]) | - (((long) data[i+1]) << 8) | - (((long) data[i+2]) << 16) | - (((long) data[i+3]) << 24))) & - 0x80808080) == 0) { /* all data, no status */ - if (Pm_Enqueue(midi->queue, &event) == pmBufferOverflow) { - midi->sysex_in_progress = FALSE; - } - i += 4; - } else { - while (i < len) { - /* send one byte at a time */ - unsigned char byte = data[i++]; - if (is_real_time(byte) && - pm_realtime_filtered(byte, midi->filters)) { - continue; /* real-time data is filtered, so omit */ - } - midi->sysex_message |= - (byte << (8 * midi->sysex_message_count++)); - if (byte == MIDI_EOX) { - midi->sysex_in_progress = FALSE; - pm_flush_sysex(midi, event.timestamp); - return i; - } else if (midi->sysex_message_count == 4) { - pm_flush_sysex(midi, event.timestamp); - /* after handling at least one non-data byte - * and reaching a 4-byte message boundary, - * resume trying to send 4 at a time in outer loop - */ - break; - } - } - } - } - return i; -} - - -#ifndef NEWBUFFER -/* this code is apparently never called */ -int pm_queue_full(PmInternal *midi) -{ - long tail; - - /* arg checking */ - assert(midi != NULL); - - tail = midi->tail + 1; - if (tail == midi->buffer_len) tail = 0; - return tail == midi->head; -} -#endif +#ifdef _MSC_VER + #pragma warning(disable: 4244) // stop warnings about downsize typecasts + #pragma warning(disable: 4018) // stop warnings about signed/unsigned +#endif + +#include "stdlib.h" +#include "string.h" +#include "portmidi.h" +#include "porttime.h" +#include "pmutil.h" +#include "pminternal.h" +#include <assert.h> + +#define MIDI_CLOCK 0xf8 +#define MIDI_ACTIVE 0xfe +#define MIDI_STATUS_MASK 0x80 +#define MIDI_SYSEX 0xf0 +#define MIDI_EOX 0xf7 +#define MIDI_START 0xFA +#define MIDI_STOP 0xFC +#define MIDI_CONTINUE 0xFB +#define MIDI_F9 0xF9 +#define MIDI_FD 0xFD +#define MIDI_RESET 0xFF +#define MIDI_NOTE_ON 0x90 +#define MIDI_NOTE_OFF 0x80 +#define MIDI_CHANNEL_AT 0xD0 +#define MIDI_POLY_AT 0xA0 +#define MIDI_PROGRAM 0xC0 +#define MIDI_CONTROL 0xB0 +#define MIDI_PITCHBEND 0xE0 +#define MIDI_MTC 0xF1 +#define MIDI_SONGPOS 0xF2 +#define MIDI_SONGSEL 0xF3 +#define MIDI_TUNE 0xF6 + +#define is_empty(midi) ((midi)->tail == (midi)->head) + +/* this is not static so that pm_init can set it directly if + * (see pmmac.c:pm_init()) + */ +int pm_initialized = FALSE; + +int pm_hosterror; +char pm_hosterror_text[PM_HOST_ERROR_MSG_LEN]; + +#ifdef PM_CHECK_ERRORS + +#include <stdio.h> + +#define STRING_MAX 80 + +static void prompt_and_exit(void) +{ + char line[STRING_MAX]; + printf("type ENTER..."); + fgets(line, STRING_MAX, stdin); + /* this will clean up open ports: */ + exit(-1); +} + + +static PmError pm_errmsg(PmError err) +{ + if (err == pmHostError) { + /* it seems pointless to allocate memory and copy the string, + * so I will do the work of Pm_GetHostErrorText directly + */ + printf("PortMidi found host error...\n %s\n", pm_hosterror_text); + pm_hosterror = FALSE; + pm_hosterror_text[0] = 0; /* clear the message */ + prompt_and_exit(); + } else if (err < 0) { + printf("PortMidi call failed...\n %s\n", Pm_GetErrorText(err)); + prompt_and_exit(); + } + return err; +} +#else +#define pm_errmsg(err) err +#endif + +/* +==================================================================== +system implementation of portmidi interface +==================================================================== +*/ + +int pm_descriptor_max = 0; +int pm_descriptor_index = 0; +descriptor_type descriptors = NULL; + +/* pm_add_device -- describe interface/device pair to library + * + * This is called at intialization time, once for each + * interface (e.g. DirectSound) and device (e.g. SoundBlaster 1) + * The strings are retained but NOT COPIED, so do not destroy them! + * + * returns pmInvalidDeviceId if device memory is exceeded + * otherwise returns pmNoError + */ +PmError pm_add_device(char *interf, char *name, int input, + void *descriptor, pm_fns_type dictionary) { + if (pm_descriptor_index >= pm_descriptor_max) { + // expand descriptors + descriptor_type new_descriptors = (descriptor_type) + pm_alloc(sizeof(descriptor_node) * (pm_descriptor_max + 32)); + if (!new_descriptors) return pmInsufficientMemory; + if (descriptors) { + memcpy(new_descriptors, descriptors, + sizeof(descriptor_node) * pm_descriptor_max); + free(descriptors); + } + pm_descriptor_max += 32; + descriptors = new_descriptors; + } + descriptors[pm_descriptor_index].pub.interf = interf; + descriptors[pm_descriptor_index].pub.name = name; + descriptors[pm_descriptor_index].pub.input = input; + descriptors[pm_descriptor_index].pub.output = !input; + + /* default state: nothing to close (for automatic device closing) */ + descriptors[pm_descriptor_index].pub.opened = FALSE; + + /* ID number passed to win32 multimedia API open */ + descriptors[pm_descriptor_index].descriptor = descriptor; + + /* points to PmInternal, allows automatic device closing */ + descriptors[pm_descriptor_index].internalDescriptor = NULL; + + descriptors[pm_descriptor_index].dictionary = dictionary; + + pm_descriptor_index++; + + return pmNoError; +} + + +/* utility to look up device, given a pattern, + note: pattern is modified + */ +int pm_find_default_device(char *pattern, int is_input) +{ + int id = pmNoDevice; + int i; + /* first parse pattern into name, interf parts */ + char *interf_pref = ""; /* initially assume it is not there */ + char *name_pref = strstr(pattern, ", "); + + if (name_pref) { /* found separator, adjust the pointer */ + interf_pref = pattern; + name_pref[0] = 0; + name_pref += 2; + } else { + name_pref = pattern; /* whole string is the name pattern */ + } + for (i = 0; i < pm_descriptor_index; i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (info->input == is_input && + strstr(info->name, name_pref) && + strstr(info->interf, interf_pref)) { + id = i; + break; + } + } + return id; +} + + +/* +==================================================================== +portmidi implementation +==================================================================== +*/ + +PMEXPORT int Pm_CountDevices( void ) { + Pm_Initialize(); + /* no error checking -- Pm_Initialize() does not fail */ + return pm_descriptor_index; +} + + +PMEXPORT const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ) { + Pm_Initialize(); /* no error check needed */ + if (id >= 0 && id < pm_descriptor_index) { + return &descriptors[id].pub; + } + return NULL; +} + +/* pm_success_fn -- "noop" function pointer */ +PmError pm_success_fn(PmInternal *midi) { + return pmNoError; +} + +/* none_write -- returns an error if called */ +PmError none_write_short(PmInternal *midi, PmEvent *buffer) { + return pmBadPtr; +} + +/* pm_fail_timestamp_fn -- placeholder for begin_sysex and flush */ +PmError pm_fail_timestamp_fn(PmInternal *midi, PmTimestamp timestamp) { + return pmBadPtr; +} + +PmError none_write_byte(PmInternal *midi, unsigned char byte, + PmTimestamp timestamp) { + return pmBadPtr; +} + +/* pm_fail_fn -- generic function, returns error if called */ +PmError pm_fail_fn(PmInternal *midi) { + return pmBadPtr; +} + +static PmError none_open(PmInternal *midi, void *driverInfo) { + return pmBadPtr; +} +static void none_get_host_error(PmInternal * midi, char * msg, unsigned int len) { + *msg = 0; // empty string +} +static unsigned int none_has_host_error(PmInternal * midi) { + return FALSE; +} +PmTimestamp none_synchronize(PmInternal *midi) { + return 0; +} + +#define none_abort pm_fail_fn +#define none_close pm_fail_fn + +pm_fns_node pm_none_dictionary = { + none_write_short, + none_sysex, + none_sysex, + none_write_byte, + none_write_short, + none_write_flush, + none_synchronize, + none_open, + none_abort, + none_close, + none_poll, + none_has_host_error, + none_get_host_error +}; + + +PMEXPORT const char *Pm_GetErrorText( PmError errnum ) { + const char *msg; + + switch(errnum) + { + case pmNoError: + msg = ""; + break; + case pmHostError: + msg = "PortMidi: `Host error'"; + break; + case pmInvalidDeviceId: + msg = "PortMidi: `Invalid device ID'"; + break; + case pmInsufficientMemory: + msg = "PortMidi: `Insufficient memory'"; + break; + case pmBufferTooSmall: + msg = "PortMidi: `Buffer too small'"; + break; + case pmBadPtr: + msg = "PortMidi: `Bad pointer'"; + break; + case pmInternalError: + msg = "PortMidi: `Internal PortMidi Error'"; + break; + case pmBufferOverflow: + msg = "PortMidi: `Buffer overflow'"; + break; + case pmBadData: + msg = "PortMidi: `Invalid MIDI message Data'"; + break; + case pmBufferMaxSize: + msg = "PortMidi: `Buffer cannot be made larger'"; + break; + default: + msg = "PortMidi: `Illegal error number'"; + break; + } + return msg; +} + + +/* This can be called whenever you get a pmHostError return value. + * The error will always be in the global pm_hosterror_text. + */ +PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len) { + assert(msg); + assert(len > 0); + if (pm_hosterror) { + strncpy(msg, (char *) pm_hosterror_text, len); + pm_hosterror = FALSE; + pm_hosterror_text[0] = 0; /* clear the message; not necessary, but it + might help with debugging */ + msg[len - 1] = 0; /* make sure string is terminated */ + } else { + msg[0] = 0; /* no string to return */ + } +} + + +PMEXPORT int Pm_HasHostError(PortMidiStream * stream) { + if (pm_hosterror) return TRUE; + if (stream) { + PmInternal * midi = (PmInternal *) stream; + pm_hosterror = (*midi->dictionary->has_host_error)(midi); + if (pm_hosterror) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + /* now error message is global */ + return TRUE; + } + } + return FALSE; +} + + +PMEXPORT PmError Pm_Initialize( void ) { + if (!pm_initialized) { + pm_hosterror = FALSE; + pm_hosterror_text[0] = 0; /* the null string */ + pm_init(); + pm_initialized = TRUE; + } + return pmNoError; +} + + +PMEXPORT PmError Pm_Terminate( void ) { + if (pm_initialized) { + pm_term(); + // if there are no devices, descriptors might still be NULL + if (descriptors != NULL) { + free(descriptors); + descriptors = NULL; + } + pm_descriptor_index = 0; + pm_descriptor_max = 0; + pm_initialized = FALSE; + } + return pmNoError; +} + + +/* Pm_Read -- read up to length messages from source into buffer */ +/* + * returns number of messages actually read, or error code + */ +PMEXPORT int Pm_Read(PortMidiStream *stream, PmEvent *buffer, int32_t length) { + PmInternal *midi = (PmInternal *) stream; + int n = 0; + PmError err = pmNoError; + pm_hosterror = FALSE; + /* arg checking */ + if(midi == NULL) + err = pmBadPtr; + else if(!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else if(!descriptors[midi->device_id].pub.input) + err = pmBadPtr; + /* First poll for data in the buffer... + * This either simply checks for data, or attempts first to fill the buffer + * with data from the MIDI hardware; this depends on the implementation. + * We could call Pm_Poll here, but that would redo a lot of redundant + * parameter checking, so I copied some code from Pm_Poll to here: */ + else err = (*(midi->dictionary->poll))(midi); + + if (err != pmNoError) { + if (err == pmHostError) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + pm_hosterror = TRUE; + } + return pm_errmsg(err); + } + + while (n < length) { + PmError err = Pm_Dequeue(midi->queue, buffer++); + if (err == pmBufferOverflow) { + /* ignore the data we have retreived so far */ + return pm_errmsg(pmBufferOverflow); + } else if (err == 0) { /* empty queue */ + break; + } + n++; + } + return n; +} + +PMEXPORT PmError Pm_Poll( PortMidiStream *stream ) +{ + PmInternal *midi = (PmInternal *) stream; + PmError err; + + pm_hosterror = FALSE; + /* arg checking */ + if(midi == NULL) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.input) + err = pmBadPtr; + else + err = (*(midi->dictionary->poll))(midi); + + if (err != pmNoError) { + if (err == pmHostError) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + pm_hosterror = TRUE; + } + return pm_errmsg(err); + } + + return !Pm_QueueEmpty(midi->queue); +} + + +/* this is called from Pm_Write and Pm_WriteSysEx to issue a + * call to the system-dependent end_sysex function and handle + * the error return + */ +static PmError pm_end_sysex(PmInternal *midi) +{ + PmError err = (*midi->dictionary->end_sysex)(midi, 0); + midi->sysex_in_progress = FALSE; + if (err == pmHostError) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + pm_hosterror = TRUE; + } + return err; +} + + +/* to facilitate correct error-handling, Pm_Write, Pm_WriteShort, and + Pm_WriteSysEx all operate a state machine that "outputs" calls to + write_short, begin_sysex, write_byte, end_sysex, and write_realtime */ + +PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t length) +{ + PmInternal *midi = (PmInternal *) stream; + PmError err = pmNoError; + int i; + int bits; + + pm_hosterror = FALSE; + /* arg checking */ + if(midi == NULL) + err = pmBadPtr; + else if(!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else if(!descriptors[midi->device_id].pub.output) + err = pmBadPtr; + else + err = pmNoError; + + if (err != pmNoError) goto pm_write_error; + + if (midi->latency == 0) { + midi->now = 0; + } else { + midi->now = (*(midi->time_proc))(midi->time_info); + if (midi->first_message || midi->sync_time + 100 /*ms*/ < midi->now) { + /* time to resync */ + midi->now = (*midi->dictionary->synchronize)(midi); + midi->first_message = FALSE; + } + } + /* error recovery: when a sysex is detected, we call + * dictionary->begin_sysex() followed by calls to + * dictionary->write_byte() and dictionary->write_realtime() + * until an end-of-sysex is detected, when we call + * dictionary->end_sysex(). After an error occurs, + * Pm_Write() continues to call functions. For example, + * it will continue to call write_byte() even after + * an error sending a sysex message, and end_sysex() will be + * called when an EOX or non-real-time status is found. + * When errors are detected, Pm_Write() returns immediately, + * so it is possible that this will drop data and leave + * sysex messages in a partially transmitted state. + */ + for (i = 0; i < length; i++) { + uint32_t msg = buffer[i].message; + bits = 0; + /* is this a sysex message? */ + if (Pm_MessageStatus(msg) == MIDI_SYSEX) { + if (midi->sysex_in_progress) { + /* error: previous sysex was not terminated by EOX */ + midi->sysex_in_progress = FALSE; + err = pmBadData; + goto pm_write_error; + } + midi->sysex_in_progress = TRUE; + if ((err = (*midi->dictionary->begin_sysex)(midi, + buffer[i].timestamp)) != pmNoError) + goto pm_write_error; + if ((err = (*midi->dictionary->write_byte)(midi, MIDI_SYSEX, + buffer[i].timestamp)) != pmNoError) + goto pm_write_error; + bits = 8; + /* fall through to continue sysex processing */ + } else if ((msg & MIDI_STATUS_MASK) && + (Pm_MessageStatus(msg) != MIDI_EOX)) { + /* a non-sysex message */ + if (midi->sysex_in_progress) { + /* this should be a realtime message */ + if (is_real_time(msg)) { + if ((err = (*midi->dictionary->write_realtime)(midi, + &(buffer[i]))) != pmNoError) + goto pm_write_error; + } else { + midi->sysex_in_progress = FALSE; + err = pmBadData; + /* ignore any error from this, because we already have one */ + /* pass 0 as timestamp -- it's ignored */ + (*midi->dictionary->end_sysex)(midi, 0); + goto pm_write_error; + } + } else { /* regular short midi message */ + if ((err = (*midi->dictionary->write_short)(midi, + &(buffer[i]))) != pmNoError) + goto pm_write_error; + continue; + } + } + if (midi->sysex_in_progress) { /* send sysex bytes until EOX */ + /* see if we can accelerate data transfer */ + if (bits == 0 && midi->fill_base && /* 4 bytes to copy */ + (*midi->fill_offset_ptr) + 4 <= midi->fill_length && + (msg & 0x80808080) == 0) { /* all data */ + /* copy 4 bytes from msg to fill_base + fill_offset */ + unsigned char *ptr = midi->fill_base + + *(midi->fill_offset_ptr); + ptr[0] = msg; ptr[1] = msg >> 8; + ptr[2] = msg >> 16; ptr[3] = msg >> 24; + (*midi->fill_offset_ptr) += 4; + continue; + } + /* no acceleration, so do byte-by-byte copying */ + while (bits < 32) { + unsigned char midi_byte = (unsigned char) (msg >> bits); + if ((err = (*midi->dictionary->write_byte)(midi, midi_byte, + buffer[i].timestamp)) != pmNoError) + goto pm_write_error; + if (midi_byte == MIDI_EOX) { + err = pm_end_sysex(midi); + if (err != pmNoError) goto error_exit; + break; /* from while loop */ + } + bits += 8; + } + } else { + /* not in sysex mode, but message did not start with status */ + err = pmBadData; + goto pm_write_error; + } + } + /* after all messages are processed, send the data */ + if (!midi->sysex_in_progress) + err = (*midi->dictionary->write_flush)(midi, 0); +pm_write_error: + if (err == pmHostError) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + pm_hosterror = TRUE; + } +error_exit: + return pm_errmsg(err); +} + + +PMEXPORT PmError Pm_WriteShort(PortMidiStream *stream, PmTimestamp when, PmMessage msg) +{ + PmEvent event; + + event.timestamp = when; + event.message = msg; + return Pm_Write(stream, &event, 1); +} + + +PMEXPORT PmError Pm_WriteSysEx(PortMidiStream *stream, PmTimestamp when, + unsigned char *msg) +{ + /* allocate buffer space for PM_DEFAULT_SYSEX_BUFFER_SIZE bytes */ + /* each PmEvent holds sizeof(PmMessage) bytes of sysex data */ + #define BUFLEN ((int) (PM_DEFAULT_SYSEX_BUFFER_SIZE / sizeof(PmMessage))) + PmEvent buffer[BUFLEN]; + int buffer_size = 1; /* first time, send 1. After that, it's BUFLEN */ + PmInternal *midi = (PmInternal *) stream; + /* the next byte in the buffer is represented by an index, bufx, and + a shift in bits */ + int shift = 0; + int bufx = 0; + buffer[0].message = 0; + buffer[0].timestamp = when; + + while (1) { + /* insert next byte into buffer */ + buffer[bufx].message |= ((*msg) << shift); + shift += 8; + if (*msg++ == MIDI_EOX) break; + if (shift == 32) { + shift = 0; + bufx++; + if (bufx == buffer_size) { + PmError err = Pm_Write(stream, buffer, buffer_size); + /* note: Pm_Write has already called errmsg() */ + if (err) return err; + /* prepare to fill another buffer */ + bufx = 0; + buffer_size = BUFLEN; + /* optimization: maybe we can just copy bytes */ + if (midi->fill_base) { + PmError err; + while (*(midi->fill_offset_ptr) < midi->fill_length) { + midi->fill_base[(*midi->fill_offset_ptr)++] = *msg; + if (*msg++ == MIDI_EOX) { + err = pm_end_sysex(midi); + if (err != pmNoError) return pm_errmsg(err); + goto end_of_sysex; + } + } + /* I thought that I could do a pm_Write here and + * change this if to a loop, avoiding calls in Pm_Write + * to the slower write_byte, but since + * sysex_in_progress is true, this will not flush + * the buffer, and we'll infinite loop: */ + /* err = Pm_Write(stream, buffer, 0); + if (err) return err; */ + /* instead, the way this works is that Pm_Write calls + * write_byte on 4 bytes. The first, since the buffer + * is full, will flush the buffer and allocate a new + * one. This primes the buffer so + * that we can return to the loop above and fill it + * efficiently without a lot of function calls. + */ + buffer_size = 1; /* get another message started */ + } + } + buffer[bufx].message = 0; + buffer[bufx].timestamp = when; + } + /* keep inserting bytes until you find MIDI_EOX */ + } +end_of_sysex: + /* we're finished sending full buffers, but there may + * be a partial one left. + */ + if (shift != 0) bufx++; /* add partial message to buffer len */ + if (bufx) { /* bufx is number of PmEvents to send from buffer */ + PmError err = Pm_Write(stream, buffer, bufx); + if (err) return err; + } + return pmNoError; +} + + + +PMEXPORT PmError Pm_OpenInput(PortMidiStream** stream, + PmDeviceID inputDevice, + void *inputDriverInfo, + int32_t bufferSize, + PmTimeProcPtr time_proc, + void *time_info) +{ + PmInternal *midi; + PmError err = pmNoError; + pm_hosterror = FALSE; + *stream = NULL; + + /* arg checking */ + if (inputDevice < 0 || inputDevice >= pm_descriptor_index) + err = pmInvalidDeviceId; + else if (!descriptors[inputDevice].pub.input) + err = pmInvalidDeviceId; + else if(descriptors[inputDevice].pub.opened) + err = pmInvalidDeviceId; + + if (err != pmNoError) + goto error_return; + + /* create portMidi internal data */ + midi = (PmInternal *) pm_alloc(sizeof(PmInternal)); + *stream = midi; + if (!midi) { + err = pmInsufficientMemory; + goto error_return; + } + midi->device_id = inputDevice; + midi->write_flag = FALSE; + midi->time_proc = time_proc; + midi->time_info = time_info; + /* windows adds timestamps in the driver and these are more accurate than + using a time_proc, so do not automatically provide a time proc. Non-win + implementations may want to provide a default time_proc in their + system-specific midi_out_open() method. + */ + if (bufferSize <= 0) bufferSize = 256; /* default buffer size */ + midi->queue = Pm_QueueCreate(bufferSize, (int32_t) sizeof(PmEvent)); + if (!midi->queue) { + /* free portMidi data */ + *stream = NULL; + pm_free(midi); + err = pmInsufficientMemory; + goto error_return; + } + midi->buffer_len = bufferSize; /* portMidi input storage */ + midi->latency = 0; /* not used */ + midi->sysex_in_progress = FALSE; + midi->sysex_message = 0; + midi->sysex_message_count = 0; + midi->filters = PM_FILT_ACTIVE; + midi->channel_mask = 0xFFFF; + midi->sync_time = 0; + midi->first_message = TRUE; + midi->dictionary = descriptors[inputDevice].dictionary; + midi->fill_base = NULL; + midi->fill_offset_ptr = NULL; + midi->fill_length = 0; + descriptors[inputDevice].internalDescriptor = midi; + /* open system dependent input device */ + err = (*midi->dictionary->open)(midi, inputDriverInfo); + if (err) { + *stream = NULL; + descriptors[inputDevice].internalDescriptor = NULL; + /* free portMidi data */ + Pm_QueueDestroy(midi->queue); + pm_free(midi); + } else { + /* portMidi input open successful */ + descriptors[inputDevice].pub.opened = TRUE; + } +error_return: + /* note: if there is a pmHostError, it is the responsibility + * of the system-dependent code (*midi->dictionary->open)() + * to set pm_hosterror and pm_hosterror_text + */ + return pm_errmsg(err); +} + + +PMEXPORT PmError Pm_OpenOutput(PortMidiStream** stream, + PmDeviceID outputDevice, + void *outputDriverInfo, + int32_t bufferSize, + PmTimeProcPtr time_proc, + void *time_info, + int32_t latency ) +{ + PmInternal *midi; + PmError err = pmNoError; + pm_hosterror = FALSE; + *stream = NULL; + + /* arg checking */ + if (outputDevice < 0 || outputDevice >= pm_descriptor_index) + err = pmInvalidDeviceId; + else if (!descriptors[outputDevice].pub.output) + err = pmInvalidDeviceId; + else if (descriptors[outputDevice].pub.opened) + err = pmInvalidDeviceId; + if (err != pmNoError) + goto error_return; + + /* create portMidi internal data */ + midi = (PmInternal *) pm_alloc(sizeof(PmInternal)); + *stream = midi; + if (!midi) { + err = pmInsufficientMemory; + goto error_return; + } + midi->device_id = outputDevice; + midi->write_flag = TRUE; + midi->time_proc = time_proc; + /* if latency > 0, we need a time reference. If none is provided, + use PortTime library */ + if (time_proc == NULL && latency != 0) { + if (!Pt_Started()) + Pt_Start(1, 0, 0); + /* time_get does not take a parameter, so coerce */ + midi->time_proc = (PmTimeProcPtr) Pt_Time; + } + midi->time_info = time_info; + midi->buffer_len = bufferSize; + midi->queue = NULL; /* unused by output */ + /* if latency zero, output immediate (timestamps ignored) */ + /* if latency < 0, use 0 but don't return an error */ + if (latency < 0) latency = 0; + midi->latency = latency; + midi->sysex_in_progress = FALSE; + midi->sysex_message = 0; /* unused by output */ + midi->sysex_message_count = 0; /* unused by output */ + midi->filters = 0; /* not used for output */ + midi->channel_mask = 0xFFFF; + midi->sync_time = 0; + midi->first_message = TRUE; + midi->dictionary = descriptors[outputDevice].dictionary; + midi->fill_base = NULL; + midi->fill_offset_ptr = NULL; + midi->fill_length = 0; + descriptors[outputDevice].internalDescriptor = midi; + /* open system dependent output device */ + err = (*midi->dictionary->open)(midi, outputDriverInfo); + if (err) { + *stream = NULL; + descriptors[outputDevice].internalDescriptor = NULL; + /* free portMidi data */ + pm_free(midi); + } else { + /* portMidi input open successful */ + descriptors[outputDevice].pub.opened = TRUE; + } +error_return: + /* note: system-dependent code must set pm_hosterror and + * pm_hosterror_text if a pmHostError occurs + */ + return pm_errmsg(err); +} + + +PMEXPORT PmError Pm_SetChannelMask(PortMidiStream *stream, int mask) +{ + PmInternal *midi = (PmInternal *) stream; + PmError err = pmNoError; + + if (midi == NULL) + err = pmBadPtr; + else + midi->channel_mask = mask; + + return pm_errmsg(err); +} + + +PMEXPORT PmError Pm_SetFilter(PortMidiStream *stream, int32_t filters) { + PmInternal *midi = (PmInternal *) stream; + PmError err = pmNoError; + + /* arg checking */ + if (midi == NULL) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else + midi->filters = filters; + return pm_errmsg(err); +} + + +PMEXPORT PmError Pm_Close( PortMidiStream *stream ) { + PmInternal *midi = (PmInternal *) stream; + PmError err = pmNoError; + + pm_hosterror = FALSE; + /* arg checking */ + if (midi == NULL) /* midi must point to something */ + err = pmBadPtr; + /* if it is an open device, the device_id will be valid */ + else if (midi->device_id < 0 || midi->device_id >= pm_descriptor_index) + err = pmBadPtr; + /* and the device should be in the opened state */ + else if (!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + + if (err != pmNoError) + goto error_return; + + /* close the device */ + err = (*midi->dictionary->close)(midi); + /* even if an error occurred, continue with cleanup */ + descriptors[midi->device_id].internalDescriptor = NULL; + descriptors[midi->device_id].pub.opened = FALSE; + if (midi->queue) Pm_QueueDestroy(midi->queue); + pm_free(midi); +error_return: + /* system dependent code must set pm_hosterror and + * pm_hosterror_text if a pmHostError occurs. + */ + return pm_errmsg(err); +} + +PmError Pm_Synchronize( PortMidiStream* stream ) { + PmInternal *midi = (PmInternal *) stream; + PmError err = pmNoError; + if (midi == NULL) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.output) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else + midi->first_message = TRUE; + return err; +} + +PMEXPORT PmError Pm_Abort( PortMidiStream* stream ) { + PmInternal *midi = (PmInternal *) stream; + PmError err; + /* arg checking */ + if (midi == NULL) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.output) + err = pmBadPtr; + else if (!descriptors[midi->device_id].pub.opened) + err = pmBadPtr; + else + err = (*midi->dictionary->abort)(midi); + + if (err == pmHostError) { + midi->dictionary->host_error(midi, pm_hosterror_text, + PM_HOST_ERROR_MSG_LEN); + pm_hosterror = TRUE; + } + return pm_errmsg(err); +} + + + +/* pm_channel_filtered returns non-zero if the channel mask is blocking the current channel */ +#define pm_channel_filtered(status, mask) \ + ((((status) & 0xF0) != 0xF0) && (!(Pm_Channel((status) & 0x0F) & (mask)))) + + +/* The following two functions will checks to see if a MIDI message matches + the filtering criteria. Since the sysex routines only want to filter realtime messages, + we need to have separate routines. + */ + + +/* pm_realtime_filtered returns non-zero if the filter will kill the current message. + Note that only realtime messages are checked here. + */ +#define pm_realtime_filtered(status, filters) \ + ((((status) & 0xF0) == 0xF0) && ((1 << ((status) & 0xF)) & (filters))) + +/* + return ((status == MIDI_ACTIVE) && (filters & PM_FILT_ACTIVE)) + || ((status == MIDI_CLOCK) && (filters & PM_FILT_CLOCK)) + || ((status == MIDI_START) && (filters & PM_FILT_PLAY)) + || ((status == MIDI_STOP) && (filters & PM_FILT_PLAY)) + || ((status == MIDI_CONTINUE) && (filters & PM_FILT_PLAY)) + || ((status == MIDI_F9) && (filters & PM_FILT_F9)) + || ((status == MIDI_FD) && (filters & PM_FILT_FD)) + || ((status == MIDI_RESET) && (filters & PM_FILT_RESET)) + || ((status == MIDI_MTC) && (filters & PM_FILT_MTC)) + || ((status == MIDI_SONGPOS) && (filters & PM_FILT_SONG_POSITION)) + || ((status == MIDI_SONGSEL) && (filters & PM_FILT_SONG_SELECT)) + || ((status == MIDI_TUNE) && (filters & PM_FILT_TUNE)); +}*/ + + +/* pm_status_filtered returns non-zero if a filter will kill the current message, based on status. + Note that sysex and real time are not checked. It is up to the subsystem (winmm, core midi, alsa) + to filter sysex, as it is handled more easily and efficiently at that level. + Realtime message are filtered in pm_realtime_filtered. + */ +#define pm_status_filtered(status, filters) ((1 << (16 + ((status) >> 4))) & (filters)) + + +/* + return ((status == MIDI_NOTE_ON) && (filters & PM_FILT_NOTE)) + || ((status == MIDI_NOTE_OFF) && (filters & PM_FILT_NOTE)) + || ((status == MIDI_CHANNEL_AT) && (filters & PM_FILT_CHANNEL_AFTERTOUCH)) + || ((status == MIDI_POLY_AT) && (filters & PM_FILT_POLY_AFTERTOUCH)) + || ((status == MIDI_PROGRAM) && (filters & PM_FILT_PROGRAM)) + || ((status == MIDI_CONTROL) && (filters & PM_FILT_CONTROL)) + || ((status == MIDI_PITCHBEND) && (filters & PM_FILT_PITCHBEND)); + +} +*/ + +static void pm_flush_sysex(PmInternal *midi, PmTimestamp timestamp) +{ + PmEvent event; + + /* there may be nothing in the buffer */ + if (midi->sysex_message_count == 0) return; /* nothing to flush */ + + event.message = midi->sysex_message; + event.timestamp = timestamp; + /* copied from pm_read_short, avoids filtering */ + if (Pm_Enqueue(midi->queue, &event) == pmBufferOverflow) { + midi->sysex_in_progress = FALSE; + } + midi->sysex_message_count = 0; + midi->sysex_message = 0; +} + + +/* pm_read_short and pm_read_bytes + are the interface between system-dependent MIDI input handlers + and the system-independent PortMIDI code. + The input handler MUST obey these rules: + 1) all short input messages must be sent to pm_read_short, which + enqueues them to a FIFO for the application. + 2) each buffer of sysex bytes should be reported by calling pm_read_bytes + (which sets midi->sysex_in_progress). After the eox byte, + pm_read_bytes will clear sysex_in_progress + */ + +/* pm_read_short is the place where all input messages arrive from + system-dependent code such as pmwinmm.c. Here, the messages + are entered into the PortMidi input buffer. + */ +void pm_read_short(PmInternal *midi, PmEvent *event) +{ + int status; + /* arg checking */ + assert(midi != NULL); + /* midi filtering is applied here */ + status = Pm_MessageStatus(event->message); + if (!pm_status_filtered(status, midi->filters) + && (!is_real_time(status) || + !pm_realtime_filtered(status, midi->filters)) + && !pm_channel_filtered(status, midi->channel_mask)) { + /* if sysex is in progress and we get a status byte, it had + better be a realtime message or the starting SYSEX byte; + otherwise, we exit the sysex_in_progress state + */ + if (midi->sysex_in_progress && (status & MIDI_STATUS_MASK)) { + /* two choices: real-time or not. If it's real-time, then + * this should be delivered as a sysex byte because it is + * embedded in a sysex message + */ + if (is_real_time(status)) { + midi->sysex_message |= + (status << (8 * midi->sysex_message_count++)); + if (midi->sysex_message_count == 4) { + pm_flush_sysex(midi, event->timestamp); + } + } else { /* otherwise, it's not real-time. This interrupts + * a sysex message in progress */ + midi->sysex_in_progress = FALSE; + } + } else if (Pm_Enqueue(midi->queue, event) == pmBufferOverflow) { + midi->sysex_in_progress = FALSE; + } + } +} + +/* pm_read_bytes -- read one (partial) sysex msg from MIDI data */ +/* + * returns how many bytes processed + */ +unsigned int pm_read_bytes(PmInternal *midi, const unsigned char *data, + int len, PmTimestamp timestamp) +{ + int i = 0; /* index into data, must not be unsigned (!) */ + PmEvent event; + event.timestamp = timestamp; + assert(midi); + /* note that since buffers may not have multiples of 4 bytes, + * pm_read_bytes may be called in the middle of an outgoing + * 4-byte PortMidi message. sysex_in_progress indicates that + * a sysex has been sent but no eox. + */ + if (len == 0) return 0; /* sanity check */ + if (!midi->sysex_in_progress) { + while (i < len) { /* process all data */ + unsigned char byte = data[i++]; + if (byte == MIDI_SYSEX && + !pm_realtime_filtered(byte, midi->filters)) { + midi->sysex_in_progress = TRUE; + i--; /* back up so code below will get SYSEX byte */ + break; /* continue looping below to process msg */ + } else if (byte == MIDI_EOX) { + midi->sysex_in_progress = FALSE; + return i; /* done with one message */ + } else if (byte & MIDI_STATUS_MASK) { + /* We're getting MIDI but no sysex in progress. + * Either the SYSEX status byte was dropped or + * the message was filtered. Drop the data, but + * send any embedded realtime bytes. + */ + /* assume that this is a real-time message: + * it is an error to pass non-real-time messages + * to pm_read_bytes + */ + event.message = byte; + pm_read_short(midi, &event); + } + } /* all bytes in the buffer are processed */ + } + /* Now, i<len implies sysex_in_progress. If sysex_in_progress + * becomes false in the loop, there must have been an overflow + * and we can just drop all remaining bytes + */ + while (i < len && midi->sysex_in_progress) { + if (midi->sysex_message_count == 0 && i <= len - 4 && + ((event.message = (((PmMessage) data[i]) | + (((PmMessage) data[i+1]) << 8) | + (((PmMessage) data[i+2]) << 16) | + (((PmMessage) data[i+3]) << 24))) & + 0x80808080) == 0) { /* all data, no status */ + if (Pm_Enqueue(midi->queue, &event) == pmBufferOverflow) { + midi->sysex_in_progress = FALSE; + } + i += 4; + } else { + while (i < len) { + /* send one byte at a time */ + unsigned char byte = data[i++]; + if (is_real_time(byte) && + pm_realtime_filtered(byte, midi->filters)) { + continue; /* real-time data is filtered, so omit */ + } + midi->sysex_message |= + (byte << (8 * midi->sysex_message_count++)); + if (byte == MIDI_EOX) { + midi->sysex_in_progress = FALSE; + pm_flush_sysex(midi, event.timestamp); + return i; + } else if (midi->sysex_message_count == 4) { + pm_flush_sysex(midi, event.timestamp); + /* after handling at least one non-data byte + * and reaching a 4-byte message boundary, + * resume trying to send 4 at a time in outer loop + */ + break; + } + } + } + } + return i; +} + + diff --git a/pd/portmidi/pm_common/portmidi.h b/pd/portmidi/pm_common/portmidi.h old mode 100644 new mode 100755 index 8f4879f38..e07991e0d --- a/pd/portmidi/pm_common/portmidi.h +++ b/pd/portmidi/pm_common/portmidi.h @@ -1,606 +1,654 @@ -#ifndef PORT_MIDI_H -#define PORT_MIDI_H -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* - * PortMidi Portable Real-Time MIDI Library - * PortMidi API Header File - * Latest version available at: http://www.cs.cmu.edu/~music/portmidi/ - * - * Copyright (c) 1999-2000 Ross Bencina and Phil Burk - * Copyright (c) 2001-2006 Roger B. Dannenberg - * - * Latest version available at: http://www.cs.cmu.edu/~music/portmidi/ - * - * Copyright (c) 1999-2000 Ross Bencina and Phil Burk - * Copyright (c) 2001-2006 Roger B. Dannenberg - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files - * (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * The text above constitutes the entire PortMidi license; however, - * the PortMusic community also makes the following non-binding requests: - * - * Any person wishing to distribute modifications to the Software is - * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -/* CHANGELOG FOR PORTMIDI - * (see ../CHANGELOG.txt) - * - * IMPORTANT INFORMATION ABOUT A WIN32 BUG: - * - * Windows apparently has a serious midi bug -- if you do not close ports, Windows - * may crash. PortMidi tries to protect against this by using a DLL to clean up. - * - * If client exits for example with: - * i) assert - * ii) Ctrl^c, - * then DLL clean-up routine called. However, when client does something - * really bad (e.g. assigns value to NULL pointer) then DLL CLEANUP ROUTINE - * NEVER RUNS! In this state, if you wait around long enough, you will - * probably get the blue screen of death. Can also go into Pview and there will - * exist zombie process that you can't kill. - * - * You can enable the DLL cleanup routine by defining USE_DLL_FOR_CLEANUP. - * Do not define this preprocessor symbol if you do not want to use this - * feature. - * - * NOTES ON HOST ERROR REPORTING: - * - * PortMidi errors (of type PmError) are generic, system-independent errors. - * When an error does not map to one of the more specific PmErrors, the - * catch-all code pmHostError is returned. This means that PortMidi has - * retained a more specific system-dependent error code. The caller can - * get more information by calling Pm_HasHostError() to test if there is - * a pending host error, and Pm_GetHostErrorText() to get a text string - * describing the error. Host errors are reported on a per-device basis - * because only after you open a device does PortMidi have a place to - * record the host error code. I.e. only - * those routines that receive a (PortMidiStream *) argument check and - * report errors. One exception to this is that Pm_OpenInput() and - * Pm_OpenOutput() can report errors even though when an error occurs, - * there is no PortMidiStream* to hold the error. Fortunately, both - * of these functions return any error immediately, so we do not really - * need per-device error memory. Instead, any host error code is stored - * in a global, pmHostError is returned, and the user can call - * Pm_GetHostErrorText() to get the error message (and the invalid stream - * parameter will be ignored.) The functions - * pm_init and pm_term do not fail or raise - * errors. The job of pm_init is to locate all available devices so that - * the caller can get information via PmDeviceInfo(). If an error occurs, - * the device is simply not listed as available. - * - * Host errors come in two flavors: - * a) host error - * b) host error during callback - * These can occur w/midi input or output devices. (b) can only happen - * asynchronously (during callback routines), whereas (a) only occurs while - * synchronously running PortMidi and any resulting system dependent calls. - * Both (a) and (b) are reported by the next read or write call. You can - * also query for asynchronous errors (b) at any time by calling - * Pm_HasHostError(). - * - * NOTES ON COMPILE-TIME SWITCHES - * - * DEBUG assumes stdio and a console. Use this if you want automatic, simple - * error reporting, e.g. for prototyping. If you are using MFC or some - * other graphical interface with no console, DEBUG probably should be - * undefined. - * PM_CHECK_ERRORS more-or-less takes over error checking for return values, - * stopping your program and printing error messages when an error - * occurs. This also uses stdio for console text I/O. - * USE_DLL_FOR_CLEANUP is described above. (Windows only.) - * - */ - -#ifndef FALSE - #define FALSE 0 -#endif -#ifndef TRUE - #define TRUE 1 -#endif - -/* default size of buffers for sysex transmission: */ -#define PM_DEFAULT_SYSEX_BUFFER_SIZE 1024 - - -typedef enum { - pmNoError = 0, - pmHostError = -10000, - pmInvalidDeviceId, /* out of range or - * output device when input is requested or - * input device when output is requested or - * device is already opened - */ - pmInsufficientMemory, - pmBufferTooSmall, - pmBufferOverflow, - pmBadPtr, - pmBadData, /* illegal midi data, e.g. missing EOX */ - pmInternalError, - pmBufferMaxSize /* buffer is already as large as it can be */ - /* NOTE: If you add a new error type, be sure to update Pm_GetErrorText() */ -} PmError; - -/* - Pm_Initialize() is the library initialisation function - call this before - using the library. -*/ - -PmError Pm_Initialize( void ); - -/* - Pm_Terminate() is the library termination function - call this after - using the library. -*/ - -PmError Pm_Terminate( void ); - -/* A single PortMidiStream is a descriptor for an open MIDI device. -*/ -typedef void PortMidiStream; -#define PmStream PortMidiStream - -/* - Test whether stream has a pending host error. Normally, the client finds - out about errors through returned error codes, but some errors can occur - asynchronously where the client does not - explicitly call a function, and therefore cannot receive an error code. - The client can test for a pending error using Pm_HasHostError(). If true, - the error can be accessed and cleared by calling Pm_GetErrorText(). - Errors are also cleared by calling other functions that can return - errors, e.g. Pm_OpenInput(), Pm_OpenOutput(), Pm_Read(), Pm_Write(). The - client does not need to call Pm_HasHostError(). Any pending error will be - reported the next time the client performs an explicit function call on - the stream, e.g. an input or output operation. Until the error is cleared, - no new error codes will be obtained, even for a different stream. -*/ -int Pm_HasHostError( PortMidiStream * stream ); - - -/* Translate portmidi error number into human readable message. - These strings are constants (set at compile time) so client has - no need to allocate storage -*/ -const char *Pm_GetErrorText( PmError errnum ); - -/* Translate portmidi host error into human readable message. - These strings are computed at run time, so client has to allocate storage. - After this routine executes, the host error is cleared. -*/ -void Pm_GetHostErrorText(char * msg, unsigned int len); - -#define HDRLENGTH 50 -#define PM_HOST_ERROR_MSG_LEN 256u /* any host error msg will occupy less - than this number of characters */ - -/* - Device enumeration mechanism. - - Device ids range from 0 to Pm_CountDevices()-1. - -*/ -typedef int PmDeviceID; -#define pmNoDevice -1 -typedef struct { - int structVersion; - const char *interf; /* underlying MIDI API, e.g. MMSystem or DirectX */ - const char *name; /* device name, e.g. USB MidiSport 1x1 */ - int input; /* true iff input is available */ - int output; /* true iff output is available */ - int opened; /* used by generic PortMidi code to do error checking on arguments */ - -} PmDeviceInfo; - - -int Pm_CountDevices( void ); -/* - Pm_GetDefaultInputDeviceID(), Pm_GetDefaultOutputDeviceID() - - Return the default device ID or pmNoDevice if there are no devices. - The result can be passed to Pm_OpenMidi(). - - On the PC, the user can specify a default device by - setting an environment variable. For example, to use device #1. - - set PM_RECOMMENDED_OUTPUT_DEVICE=1 - - The user should first determine the available device ID by using - the supplied application "testin" or "testout". - - In general, the registry is a better place for this kind of info, - and with USB devices that can come and go, using integers is not - very reliable for device identification. Under Windows, if - PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is - *NOT* found in the environment, then the default device is obtained - by looking for a string in the registry under: - HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device - and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device - for a string. The number of the first device with a substring that - matches the string exactly is returned. For example, if the string - in the registry is "USB", and device 1 is named - "In USB MidiSport 1x1", then that will be the default - input because it contains the string "USB". - - In addition to the name, PmDeviceInfo has the member "interf", which - is the interface name. (The "interface" is the underlying software - system or API used by PortMidi to access devices. Examples are - MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) - At present, the only Win32 interface is "MMSystem", the only Linux - interface is "ALSA", and the only Max OS X interface is "CoreMIDI". - To specify both the interface and the device name in the registry, - separate the two with a comma and a space, e.g.: - MMSystem, In USB MidiSport 1x1 - In this case, the string before the comma must be a substring of - the "interf" string, and the string after the space must be a - substring of the "name" name string in order to match the device. - - Note: in the current release, the default is simply the first device - (the input or output device with the lowest PmDeviceID). -*/ -PmDeviceID Pm_GetDefaultInputDeviceID( void ); -PmDeviceID Pm_GetDefaultOutputDeviceID( void ); - -/* - PmTimestamp is used to represent a millisecond clock with arbitrary - start time. The type is used for all MIDI timestampes and clocks. -*/ -typedef long PmTimestamp; -typedef PmTimestamp (*PmTimeProcPtr)(void *time_info); - -/* TRUE if t1 before t2 */ -#define PmBefore(t1,t2) ((t1-t2) < 0) - -/* - Pm_GetDeviceInfo() returns a pointer to a PmDeviceInfo structure - referring to the device specified by id. - If id is out of range the function returns NULL. - - The returned structure is owned by the PortMidi implementation and must - not be manipulated or freed. The pointer is guaranteed to be valid - between calls to Pm_Initialize() and Pm_Terminate(). -*/ -const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ); - -/* - Pm_OpenInput() and Pm_OpenOutput() open devices. - - stream is the address of a PortMidiStream pointer which will receive - a pointer to the newly opened stream. - - inputDevice is the id of the device used for input (see PmDeviceID above). - - inputDriverInfo is a pointer to an optional driver specific data structure - containing additional information for device setup or handle processing. - inputDriverInfo is never required for correct operation. If not used - inputDriverInfo should be NULL. - - outputDevice is the id of the device used for output (see PmDeviceID above.) - - outputDriverInfo is a pointer to an optional driver specific data structure - containing additional information for device setup or handle processing. - outputDriverInfo is never required for correct operation. If not used - outputDriverInfo should be NULL. - - For input, the buffersize specifies the number of input events to be - buffered waiting to be read using Pm_Read(). For output, buffersize - specifies the number of output events to be buffered waiting for output. - (In some cases -- see below -- PortMidi does not buffer output at all - and merely passes data to a lower-level API, in which case buffersize - is ignored.) - - latency is the delay in milliseconds applied to timestamps to determine - when the output should actually occur. (If latency is < 0, 0 is assumed.) - If latency is zero, timestamps are ignored and all output is delivered - immediately. If latency is greater than zero, output is delayed until - the message timestamp plus the latency. (NOTE: time is measured relative - to the time source indicated by time_proc. Timestamps are absolute, not - relative delays or offsets.) In some cases, PortMidi can obtain - better timing than your application by passing timestamps along to the - device driver or hardware. Latency may also help you to synchronize midi - data to audio data by matching midi latency to the audio buffer latency. - - time_proc is a pointer to a procedure that returns time in milliseconds. It - may be NULL, in which case a default millisecond timebase (PortTime) is - used. If the application wants to use PortTime, it should start the timer - (call Pt_Start) before calling Pm_OpenInput or Pm_OpenOutput. If the - application tries to start the timer *after* Pm_OpenInput or Pm_OpenOutput, - it may get a ptAlreadyStarted error from Pt_Start, and the application's - preferred time resolution and callback function will be ignored. - time_proc result values are appended to incoming MIDI data, and time_proc - times are used to schedule outgoing MIDI data (when latency is non-zero). - - time_info is a pointer passed to time_proc. - - return value: - Upon success Pm_Open() returns PmNoError and places a pointer to a - valid PortMidiStream in the stream argument. - If a call to Pm_Open() fails a nonzero error code is returned (see - PMError above) and the value of port is invalid. - - Any stream that is successfully opened should eventually be closed - by calling Pm_Close(). - -*/ -PmError Pm_OpenInput( PortMidiStream** stream, - PmDeviceID inputDevice, - void *inputDriverInfo, - long bufferSize, - PmTimeProcPtr time_proc, - void *time_info ); - -PmError Pm_OpenOutput( PortMidiStream** stream, - PmDeviceID outputDevice, - void *outputDriverInfo, - long bufferSize, - PmTimeProcPtr time_proc, - void *time_info, - long latency ); - -/* - Pm_SetFilter() sets filters on an open input stream to drop selected - input types. By default, only active sensing messages are filtered. - To prohibit, say, active sensing and sysex messages, call - Pm_SetFilter(stream, PM_FILT_ACTIVE | PM_FILT_SYSEX); - - Filtering is useful when midi routing or midi thru functionality is being - provided by the user application. - For example, you may want to exclude timing messages (clock, MTC, start/stop/continue), - while allowing note-related messages to pass. - Or you may be using a sequencer or drum-machine for MIDI clock information but want to - exclude any notes it may play. - */ - -/* filter active sensing messages (0xFE): */ -#define PM_FILT_ACTIVE (1 << 0x0E) -/* filter system exclusive messages (0xF0): */ -#define PM_FILT_SYSEX (1 << 0x00) -/* filter clock messages (CLOCK 0xF8, START 0xFA, STOP 0xFC, and CONTINUE 0xFB) */ -#define PM_FILT_CLOCK ((1 << 0x08) | (1 << 0x0A) | (1 << 0x0C) | (1 << 0x0B)) -/* filter play messages (start 0xFA, stop 0xFC, continue 0xFB) */ -#define PM_FILT_PLAY (1 << 0x0A) -/* filter tick messages (0xF9) */ -#define PM_FILT_TICK (1 << 0x09) -/* filter undefined FD messages */ -#define PM_FILT_FD (1 << 0x0D) -/* filter undefined real-time messages */ -#define PM_FILT_UNDEFINED PM_FILT_FD -/* filter reset messages (0xFF) */ -#define PM_FILT_RESET (1 << 0x0F) -/* filter all real-time messages */ -#define PM_FILT_REALTIME (PM_FILT_ACTIVE | PM_FILT_SYSEX | PM_FILT_CLOCK | \ - PM_FILT_PLAY | PM_FILT_UNDEFINED | PM_FILT_RESET | PM_FILT_TICK) -/* filter note-on and note-off (0x90-0x9F and 0x80-0x8F */ -#define PM_FILT_NOTE ((1 << 0x19) | (1 << 0x18)) -/* filter channel aftertouch (most midi controllers use this) (0xD0-0xDF)*/ -#define PM_FILT_CHANNEL_AFTERTOUCH (1 << 0x1D) -/* per-note aftertouch (0xA0-0xAF) */ -#define PM_FILT_POLY_AFTERTOUCH (1 << 0x1A) -/* filter both channel and poly aftertouch */ -#define PM_FILT_AFTERTOUCH (PM_FILT_CHANNEL_AFTERTOUCH | PM_FILT_POLY_AFTERTOUCH) -/* Program changes (0xC0-0xCF) */ -#define PM_FILT_PROGRAM (1 << 0x1C) -/* Control Changes (CC's) (0xB0-0xBF)*/ -#define PM_FILT_CONTROL (1 << 0x1B) -/* Pitch Bender (0xE0-0xEF*/ -#define PM_FILT_PITCHBEND (1 << 0x1E) -/* MIDI Time Code (0xF1)*/ -#define PM_FILT_MTC (1 << 0x01) -/* Song Position (0xF2) */ -#define PM_FILT_SONG_POSITION (1 << 0x02) -/* Song Select (0xF3)*/ -#define PM_FILT_SONG_SELECT (1 << 0x03) -/* Tuning request (0xF6)*/ -#define PM_FILT_TUNE (1 << 0x06) -/* All System Common messages (mtc, song position, song select, tune request) */ -#define PM_FILT_SYSTEMCOMMON (PM_FILT_MTC | PM_FILT_SONG_POSITION | PM_FILT_SONG_SELECT | PM_FILT_TUNE) - - -PmError Pm_SetFilter( PortMidiStream* stream, long filters ); - -/* - Pm_SetChannelMask() filters incoming messages based on channel. - The mask is a 16-bit bitfield corresponding to appropriate channels - The Pm_Channel macro can assist in calling this function. - i.e. to set receive only input on channel 1, call with - Pm_SetChannelMask(Pm_Channel(1)); - Multiple channels should be OR'd together, like - Pm_SetChannelMask(Pm_Channel(10) | Pm_Channel(11)) - - All channels are allowed by default -*/ -#define Pm_Channel(channel) (1<<(channel)) - -PmError Pm_SetChannelMask(PortMidiStream *stream, int mask); - -/* - Pm_Abort() terminates outgoing messages immediately - The caller should immediately close the output port; - this call may result in transmission of a partial midi message. - There is no abort for Midi input because the user can simply - ignore messages in the buffer and close an input device at - any time. - */ -PmError Pm_Abort( PortMidiStream* stream ); - -/* - Pm_Close() closes a midi stream, flushing any pending buffers. - (PortMidi attempts to close open streams when the application - exits -- this is particularly difficult under Windows.) -*/ -PmError Pm_Close( PortMidiStream* stream ); - -/* - Pm_Message() encodes a short Midi message into a long word. If data1 - and/or data2 are not present, use zero. - - Pm_MessageStatus(), Pm_MessageData1(), and - Pm_MessageData2() extract fields from a long-encoded midi message. -*/ -#define Pm_Message(status, data1, data2) \ - ((((data2) << 16) & 0xFF0000) | \ - (((data1) << 8) & 0xFF00) | \ - ((status) & 0xFF)) -#define Pm_MessageStatus(msg) ((msg) & 0xFF) -#define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF) -#define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF) - -/* All midi data comes in the form of PmEvent structures. A sysex - message is encoded as a sequence of PmEvent structures, with each - structure carrying 4 bytes of the message, i.e. only the first - PmEvent carries the status byte. - - Note that MIDI allows nested messages: the so-called "real-time" MIDI - messages can be inserted into the MIDI byte stream at any location, - including within a sysex message. MIDI real-time messages are one-byte - messages used mainly for timing (see the MIDI spec). PortMidi retains - the order of non-real-time MIDI messages on both input and output, but - it does not specify exactly how real-time messages are processed. This - is particulary problematic for MIDI input, because the input parser - must either prepare to buffer an unlimited number of sysex message - bytes or to buffer an unlimited number of real-time messages that - arrive embedded in a long sysex message. To simplify things, the input - parser is allowed to pass real-time MIDI messages embedded within a - sysex message, and it is up to the client to detect, process, and - remove these messages as they arrive. - - When receiving sysex messages, the sysex message is terminated - by either an EOX status byte (anywhere in the 4 byte messages) or - by a non-real-time status byte in the low order byte of the message. - If you get a non-real-time status byte but there was no EOX byte, it - means the sysex message was somehow truncated. This is not - considered an error; e.g., a missing EOX can result from the user - disconnecting a MIDI cable during sysex transmission. - - A real-time message can occur within a sysex message. A real-time - message will always occupy a full PmEvent with the status byte in - the low-order byte of the PmEvent message field. (This implies that - the byte-order of sysex bytes and real-time message bytes may not - be preserved -- for example, if a real-time message arrives after - 3 bytes of a sysex message, the real-time message will be delivered - first. The first word of the sysex message will be delivered only - after the 4th byte arrives, filling the 4-byte PmEvent message field. - - The timestamp field is observed when the output port is opened with - a non-zero latency. A timestamp of zero means "use the current time", - which in turn means to deliver the message with a delay of - latency (the latency parameter used when opening the output port.) - Do not expect PortMidi to sort data according to timestamps -- - messages should be sent in the correct order, and timestamps MUST - be non-decreasing. - - A sysex message will generally fill many PmEvent structures. On - output to a PortMidiStream with non-zero latency, the first timestamp - on sysex message data will determine the time to begin sending the - message. PortMidi implementations may ignore timestamps for the - remainder of the sysex message. - - On input, the timestamp ideally denotes the arrival time of the - status byte of the message. The first timestamp on sysex message - data will be valid. Subsequent timestamps may denote - when message bytes were actually received, or they may be simply - copies of the first timestamp. - - Timestamps for nested messages: If a real-time message arrives in - the middle of some other message, it is enqueued immediately with - the timestamp corresponding to its arrival time. The interrupted - non-real-time message or 4-byte packet of sysex data will be enqueued - later. The timestamp of interrupted data will be equal to that of - the interrupting real-time message to insure that timestamps are - non-decreasing. - */ -typedef long PmMessage; -typedef struct { - PmMessage message; - PmTimestamp timestamp; -} PmEvent; - -/* - Pm_Read() retrieves midi data into a buffer, and returns the number - of events read. Result is a non-negative number unless an error occurs, - in which case a PmError value will be returned. - - Buffer Overflow - - The problem: if an input overflow occurs, data will be lost, ultimately - because there is no flow control all the way back to the data source. - When data is lost, the receiver should be notified and some sort of - graceful recovery should take place, e.g. you shouldn't resume receiving - in the middle of a long sysex message. - - With a lock-free fifo, which is pretty much what we're stuck with to - enable portability to the Mac, it's tricky for the producer and consumer - to synchronously reset the buffer and resume normal operation. - - Solution: the buffer managed by PortMidi will be flushed when an overflow - occurs. The consumer (Pm_Read()) gets an error message (pmBufferOverflow) - and ordinary processing resumes as soon as a new message arrives. The - remainder of a partial sysex message is not considered to be a "new - message" and will be flushed as well. - -*/ -PmError Pm_Read( PortMidiStream *stream, PmEvent *buffer, long length ); - -/* - Pm_Poll() tests whether input is available, - returning TRUE, FALSE, or an error value. -*/ -PmError Pm_Poll( PortMidiStream *stream); - -/* - Pm_Write() writes midi data from a buffer. This may contain: - - short messages - or - - sysex messages that are converted into a sequence of PmEvent - structures, e.g. sending data from a file or forwarding them - from midi input. - - Use Pm_WriteSysEx() to write a sysex message stored as a contiguous - array of bytes. - - Sysex data may contain embedded real-time messages. -*/ -PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, long length ); - -/* - Pm_WriteShort() writes a timestamped non-system-exclusive midi message. - Messages are delivered in order as received, and timestamps must be - non-decreasing. (But timestamps are ignored if the stream was opened - with latency = 0.) -*/ -PmError Pm_WriteShort( PortMidiStream *stream, PmTimestamp when, long msg); - -/* - Pm_WriteSysEx() writes a timestamped system-exclusive midi message. -*/ -PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* PORT_MIDI_H */ +#ifndef PORT_MIDI_H +#define PORT_MIDI_H +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * PortMidi Portable Real-Time MIDI Library + * PortMidi API Header File + * Latest version available at: http://sourceforge.net/projects/portmedia + * + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * Copyright (c) 2001-2006 Roger B. Dannenberg + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortMidi license; however, + * the PortMusic community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +/* CHANGELOG FOR PORTMIDI + * (see ../CHANGELOG.txt) + * + * NOTES ON HOST ERROR REPORTING: + * + * PortMidi errors (of type PmError) are generic, system-independent errors. + * When an error does not map to one of the more specific PmErrors, the + * catch-all code pmHostError is returned. This means that PortMidi has + * retained a more specific system-dependent error code. The caller can + * get more information by calling Pm_HasHostError() to test if there is + * a pending host error, and Pm_GetHostErrorText() to get a text string + * describing the error. Host errors are reported on a per-device basis + * because only after you open a device does PortMidi have a place to + * record the host error code. I.e. only + * those routines that receive a (PortMidiStream *) argument check and + * report errors. One exception to this is that Pm_OpenInput() and + * Pm_OpenOutput() can report errors even though when an error occurs, + * there is no PortMidiStream* to hold the error. Fortunately, both + * of these functions return any error immediately, so we do not really + * need per-device error memory. Instead, any host error code is stored + * in a global, pmHostError is returned, and the user can call + * Pm_GetHostErrorText() to get the error message (and the invalid stream + * parameter will be ignored.) The functions + * pm_init and pm_term do not fail or raise + * errors. The job of pm_init is to locate all available devices so that + * the caller can get information via PmDeviceInfo(). If an error occurs, + * the device is simply not listed as available. + * + * Host errors come in two flavors: + * a) host error + * b) host error during callback + * These can occur w/midi input or output devices. (b) can only happen + * asynchronously (during callback routines), whereas (a) only occurs while + * synchronously running PortMidi and any resulting system dependent calls. + * Both (a) and (b) are reported by the next read or write call. You can + * also query for asynchronous errors (b) at any time by calling + * Pm_HasHostError(). + * + * NOTES ON COMPILE-TIME SWITCHES + * + * DEBUG assumes stdio and a console. Use this if you want automatic, simple + * error reporting, e.g. for prototyping. If you are using MFC or some + * other graphical interface with no console, DEBUG probably should be + * undefined. + * PM_CHECK_ERRORS more-or-less takes over error checking for return values, + * stopping your program and printing error messages when an error + * occurs. This also uses stdio for console text I/O. + */ + +#ifndef WIN32 +// Linux and OS X have stdint.h +#include <stdint.h> +#else +#ifndef INT32_DEFINED +// rather than having users install a special .h file for windows, +// just put the required definitions inline here. porttime.h uses +// these too, so the definitions are (unfortunately) duplicated there +typedef int int32_t; +typedef unsigned int uint32_t; +#define INT32_DEFINED +#endif +#endif + +#ifdef _WINDLL +#define PMEXPORT __declspec(dllexport) +#else +#define PMEXPORT +#endif + +#ifndef FALSE + #define FALSE 0 +#endif +#ifndef TRUE + #define TRUE 1 +#endif + +/* default size of buffers for sysex transmission: */ +#define PM_DEFAULT_SYSEX_BUFFER_SIZE 1024 + +/** List of portmidi errors.*/ +typedef enum { + pmNoError = 0, + pmNoData = 0, /**< A "no error" return that also indicates no data avail. */ + pmGotData = 1, /**< A "no error" return that also indicates data available */ + pmHostError = -10000, + pmInvalidDeviceId, /** out of range or + * output device when input is requested or + * input device when output is requested or + * device is already opened + */ + pmInsufficientMemory, + pmBufferTooSmall, + pmBufferOverflow, + pmBadPtr, /* PortMidiStream parameter is NULL or + * stream is not opened or + * stream is output when input is required or + * stream is input when output is required */ + pmBadData, /** illegal midi data, e.g. missing EOX */ + pmInternalError, + pmBufferMaxSize /** buffer is already as large as it can be */ + /* NOTE: If you add a new error type, be sure to update Pm_GetErrorText() */ +} PmError; + +/** + Pm_Initialize() is the library initialisation function - call this before + using the library. +*/ +PMEXPORT PmError Pm_Initialize( void ); + +/** + Pm_Terminate() is the library termination function - call this after + using the library. +*/ +PMEXPORT PmError Pm_Terminate( void ); + +/** A single PortMidiStream is a descriptor for an open MIDI device. +*/ +typedef void PortMidiStream; +#define PmStream PortMidiStream + +/** + Test whether stream has a pending host error. Normally, the client finds + out about errors through returned error codes, but some errors can occur + asynchronously where the client does not + explicitly call a function, and therefore cannot receive an error code. + The client can test for a pending error using Pm_HasHostError(). If true, + the error can be accessed and cleared by calling Pm_GetErrorText(). + Errors are also cleared by calling other functions that can return + errors, e.g. Pm_OpenInput(), Pm_OpenOutput(), Pm_Read(), Pm_Write(). The + client does not need to call Pm_HasHostError(). Any pending error will be + reported the next time the client performs an explicit function call on + the stream, e.g. an input or output operation. Until the error is cleared, + no new error codes will be obtained, even for a different stream. +*/ +PMEXPORT int Pm_HasHostError( PortMidiStream * stream ); + + +/** Translate portmidi error number into human readable message. + These strings are constants (set at compile time) so client has + no need to allocate storage +*/ +PMEXPORT const char *Pm_GetErrorText( PmError errnum ); + +/** Translate portmidi host error into human readable message. + These strings are computed at run time, so client has to allocate storage. + After this routine executes, the host error is cleared. +*/ +PMEXPORT void Pm_GetHostErrorText(char * msg, unsigned int len); + +#define HDRLENGTH 50 +#define PM_HOST_ERROR_MSG_LEN 256u /* any host error msg will occupy less + than this number of characters */ + +/** + Device enumeration mechanism. + + Device ids range from 0 to Pm_CountDevices()-1. + +*/ +typedef int PmDeviceID; +#define pmNoDevice -1 +typedef struct { + int structVersion; /**< this internal structure version */ + const char *interf; /**< underlying MIDI API, e.g. MMSystem or DirectX */ + const char *name; /**< device name, e.g. USB MidiSport 1x1 */ + int input; /**< true iff input is available */ + int output; /**< true iff output is available */ + int opened; /**< used by generic PortMidi code to do error checking on arguments */ + +} PmDeviceInfo; + +/** Get devices count, ids range from 0 to Pm_CountDevices()-1. */ +PMEXPORT int Pm_CountDevices( void ); +/** + Pm_GetDefaultInputDeviceID(), Pm_GetDefaultOutputDeviceID() + + Return the default device ID or pmNoDevice if there are no devices. + The result (but not pmNoDevice) can be passed to Pm_OpenMidi(). + + The default device can be specified using a small application + named pmdefaults that is part of the PortMidi distribution. This + program in turn uses the Java Preferences object created by + java.util.prefs.Preferences.userRoot().node("/PortMidi"); the + preference is set by calling + prefs.put("PM_RECOMMENDED_OUTPUT_DEVICE", prefName); + or prefs.put("PM_RECOMMENDED_INPUT_DEVICE", prefName); + + In the statements above, prefName is a string describing the + MIDI device in the form "interf, name" where interf identifies + the underlying software system or API used by PortMdi to access + devices and name is the name of the device. These correspond to + the interf and name fields of a PmDeviceInfo. (Currently supported + interfaces are "MMSystem" for Win32, "ALSA" for Linux, and + "CoreMIDI" for OS X, so in fact, there is no choice of interface.) + In "interf, name", the strings are actually substrings of + the full interface and name strings. For example, the preference + "Core, Sport" will match a device with interface "CoreMIDI" + and name "In USB MidiSport 1x1". It will also match "CoreMIDI" + and "In USB MidiSport 2x2". The devices are enumerated in device + ID order, so the lowest device ID that matches the pattern becomes + the default device. Finally, if the comma-space (", ") separator + between interface and name parts of the preference is not found, + the entire preference string is interpreted as a name, and the + interface part is the empty string, which matches anything. + + On the MAC, preferences are stored in + /Users/$NAME/Library/Preferences/com.apple.java.util.prefs.plist + which is a binary file. In addition to the pmdefaults program, + there are utilities that can read and edit this preference file. + + On the PC, + + On Linux, + +*/ +PMEXPORT PmDeviceID Pm_GetDefaultInputDeviceID( void ); +/** see PmDeviceID Pm_GetDefaultInputDeviceID() */ +PMEXPORT PmDeviceID Pm_GetDefaultOutputDeviceID( void ); + +/** + PmTimestamp is used to represent a millisecond clock with arbitrary + start time. The type is used for all MIDI timestampes and clocks. +*/ +typedef int32_t PmTimestamp; +typedef PmTimestamp (*PmTimeProcPtr)(void *time_info); + +/** TRUE if t1 before t2 */ +#define PmBefore(t1,t2) ((t1-t2) < 0) +/** + \defgroup grp_device Input/Output Devices Handling + @{ +*/ +/** + Pm_GetDeviceInfo() returns a pointer to a PmDeviceInfo structure + referring to the device specified by id. + If id is out of range the function returns NULL. + + The returned structure is owned by the PortMidi implementation and must + not be manipulated or freed. The pointer is guaranteed to be valid + between calls to Pm_Initialize() and Pm_Terminate(). +*/ +PMEXPORT const PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ); + +/** + Pm_OpenInput() and Pm_OpenOutput() open devices. + + stream is the address of a PortMidiStream pointer which will receive + a pointer to the newly opened stream. + + inputDevice is the id of the device used for input (see PmDeviceID above). + + inputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or handle processing. + inputDriverInfo is never required for correct operation. If not used + inputDriverInfo should be NULL. + + outputDevice is the id of the device used for output (see PmDeviceID above.) + + outputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or handle processing. + outputDriverInfo is never required for correct operation. If not used + outputDriverInfo should be NULL. + + For input, the buffersize specifies the number of input events to be + buffered waiting to be read using Pm_Read(). For output, buffersize + specifies the number of output events to be buffered waiting for output. + (In some cases -- see below -- PortMidi does not buffer output at all + and merely passes data to a lower-level API, in which case buffersize + is ignored.) + + latency is the delay in milliseconds applied to timestamps to determine + when the output should actually occur. (If latency is < 0, 0 is assumed.) + If latency is zero, timestamps are ignored and all output is delivered + immediately. If latency is greater than zero, output is delayed until the + message timestamp plus the latency. (NOTE: the time is measured relative + to the time source indicated by time_proc. Timestamps are absolute, + not relative delays or offsets.) In some cases, PortMidi can obtain + better timing than your application by passing timestamps along to the + device driver or hardware. Latency may also help you to synchronize midi + data to audio data by matching midi latency to the audio buffer latency. + + time_proc is a pointer to a procedure that returns time in milliseconds. It + may be NULL, in which case a default millisecond timebase (PortTime) is + used. If the application wants to use PortTime, it should start the timer + (call Pt_Start) before calling Pm_OpenInput or Pm_OpenOutput. If the + application tries to start the timer *after* Pm_OpenInput or Pm_OpenOutput, + it may get a ptAlreadyStarted error from Pt_Start, and the application's + preferred time resolution and callback function will be ignored. + time_proc result values are appended to incoming MIDI data, and time_proc + times are used to schedule outgoing MIDI data (when latency is non-zero). + + time_info is a pointer passed to time_proc. + + Example: If I provide a timestamp of 5000, latency is 1, and time_proc + returns 4990, then the desired output time will be when time_proc returns + timestamp+latency = 5001. This will be 5001-4990 = 11ms from now. + + return value: + Upon success Pm_Open() returns PmNoError and places a pointer to a + valid PortMidiStream in the stream argument. + If a call to Pm_Open() fails a nonzero error code is returned (see + PMError above) and the value of port is invalid. + + Any stream that is successfully opened should eventually be closed + by calling Pm_Close(). + +*/ +PMEXPORT PmError Pm_OpenInput( PortMidiStream** stream, + PmDeviceID inputDevice, + void *inputDriverInfo, + int32_t bufferSize, + PmTimeProcPtr time_proc, + void *time_info ); + +PMEXPORT PmError Pm_OpenOutput( PortMidiStream** stream, + PmDeviceID outputDevice, + void *outputDriverInfo, + int32_t bufferSize, + PmTimeProcPtr time_proc, + void *time_info, + int32_t latency ); + /** @} */ + +/** + \defgroup grp_events_filters Events and Filters Handling + @{ +*/ + +/* \function PmError Pm_SetFilter( PortMidiStream* stream, int32_t filters ) + Pm_SetFilter() sets filters on an open input stream to drop selected + input types. By default, only active sensing messages are filtered. + To prohibit, say, active sensing and sysex messages, call + Pm_SetFilter(stream, PM_FILT_ACTIVE | PM_FILT_SYSEX); + + Filtering is useful when midi routing or midi thru functionality is being + provided by the user application. + For example, you may want to exclude timing messages (clock, MTC, start/stop/continue), + while allowing note-related messages to pass. + Or you may be using a sequencer or drum-machine for MIDI clock information but want to + exclude any notes it may play. + */ + +/* Filter bit-mask definitions */ +/** filter active sensing messages (0xFE): */ +#define PM_FILT_ACTIVE (1 << 0x0E) +/** filter system exclusive messages (0xF0): */ +#define PM_FILT_SYSEX (1 << 0x00) +/** filter MIDI clock message (0xF8) */ +#define PM_FILT_CLOCK (1 << 0x08) +/** filter play messages (start 0xFA, stop 0xFC, continue 0xFB) */ +#define PM_FILT_PLAY ((1 << 0x0A) | (1 << 0x0C) | (1 << 0x0B)) +/** filter tick messages (0xF9) */ +#define PM_FILT_TICK (1 << 0x09) +/** filter undefined FD messages */ +#define PM_FILT_FD (1 << 0x0D) +/** filter undefined real-time messages */ +#define PM_FILT_UNDEFINED PM_FILT_FD +/** filter reset messages (0xFF) */ +#define PM_FILT_RESET (1 << 0x0F) +/** filter all real-time messages */ +#define PM_FILT_REALTIME (PM_FILT_ACTIVE | PM_FILT_SYSEX | PM_FILT_CLOCK | \ + PM_FILT_PLAY | PM_FILT_UNDEFINED | PM_FILT_RESET | PM_FILT_TICK) +/** filter note-on and note-off (0x90-0x9F and 0x80-0x8F */ +#define PM_FILT_NOTE ((1 << 0x19) | (1 << 0x18)) +/** filter channel aftertouch (most midi controllers use this) (0xD0-0xDF)*/ +#define PM_FILT_CHANNEL_AFTERTOUCH (1 << 0x1D) +/** per-note aftertouch (0xA0-0xAF) */ +#define PM_FILT_POLY_AFTERTOUCH (1 << 0x1A) +/** filter both channel and poly aftertouch */ +#define PM_FILT_AFTERTOUCH (PM_FILT_CHANNEL_AFTERTOUCH | PM_FILT_POLY_AFTERTOUCH) +/** Program changes (0xC0-0xCF) */ +#define PM_FILT_PROGRAM (1 << 0x1C) +/** Control Changes (CC's) (0xB0-0xBF)*/ +#define PM_FILT_CONTROL (1 << 0x1B) +/** Pitch Bender (0xE0-0xEF*/ +#define PM_FILT_PITCHBEND (1 << 0x1E) +/** MIDI Time Code (0xF1)*/ +#define PM_FILT_MTC (1 << 0x01) +/** Song Position (0xF2) */ +#define PM_FILT_SONG_POSITION (1 << 0x02) +/** Song Select (0xF3)*/ +#define PM_FILT_SONG_SELECT (1 << 0x03) +/** Tuning request (0xF6)*/ +#define PM_FILT_TUNE (1 << 0x06) +/** All System Common messages (mtc, song position, song select, tune request) */ +#define PM_FILT_SYSTEMCOMMON (PM_FILT_MTC | PM_FILT_SONG_POSITION | PM_FILT_SONG_SELECT | PM_FILT_TUNE) + + +PMEXPORT PmError Pm_SetFilter( PortMidiStream* stream, int32_t filters ); + +#define Pm_Channel(channel) (1<<(channel)) +/** + Pm_SetChannelMask() filters incoming messages based on channel. + The mask is a 16-bit bitfield corresponding to appropriate channels. + The Pm_Channel macro can assist in calling this function. + i.e. to set receive only input on channel 1, call with + Pm_SetChannelMask(Pm_Channel(1)); + Multiple channels should be OR'd together, like + Pm_SetChannelMask(Pm_Channel(10) | Pm_Channel(11)) + + Note that channels are numbered 0 to 15 (not 1 to 16). Most + synthesizer and interfaces number channels starting at 1, but + PortMidi numbers channels starting at 0. + + All channels are allowed by default +*/ +PMEXPORT PmError Pm_SetChannelMask(PortMidiStream *stream, int mask); + +/** + Pm_Abort() terminates outgoing messages immediately + The caller should immediately close the output port; + this call may result in transmission of a partial midi message. + There is no abort for Midi input because the user can simply + ignore messages in the buffer and close an input device at + any time. + */ +PMEXPORT PmError Pm_Abort( PortMidiStream* stream ); + +/** + Pm_Close() closes a midi stream, flushing any pending buffers. + (PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows.) +*/ +PMEXPORT PmError Pm_Close( PortMidiStream* stream ); + +/** + Pm_Synchronize() instructs PortMidi to (re)synchronize to the + time_proc passed when the stream was opened. Typically, this + is used when the stream must be opened before the time_proc + reference is actually advancing. In this case, message timing + may be erratic, but since timestamps of zero mean + "send immediately," initialization messages with zero timestamps + can be written without a functioning time reference and without + problems. Before the first MIDI message with a non-zero + timestamp is written to the stream, the time reference must + begin to advance (for example, if the time_proc computes time + based on audio samples, time might begin to advance when an + audio stream becomes active). After time_proc return values + become valid, and BEFORE writing the first non-zero timestamped + MIDI message, call Pm_Synchronize() so that PortMidi can observe + the difference between the current time_proc value and its + MIDI stream time. + + In the more normal case where time_proc + values advance continuously, there is no need to call + Pm_Synchronize. PortMidi will always synchronize at the + first output message and periodically thereafter. +*/ +PmError Pm_Synchronize( PortMidiStream* stream ); + + +/** + Pm_Message() encodes a short Midi message into a 32-bit word. If data1 + and/or data2 are not present, use zero. + + Pm_MessageStatus(), Pm_MessageData1(), and + Pm_MessageData2() extract fields from a 32-bit midi message. +*/ +#define Pm_Message(status, data1, data2) \ + ((((data2) << 16) & 0xFF0000) | \ + (((data1) << 8) & 0xFF00) | \ + ((status) & 0xFF)) +#define Pm_MessageStatus(msg) ((msg) & 0xFF) +#define Pm_MessageData1(msg) (((msg) >> 8) & 0xFF) +#define Pm_MessageData2(msg) (((msg) >> 16) & 0xFF) + +typedef int32_t PmMessage; /**< see PmEvent */ +/** + All midi data comes in the form of PmEvent structures. A sysex + message is encoded as a sequence of PmEvent structures, with each + structure carrying 4 bytes of the message, i.e. only the first + PmEvent carries the status byte. + + Note that MIDI allows nested messages: the so-called "real-time" MIDI + messages can be inserted into the MIDI byte stream at any location, + including within a sysex message. MIDI real-time messages are one-byte + messages used mainly for timing (see the MIDI spec). PortMidi retains + the order of non-real-time MIDI messages on both input and output, but + it does not specify exactly how real-time messages are processed. This + is particulary problematic for MIDI input, because the input parser + must either prepare to buffer an unlimited number of sysex message + bytes or to buffer an unlimited number of real-time messages that + arrive embedded in a long sysex message. To simplify things, the input + parser is allowed to pass real-time MIDI messages embedded within a + sysex message, and it is up to the client to detect, process, and + remove these messages as they arrive. + + When receiving sysex messages, the sysex message is terminated + by either an EOX status byte (anywhere in the 4 byte messages) or + by a non-real-time status byte in the low order byte of the message. + If you get a non-real-time status byte but there was no EOX byte, it + means the sysex message was somehow truncated. This is not + considered an error; e.g., a missing EOX can result from the user + disconnecting a MIDI cable during sysex transmission. + + A real-time message can occur within a sysex message. A real-time + message will always occupy a full PmEvent with the status byte in + the low-order byte of the PmEvent message field. (This implies that + the byte-order of sysex bytes and real-time message bytes may not + be preserved -- for example, if a real-time message arrives after + 3 bytes of a sysex message, the real-time message will be delivered + first. The first word of the sysex message will be delivered only + after the 4th byte arrives, filling the 4-byte PmEvent message field. + + The timestamp field is observed when the output port is opened with + a non-zero latency. A timestamp of zero means "use the current time", + which in turn means to deliver the message with a delay of + latency (the latency parameter used when opening the output port.) + Do not expect PortMidi to sort data according to timestamps -- + messages should be sent in the correct order, and timestamps MUST + be non-decreasing. See also "Example" for Pm_OpenOutput() above. + + A sysex message will generally fill many PmEvent structures. On + output to a PortMidiStream with non-zero latency, the first timestamp + on sysex message data will determine the time to begin sending the + message. PortMidi implementations may ignore timestamps for the + remainder of the sysex message. + + On input, the timestamp ideally denotes the arrival time of the + status byte of the message. The first timestamp on sysex message + data will be valid. Subsequent timestamps may denote + when message bytes were actually received, or they may be simply + copies of the first timestamp. + + Timestamps for nested messages: If a real-time message arrives in + the middle of some other message, it is enqueued immediately with + the timestamp corresponding to its arrival time. The interrupted + non-real-time message or 4-byte packet of sysex data will be enqueued + later. The timestamp of interrupted data will be equal to that of + the interrupting real-time message to insure that timestamps are + non-decreasing. + */ +typedef struct { + PmMessage message; + PmTimestamp timestamp; +} PmEvent; + +/** + @} +*/ +/** \defgroup grp_io Reading and Writing Midi Messages + @{ +*/ +/** + Pm_Read() retrieves midi data into a buffer, and returns the number + of events read. Result is a non-negative number unless an error occurs, + in which case a PmError value will be returned. + + Buffer Overflow + + The problem: if an input overflow occurs, data will be lost, ultimately + because there is no flow control all the way back to the data source. + When data is lost, the receiver should be notified and some sort of + graceful recovery should take place, e.g. you shouldn't resume receiving + in the middle of a long sysex message. + + With a lock-free fifo, which is pretty much what we're stuck with to + enable portability to the Mac, it's tricky for the producer and consumer + to synchronously reset the buffer and resume normal operation. + + Solution: the buffer managed by PortMidi will be flushed when an overflow + occurs. The consumer (Pm_Read()) gets an error message (pmBufferOverflow) + and ordinary processing resumes as soon as a new message arrives. The + remainder of a partial sysex message is not considered to be a "new + message" and will be flushed as well. + +*/ +PMEXPORT int Pm_Read( PortMidiStream *stream, PmEvent *buffer, int32_t length ); + +/** + Pm_Poll() tests whether input is available, + returning TRUE, FALSE, or an error value. +*/ +PMEXPORT PmError Pm_Poll( PortMidiStream *stream); + +/** + Pm_Write() writes midi data from a buffer. This may contain: + - short messages + or + - sysex messages that are converted into a sequence of PmEvent + structures, e.g. sending data from a file or forwarding them + from midi input. + + Use Pm_WriteSysEx() to write a sysex message stored as a contiguous + array of bytes. + + Sysex data may contain embedded real-time messages. +*/ +PMEXPORT PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, int32_t length ); + +/** + Pm_WriteShort() writes a timestamped non-system-exclusive midi message. + Messages are delivered in order as received, and timestamps must be + non-decreasing. (But timestamps are ignored if the stream was opened + with latency = 0.) +*/ +PMEXPORT PmError Pm_WriteShort( PortMidiStream *stream, PmTimestamp when, int32_t msg); + +/** + Pm_WriteSysEx() writes a timestamped system-exclusive midi message. +*/ +PMEXPORT PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg); + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PORT_MIDI_H */ diff --git a/pd/portmidi/pm_csharp/README.txt b/pd/portmidi/pm_csharp/README.txt new file mode 100644 index 000000000..06a1ad4e3 --- /dev/null +++ b/pd/portmidi/pm_csharp/README.txt @@ -0,0 +1,20 @@ +This code was offered by Aaron Oxford as is. The pm_managed directory contains the code. If you develop a more complete C# wrapper for PortMidi, please consider contributing your code to the project. -RBD + +---- from Aaron Oxford ---- + +I've attached the managed C++ project which I've inserted into my 2005 version of PortMIDI's VS solution. I wouldn't think the functions I've implemented would have changed so it all should still work with the latest version of PM. Obviously you won't want to permanently embed this since it means the whole solution can only be built under VS2005, but it's easy for a VS2005 user to insert the project after the solution is converted or even just build it separately. + +Making the managed wrapper turned out to be dead easy in the end (it was more of a battle finding the correct build settings & SDK's and learning to configure VS than anything else). Anyone wanting to use something I've not implemented yet simply needs to add more stubs like this + + int Pm_Initialize() + { + ::Pm_Initialize(); + return 0; + } + +to the code. To call from C# it's just a matter of + + ManagedPortMIDI mpm = new ManagedPortMIDI(); + int err = mpm.Pm_Initialize(); + +Anyway as the little code example above indicates, the support really is basic and more likely than not to break at the first hint of something unexpected. As I said, I'd be happy to contribute but I don't think there's much to contribute yet. :-) diff --git a/pd/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp b/pd/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp new file mode 100755 index 000000000..57874f89b --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/AssemblyInfo.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" + +using namespace System; +using namespace System::Reflection; +using namespace System::Runtime::CompilerServices; +using namespace System::Runtime::InteropServices; +using namespace System::Security::Permissions; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly:AssemblyTitleAttribute("pm_managed")]; +[assembly:AssemblyDescriptionAttribute("")]; +[assembly:AssemblyConfigurationAttribute("")]; +[assembly:AssemblyCompanyAttribute("Innovative Computer Solutions")]; +[assembly:AssemblyProductAttribute("pm_managed")]; +[assembly:AssemblyCopyrightAttribute("Copyright (c) Innovative Computer Solutions 2006")]; +[assembly:AssemblyTrademarkAttribute("")]; +[assembly:AssemblyCultureAttribute("")]; + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the value or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly:AssemblyVersionAttribute("1.0.*")]; + +[assembly:ComVisible(false)]; + +[assembly:CLSCompliantAttribute(true)]; + +[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; diff --git a/pd/portmidi/pm_csharp/pm_managed/ReadMe.txt b/pd/portmidi/pm_csharp/pm_managed/ReadMe.txt new file mode 100755 index 000000000..90317613a --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/ReadMe.txt @@ -0,0 +1,31 @@ +======================================================================== + DYNAMIC LINK LIBRARY : pm_managed Project Overview +======================================================================== + +AppWizard has created this pm_managed DLL for you. + +This file contains a summary of what you will find in each of the files that +make up your pm_managed application. + +pm_managed.vcproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +pm_managed.cpp + This is the main DLL source file. + +pm_managed.h + This file contains a class declaration. + +AssemblyInfo.cpp + Contains custom attributes for modifying assembly metadata. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/pd/portmidi/pm_csharp/pm_managed/Stdafx.cpp b/pd/portmidi/pm_csharp/pm_managed/Stdafx.cpp new file mode 100755 index 000000000..6355f12e4 --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/Stdafx.cpp @@ -0,0 +1,5 @@ +// stdafx.cpp : source file that includes just the standard includes +// pm_managed.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" diff --git a/pd/portmidi/pm_csharp/pm_managed/Stdafx.h b/pd/portmidi/pm_csharp/pm_managed/Stdafx.h new file mode 100755 index 000000000..2e525d43f --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/Stdafx.h @@ -0,0 +1,7 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#pragma once + + diff --git a/pd/portmidi/pm_csharp/pm_managed/app.ico b/pd/portmidi/pm_csharp/pm_managed/app.ico new file mode 100755 index 0000000000000000000000000000000000000000..3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6 GIT binary patch literal 1078 zcmeHHJr05}7=1t!Hp3A*8IHkVf+j?-!eHY14Gtcw1Eb*_9>Bq^zETJ@GKj{_2j4$w zo9}xCh!8{T3=X##Skq>ikMjsvB|y%crWBM2iW(4pI}c%z6%lW!=~4v77#3{z!dmB1 z__&l)-{KUYR+|8|;wB^R|9ET$J@(@=#rd^=)qs85?vAy(PSF5CyNkus435LVkZ$rj zNw|JG-P7^hF<(;#o*Vk}5R#e|^13tBbQkeF?djULtvqyxd3<cQetc!+$5J+aVZ&1f Qa92%&%o_p!1^%7_Ps0Y#2><{9 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_csharp/pm_managed/app.rc b/pd/portmidi/pm_csharp/pm_managed/app.rc new file mode 100755 index 000000000..bc5b261d9 --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/app.rc @@ -0,0 +1,63 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon placed first or with lowest ID value becomes application icon + +LANGUAGE 9, 3 +#pragma code_page(1252) +1 ICON "app.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" + "\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\0" +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/pd/portmidi/pm_csharp/pm_managed/pm_managed.cpp b/pd/portmidi/pm_csharp/pm_managed/pm_managed.cpp new file mode 100755 index 000000000..d2a1440e3 --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/pm_managed.cpp @@ -0,0 +1,6 @@ +// This is the main DLL file. + +#include "stdafx.h" + +#include "pm_managed.h" + diff --git a/pd/portmidi/pm_csharp/pm_managed/pm_managed.h b/pd/portmidi/pm_csharp/pm_managed/pm_managed.h new file mode 100755 index 000000000..580670385 --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/pm_managed.h @@ -0,0 +1,53 @@ +// pm_managed.h + +#pragma once + +#include "portmidi.h" + +using namespace System; + +namespace pm_managed { + + + public ref class MpmDeviceInfo + { + public: + int structVersion; + System::String^ interf; /* underlying MIDI API, e.g. MMSystem or DirectX */ + System::String^ name; /* device name, e.g. USB MidiSport 1x1 */ + bool input; /* true iff input is available */ + bool output; /* true iff output is available */ + int opened; /* used by generic PortMidi code to do error checking on arguments */ + + MpmDeviceInfo(const PmDeviceInfo* info) + { + structVersion = info->structVersion; + input = (info->input != 0); + output = (info->output != 0); + opened = info->opened; + + interf = gcnew System::String(info->interf); + name = gcnew System::String(info->name); + } + }; + + public ref class ManagedPortMIDI + { + public: + int Pm_Initialize() + { + ::Pm_Initialize(); + return 0; + } + + int Pm_CountDevices() + { + return ::Pm_CountDevices(); + } + + MpmDeviceInfo^ Pm_GetDeviceInfo(int id) + { + return gcnew MpmDeviceInfo(::Pm_GetDeviceInfo(id)); + } + }; +} diff --git a/pd/portmidi/pm_csharp/pm_managed/pm_managed.vcproj b/pd/portmidi/pm_csharp/pm_managed/pm_managed.vcproj new file mode 100755 index 000000000..e60d58f4a --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/pm_managed.vcproj @@ -0,0 +1,260 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="pm_managed" + ProjectGUID="{65AABD9A-F5E3-4A30-8BC3-9C732B5447CF}" + RootNamespace="pm_managed" + Keyword="ManagedCProj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)pm_managed\$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + ManagedExtensions="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../pm_common" + PreprocessorDefinitions="WIN32;_DEBUG" + RuntimeLibrary="3" + UsePrecompiledHeader="2" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(NoInherit) winmm.lib ..\pm_win\Debug\portmidi.lib ..\porttime\Debug\porttime.lib ..\pm_win\Debug\pm_dll.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + AssemblyDebug="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)pm_managed\$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + ManagedExtensions="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + FavorSizeOrSpeed="1" + AdditionalIncludeDirectories="../pm_common" + PreprocessorDefinitions="WIN32;NDEBUG" + RuntimeLibrary="2" + UsePrecompiledHeader="2" + WarningLevel="3" + DebugInformationFormat="0" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(NoInherit) winmm.lib ..\pm_win\Release\portmidi.lib ..\porttime\Release\porttime.lib ..\pm_win\Release\pm_dll.lib" + LinkIncremental="1" + ManifestFile="$(OutDir)\pm_managed.dll.manifest" + GenerateDebugInformation="false" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + OutputManifestFile="$(OutDir)\pm_managed.dll.manifest" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="rem mt.exe –manifest Release\pm_managed.dll.manifest -outputresource:Release\pm_managed.dll;2" + /> + </Configuration> + </Configurations> + <References> + <AssemblyReference + RelativePath="System.dll" + AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + /> + <AssemblyReference + RelativePath="System.Data.dll" + AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86" + /> + <AssemblyReference + RelativePath="System.XML.dll" + AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" + /> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\AssemblyInfo.cpp" + > + </File> + <File + RelativePath=".\pm_managed.cpp" + > + </File> + <File + RelativePath=".\Stdafx.cpp" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="1" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\pm_managed.h" + > + </File> + <File + RelativePath=".\resource.h" + > + </File> + <File + RelativePath=".\Stdafx.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + <File + RelativePath=".\app.ico" + > + </File> + <File + RelativePath=".\app.rc" + > + </File> + </Filter> + <File + RelativePath=".\ReadMe.txt" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_csharp/pm_managed/resource.h b/pd/portmidi/pm_csharp/pm_managed/resource.h new file mode 100755 index 000000000..1f2251c2b --- /dev/null +++ b/pd/portmidi/pm_csharp/pm_managed/resource.h @@ -0,0 +1,3 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by app.rc diff --git a/pd/portmidi/pm_dylib/CMakeLists.txt b/pd/portmidi/pm_dylib/CMakeLists.txt new file mode 100644 index 000000000..f693dd651 --- /dev/null +++ b/pd/portmidi/pm_dylib/CMakeLists.txt @@ -0,0 +1,127 @@ +# pm_dylib + +# set the build directory for libraries to be in portmidi, not in +# portmidi/pm_dylib +if(APPLE OR WIN32) + # set the build directory for .dylib libraries + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + # the "archive" output directory says where to put portmidi.lib, the + # static part of the lib/dll pair: + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + + # the first time CMake configures, save off CMake's built-in flags + if(NOT DEFAULT_DEBUG_FLAGS) + set(DEFAULT_DEBUG_FLAGS ${CMAKE_C_FLAGS_DEBUG} CACHE + STRING "CMake's default debug flags" FORCE) + set(DEFAULT_RELEASE_FLAGS ${CMAKE_C_FLAGS_RELEASE} CACHE + STRING "CMake's default release flags" FORCE) + else(NOT DEFAULT_DEBUG_FLAGS) + message(STATUS "DEFAULT_DEBUG_FLAGS not nil: " ${DEFAULT_DEBUG_FLAGS}) + endif(NOT DEFAULT_DEBUG_FLAGS) +else(APPLE OR WIN32) + set(LINUX_FLAGS "-DPMALSA") +endif(APPLE OR WIN32) + +macro(prepend_path RESULT PATH) + set(${RESULT}) + foreach(FILE ${ARGN}) + list(APPEND ${RESULT} "${PATH}${FILE}") + endforeach(FILE) +endmacro(prepend_path) + +set(CMAKE_C_FLAGS_DEBUG + "${DEFAULT_DEBUG_FLAGS} -DPM_CHECK_ERRORS=1 -DDEBUG ${LINUX_FLAGS}" + CACHE STRING "enable extra checks for debugging" FORCE) + +set(CMAKE_C_FLAGS_RELEASE "${DEFAULT_RELEASE_FLAGS} ${LINUX_FLAGS}" + CACHE STRING "flags for release version" FORCE) + +# first include the appropriate system-dependent file: +if(UNIX) + # add the -g switch for Linux and Mac OS X (not used in Win32) + set (CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}" + CACHE STRING "enable extra checks for debugging" FORCE) + if(APPLE) + set(MACSRC pmmacosxcm pmmac readbinaryplist finddefault) + prepend_path(LIBSRC ../pm_mac/ ${MACSRC}) + list(APPEND LIBSRC ../porttime/ptmacosx_mach) + + include_directories(${CMAKE_OSX_SYSROOT}/Developer/Headers/FlatCarbon) + set(FRAMEWORK_PATH ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks) + set(COREAUDIO_LIB "${FRAMEWORK_PATH}/CoreAudio.framework") + set(COREFOUNDATION_LIB "${FRAMEWORK_PATH}/CoreFoundation.framework") + set(COREMIDI_LIB "${FRAMEWORK_PATH}/CoreMIDI.framework") + set(CORESERVICES_LIB "${FRAMEWORK_PATH}/CoreServices.framework") + set(PM_NEEDED_LIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB} + ${COREMIDI_LIB} ${CORESERVICES_LIB} + CACHE INTERNAL "") + + set(JAVAVM_LIB "${FRAMEWORK_PATH}/JavaVM.framework") + set(JAVA_INCLUDE_PATHS ${JAVAVM_LIB}/Headers) + set(INSTALL_NAME_DIR "/usr/local/lib") + message(STATUS "SYSROOT: " ${CMAKE_OSX_SYSROOT}) + else(APPLE) + # LINUX settings... + include(FindJNI) + # message(STATUS "JAVA_JVM_LIB_PATH is " ${JAVA_JVM_LIB_PATH}) + # message(STATUS "JAVA_INCLUDE_PATH is " ${JAVA_INCLUDE_PATH}) + # note: should use JAVA_JVM_LIB_PATH, but it is not set properly + # note: user might need to set JAVA_INCLUDE_PATH manually + # + # this will probably break on BSD and other Unix systems; the fix + # depends on whether FindJNI can find Java or not. If yes, then + # we should try to rely on automatically set JAVA_INCLUDE_PATH and + # JAVA_INCLUDE_PATH2; if no, then we need to make both JAVA_INCLUDE_PATH + # and JAVA_INCLUDE_PATH2 set by user (will need clear documentation + # because JAVA_INCLUDE_PATH2 is pretty obscure) + set(JAVA_INCLUDE_PATH ${JAVA_INCLUDE_PATH-UNKNOWN} + CACHE STRING "where to find Java SDK include directory") + set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH}/linux) + # libjvm.so is found relative to JAVA_INCLUDE_PATH: + set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../jre/lib/i386/client/libjvm.so) + + set(LINUXSRC pmlinuxalsa pmlinux finddefault) + prepend_path(LIBSRC ../pm_linux/ ${LINUXSRC}) + list(APPEND LIBSRC ../porttime/ptlinux) + + set(PM_NEEDED_LIBS pthread asound) + endif(APPLE) +else(UNIX) + if(WIN32) + # /MDd is multithread debug DLL, /MTd is multithread debug + # /MD is multithread DLL, /MT is multithread + + include(FindJNI) + # note: should use JAVA_JVM_LIB_PATH, but it is not set properly + set(JAVAVM_LIB ${JAVA_INCLUDE_PATH}/../lib/jvm.lib) + + set(JAVA_INCLUDE_PATHS ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) + # message(STATUS "JAVA_INCLUDE_PATHS: " ${JAVA_INCLUDE_PATHS}) + + set(WINSRC pmwin pmwinmm) + prepend_path(LIBSRC ../pm_win/ ${WINSRC}) + list(APPEND LIBSRC ../porttime/ptwinmm) + set(PM_NEEDED_LIBS winmm.lib) + # message(STATUS "JAVAVM_LIB: " ${JAVAVM_LIB}) + endif(WIN32) +endif(UNIX) +set(JNI_EXTRA_LIBS ${PM_NEEDED_LIBS} ${JAVAVM_LIB}) + +# this completes the list of library sources by adding shared code +set(SHARED_FILES pmutil portmidi) +prepend_path(SHARED_PATHS ../pm_common/ ${SHARED_FILES}) +list(APPEND LIBSRC ${SHARED_PATHS}) + +add_library(portmidi-dynamic SHARED ${LIBSRC}) +set_target_properties(portmidi-dynamic PROPERTIES OUTPUT_NAME "portmidi") +target_link_libraries(portmidi-dynamic ${PM_NEEDED_LIBS}) + +# install the libraries (Linux and Mac OS X command line) +if(UNIX) + INSTALL(TARGETS portmidi-dynamic + LIBRARY DESTINATION /usr/local/lib + ARCHIVE DESTINATION /usr/local/lib) + INSTALL(FILES ../pm_common/portmidi.h ../porttime/porttime.h + DESTINATION /usr/local/include) +endif(UNIX) diff --git a/pd/portmidi/pm_dylib/README.txt b/pd/portmidi/pm_dylib/README.txt new file mode 100644 index 000000000..b7769700b --- /dev/null +++ b/pd/portmidi/pm_dylib/README.txt @@ -0,0 +1,11 @@ +pm_dylib + +The purpose of this directory is to provide a separate CMakeLists.txt +file for building a dynamic link library version of portmidi. This +version (in Windows) is linked using the Multithreaded C Runtime DLL +whereas the static library version in ../pm_common uses the (static) +Multithreaded C Runtime. There's no good reason not to build both +versions of portmidi in ../pm_common, but (the current) Cmake +has the restriction that you must either share compiler flags across +configurations (debug and release) or across targets (static and +dynamic). Here, we need individual settings for all combinations. diff --git a/pd/portmidi/pm_dylib/portmidi-dynamic.vcproj b/pd/portmidi/pm_dylib/portmidi-dynamic.vcproj new file mode 100644 index 000000000..161b7d1f0 --- /dev/null +++ b/pd/portmidi/pm_dylib/portmidi-dynamic.vcproj @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="portmidi-dynamic" + ProjectGUID="{7283FAD1-7415-4061-A19A-FF5C7BCE9306}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="portmidi-dynamic.dir\Debug" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="3" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Debug/portmidi.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\",portmidi_dynamic_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib " + OutputFile="..\Debug\portmidi.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="..\Debug\portmidi.pdb" + GenerateDebugInformation="TRUE" + ImportLibrary="..\Debug\portmidi.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="portmidi-dynamic.dir\Release" + ConfigurationType="2" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="2" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../Release/portmidi.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS"/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\",portmidi_dynamic_EXPORTS" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib winmm.lib " + OutputFile="..\Release\portmidi.dll" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="..\Release\portmidi.pdb" + ImportLibrary="..\Release\portmidi.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_win\pmwin.c"> + </File> + <File + RelativePath="..\pm_win\pmwinmm.c"> + </File> + <File + RelativePath="..\porttime\ptwinmm.c"> + </File> + <File + RelativePath="..\pm_common\pmutil.c"> + </File> + <File + RelativePath="..\pm_common\portmidi.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_java/CMakeLists.txt b/pd/portmidi/pm_java/CMakeLists.txt new file mode 100644 index 000000000..a35062027 --- /dev/null +++ b/pd/portmidi/pm_java/CMakeLists.txt @@ -0,0 +1,47 @@ +# pm_java + +if(UNIX) + if(APPLE) + # java not dealt with in CMake -- see pm_mac/pm_mac.xcodeproj + else(APPLE) + # linux + set(JPORTMIDICLASS JPortMidi.class JPortMidiException.class + JPortMidiApi.class) + set(PMDEFAULTSCLASS PmDefaultsFrame.class PmDefaults.class) + prepend_path(JPORTMIDICLASS2 jportmidi/ ${JPORTMIDICLASS}) + prepend_path(PMDEFAULTSCLASS2 pmdefaults/ ${PMDEFAULTSCLASS}) + set(PMDEFAULTS_ALL_CLASSES ${JPORTMIDICLASS2} ${PMDEFAULTSCLASS2}) + # message(STATUS "PMDEFAULTS_ALL_CLASSES is " ${PMDEFAULTS_ALL_CLASSES}) + add_custom_command(OUTPUT pmdefaults/PmDefaultsFrame.class + COMMAND javac -classpath . pmdefaults/PmDefaultsFrame.java + MAIN_DEPENDENCY pmdefaults/PmDefaultsFrame.java + DEPENDS pmdefaults/PmDefaults.java + WORKING_DIRECTORY pm_java) + add_custom_command(OUTPUT pmdefaults/PmDefaults.class + COMMAND javac -classpath . pmdefaults/PmDefaults.java + MAIN_DEPENDENCY pmdefaults/PmDefaults.java + DEPENDS pmdefaults/PmDefaultsFrame.java + WORKING_DIRECTORY pm_java) + add_custom_command(OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar + COMMAND cp pmdefaults/portmusic_logo.png . + COMMAND jar cmf pmdefaults/manifest.txt pmdefaults.jar + pmdefaults/*.class portmusic_logo.png jportmidi/*.class + COMMAND chmod +x pmdefaults/pmdefaults + COMMAND cp pmdefaults/pmdefaults ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + COMMAND mv pmdefaults.jar ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + COMMAND rm portmusic_logo.png + MAIN_DEPENDENCY pmdefaults/PmDefaults.class + DEPENDS ${PMDEFAULTS_ALL_CLASSES} + WORKING_DIRECTORY pm_java) + add_custom_target(pmdefaults_target ALL + DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar) + # message(STATUS "add_custom_target: pmdefaults.jar") + + # install the libraries (Linux only) + INSTALL(FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar + DESTINATION /usr/share/java) + INSTALL(PROGRAMS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults + DESTINATION /usr/local/bin) + endif(APPLE) +endif(UNIX) +# In windows, use pm_java/make.bat diff --git a/pd/portmidi/pm_java/JavaExe.exe b/pd/portmidi/pm_java/JavaExe.exe new file mode 100644 index 0000000000000000000000000000000000000000..8886d2e8672f2b443657675e51c9be7a7248045d GIT binary patch literal 131072 zcmeFae|+3Uwg10KH|bKg-7Rd|06_vQ5~V;i1qx{~g|-$fxSKS)Erk}f=$pNWh`WGV zO6w*<`X*Sla`Ar9OK$Os!d1K%wN-?al$I)D0fi!p6}dW?B2}<0zq;S&Yv#S1O=(d- z-_M`6kL>RI%*>fHXU?2CbLPyv&%0oCXiO*+3iDSgg+lB2*1rz>`PLshNuF@j4<>}} zIq0WHudA8&)1&8mmwux8iYq_%kt;v&(dG|*;PT5qmT&&xCCyhBE^of{^5$9Z?`r<& z$Ch4l()jV?k^$;<hqg?8{mMBXDgRx6`MDq2!}AwEdfrFg;QPAE=YHfx`#kR>U*r3$ zAMO6gZoXf?^1UDF;rrF}ypIg?-Jb8T`8zNDkSAORqC7P_6q;8P4xROxt^9KTwufRh z2iMexLd`XyP@F&hJ+PjSIDf5r?r^_(7N7L5{2l73b!ou(#XmBsT;;oxEMTbP)SA#W z`mwzx^w0(R@&D)_bnbAZ?-$`o`Ae?JlQQ=RwUHmTt)sIxhe8*hbmh_y<UbG!O`S-Z z+78h1fbZa62hBLiWeW}Z08`{k1>Zp)eRYIFgC|}2i7P+EZ`)Sd9J-i?+xV{f*I~0( z0si^(pB(rn2mZ-{e{$fT9QY>({>g!Va^RmF_$LSc$$@`z;Qu)XGJZZ8$>zpqOy^fZ zq2k6!?_eR88<#O>mml+EHibgD85#5OTSFm#kFu0vJ#9D*GMmPR%%>-WLhto=X3drS z@a{^_3}yU1=E2D|AdB}7#(G|3S?t{=xcRn)Qbnxie+9kKLccr$T_@-@7FryE{)eEK zS?EVcpr01>VhhcVKraz=zJ<;lfu1SoTnjy61ll6#Gz)DQfxgD#)Js}uX_8vu=oK_! zq0f&%?-Mj^p^uM1?-2C$lv@0w5$G2L-D#m;AAv3tbi0Lqegyh{LAP4yr$?Zt3wp1G zUNQoW3VMfyzJCO|3rX>AvCz{;pj!mJ!9tH6f&P!6c?%ss0=-eti!F3_L%@gpr@Z+V z^1l^G+M8t|k5?e?@upkIh6-eo*J>f(E<<9yFM&O4PKecnQsyCi4X}A_^r4xdC5wl$ zCSk$f3BZvu_>Bo7BfK_T2J8TkGJQe5P#OFS3%)V{zrH!ZdY=U^3c!2H;I9W*UoHb~ zR=%}6c{FF@DS<Le)OA6=9p!wN2LMwBT%>~LRaa*1b7k<HAm4TeSUu`rChM(3esVRr zP^lsLu9=~feoWC1(|oWSaN*uk{v9jc6UrxZ<Fe+Dw*cKKvD}ppZ>kT?$(qw%FO^`7 zzqfZ+;Yo<Cs==R?jQI1C;gvh&vdW~==HDg<<2--9cP~|^%)Eaa!Fa~5Inj9GgiQbZ zWW*~m$UDvVzN`Y#-obpLe^xR~f4x>Jt(p_1#yjHqUu4XCY=-dSl^az@b?vKHyL#87 z8$xY^8ULPSge=+n#fz8j%z!WI4O$|836lPK$wb;r8ebEl`o^{DqE0iGNB`brl5%U+ zm)VRtzEmplHMm#JPA;jgcwMwL6f(aDSyy+azbDzK>cHESN^hQ(Y=(@GiA1Stjl~E7 z$<CC?fRId6JkgalyQjdAZN-g^y-)XDm`oH7Ub6V2MJqQ7^-!02>O}D)+&3$Ue)~~t z=gd&P?nkS?G&AJ)BwNXX2CZ9XpBqGPcV{=KTe{QT-KlP>?La=fMoM*>->WOfD-)E? zg;Kg_c&e~Zh1>6Q`CFjYi`)F)BY*$B$yOl6Ev2@>;>N^ZzP0<&6J7yr6KMV2{;U3@ zB>m-E{*T|k;rZH^zUKe9_}eir-46aH@H<AB>unwAwf)r5`F~%>y|xZZnFxx6LXJ9r zg9vlvJY>nCKU>79Qa)?5kF<gwa@mD}hoBT~RWt67!Ux+vwfex#9gb|G!4wbq4H}2N zkHvb{^F-16BcNy-?7!7=EFf^V|C;}l#q0kh;M-4v9JXGP{5Ss2y#A}z1U~A&=I~bf zBj_u~hc~M8J{1%lp}|M`Y{mhN1^R1Z|BaUJbjlp#6q!FmnhH)%0ae@JXigqb9{lmr zTD@EH??7mi)k2$2AuCDATnI*`%vm=}9^=EOYYe(Rd;2~$k@?MC?7Dy?4T~w&H8_c9 zJTS;x7#$Mxo@7T0RsP(nf}eefLYF0{7dKAneIeheCQEh^2+*ZFMPD3~Bt$|BrBb9! zp|8^nv{}h%T`BYRnW8z#Ky1j>nZw?#r*PF6Mh!JXQE_ig{^a7`+Wb3J1-MlOHKjq* zj8?e#80f&@iT0KX2b)8#3x$Tm{<37FawFX3-2Qk?2~gDxRh<msJtx`3Ddg!icb>%q zih+le`PLVBxG_1E2Y*}I{AM}dn~EEo=Ei#7!!*uU6JJ71j;v5ZPA8)_3EFpwoEe&? zWLaT@Jp^;_+X~D4pRKA{we^hpLQ~IU`NXQ3dYDsFm{8nMTijIJ^H^bf+m_+FBeoQu zD)nwDwE9p$^Mh*A`&9Ew&vtkfyY72fb!=W0U-jcNCQ-*0>PXe_kWn3jwvH{-F-RSQ z#cd_{-b$z2IvlIiMQVyTD}B4^(0%KmqZ3``t7q)nRi+(=RM8UfKHX)mY*1e2=89?# z8bo{4i(*@Iij3!6wr^#l=f`kyM`Kqeo1=eDqB44T8bw>vS@Ry|KYxC5n!hvCX+HB& z9_A%G{B3GPDw8%H*pJ9?YiAB&%!RUDX89|ck)|(Myokx;fq1Aq|C!mx(*5v6vtJ7A z5iiB)N}J~p2zt|eZ7j&w*x8ESiIb~$kn9P5<U*aK=$8=a8<UH|ovHj-Z#qAQ>%6Ia zsk!M~$Q<@Xp==2z<AICsm*ObAYaqoBfBY5tY`BKc)WAGG)BgDRe0BN_O9e}Jnsb>8 zp?;{U0IW%y4^9)_=;-NvwU2$l94~=hlMM5<b`3LOc6|umv<==r2-27CgtV|%qKWCw zzJ@^rxYW@2u9+bVf`JiF**Z%NO#n*`&3vxC6)a0=0~kluNPW>#6-du?QN)k*P4pwh z4dK4XsQg#~tZ?FOPiI%0*<6UMno~1pdUJlys(QM)2_@6mGnhXpo5AS%1&ssz2!OMv zACsTj`*fl040^h7B6T#Qd&k`HwmGAatT;22k7P4xThxE#{NXXhmugf)&tTz4l1nI| zY#gbvH0GL9A~($dxWqC!F|@i16(7&8XY&zu`LDfnr*g1By6GMumi9*9+>cm>{CcgM zKF=@jHo7}yJ}@q@$_wGX_Tf+a_1<a=Kc@n(>-%(g_=ElgZv_cy(^{Pn89v9K<Xu5R zr<q)x5FKs>)l!RU??L4%KouXJ45|ed)&Eu!#`JwUQQQ<hFV?$=HZ8triCR7KkLH9k z*_4?%rY1y3BywofjCXfaM<}~ljSiV#V#WCrHvG0WZSt#WCZ=s8rtM(}Ml@H`=?yAx zUq0Dn?zZ+`+}~7X;);I}x@xSoxE2kq8q?h~_#^Qv-*)<m4_`hrv^*ZWZ!j0ZYy~?C zV>sqF3|=-f6ua-CRpE1s+hqntR-IjQHof-K744z?yiC?k+HNvEr$2vKsr{v^T1T+e z3)`p4*kboha0n~d>dtR}>FTYU=G36L{2?m_6^6i%NH=m9>3xA^b*!fbQl)&3>oybn zX+2ga&58B=h!$)b6Y^ysv<;puNp(|u?l{bzM=iYC%ImUbg8Au<wv9BYs|)=7UX7V! z2@L~!2b0-|jQ|?vvi+NjBIh%pDwEUuar$<6%KdlK`J++1nG%0^#Iz~fBX3m~%JQNS zk@4=K3iE}}sTt55SkhJLgG#^hfaz|%friF@k;*ii$FiD0;ik=fp_&jzJkSwzcKq26 ziD$CnySB5f*0RmaUFewJW$l~Ss!dpPOoi1a27UQ!%JyGVQ_Y}9Y55z~hWId<^G8+5 z7iO%?;~<kWk3Z~>-$pY(+;?#A3$dQhf))wy%w1^pr1=IkN=gRvN4`aE!$*!ZBd}cG zR8Q`tZnLO@O@5vMX>Tw$cn?EBx9PvBT$fVOY3rn_tA@DsAFZlKX-+N9&~U4%jJE~I z^8v@3(~=LD%N!cJuiisN&|yah#SW<qtPlI)bB|LZghf{@uQ{VozhZgqh55$ZSnpSm znKAWrGU}W3aNFSGp>-PnZW%27lVWCRRkM~!6-SQU(7vHiZ}SYb4OYp52C4GP64+=J zbY#dr$5ZB>;Mp>$s?5MGFs$lX`PWv#tbSsVzXLkE%$XYETh)1w<)`+4%880ib6wQ= zW;@!98!1zG*fSQ-E{)AM;ZfRw@jNh620YJMJl`6DRneog1LOJBNSVUJ4Bo27m-$zd zGK?~H{?N)D;V2WCe^)ZfH)HIDLUhUEw!w>5ZdAfhU?}w8YmFYJzn)|xaC&kggE+3P zSZKW)k>M6|6u$x;#_SNU66;Z`%Wm^oW{Op_As~!WA5~vhuD!btWop)5Kce1xc0g@6 z>eih2hV`VNcrNH)#@b6u>0p5^%Zq{fe0h=f(_o?aQ>*Uo-wD$y+4q|d9UixNyUiTz z#BxKN)#s|owePp23|ne<6>0tY))n>tOAT4OU%GwMn0DIQWWJ9Ikt&a(;d&ED@``IU z_u%$nh@at{M>IKefF{3rUAq4!A0S`1$?mB%moC|tqX#I~?~L7)seetP6kde(352FH zo36I{JDSOz)MdV)MmoP(tmhG$=DiN5GUg1XSf?&0c`sW?OBoXD{ZFw#K8V0AfGOD& zh}HA{Zs7i_%(A1qnrU-HFp!4>WcxcL!m=@N5Cjg512ALBMZrK@xufGCW*OGYG8{Cn z=JDL^MY?1XehD7X&6@9!nYm<1V^+7I{OJDISTa6IdogeBO)j9+E(TaU*7L8x?$dn3 zfSdjgEb{VK+!v<Sf3(yYD!?)>1$C+JU>)?UUK+I~c`>jo_NZ01jl(fz&8E7|By0Jp zUGa1mep0K=W4-O<<FT1XncFKjiZ`S6k<&k{0<@Y=u$quY87q0bHQ9`!=`t6*S}Nt* zyKwX+%}qsQ$P_mwH19qRUpCE3CPH1C2o*Gk*tMN(k_*sQLRA@sD5C@e_W*tOCP8>} zJ}m;QFm#y{{#qF;pbd<^{UOIW0R8??D3`*)H!s-)neA!wOH^3@MK$Fn{qQp*P3k>S zW51oD|1H|qMdKPn<_ws@@Ur87|Lyv}S9w93vM>K%w<&GLS(S_uR|nfUqiXoCF7BA0 zU5_VBE<MI2Yt327Fr)ZF7?Mb_9_D|uTc5K`-;6xXB6F#s)r!!P{IN{fp-irXjW9*S zgq5m)${K#9OHY6%(ph?9adG4Picpa~DkFk4`P7jD*38ry_2PB}9*P91>a_Xq-F6+# zOqQS{S!JEco(zl*7PW1I`&r$}UoZ<9?m{|K8rO_(eP_EoIh4E2wRB+Ml8W{IftJX1 zHlI-wD1bHewo?FchLeU^SpgLHl<-(bV?E!YRED9SVCb*pcX{Y{{3ApEedVG550z?w zQ5{{3=kICF7kJhhVP)L13{_Pg*%zvvs3*EbqkFNxd5OATys31B6$3Ka{f$(*)G&>l z6qw3aB@@V_7+dem+G*RZN78g)v{P&G#^V(8oU&UmAec_cC6%IO{9(KUpq)jc3i><K zx!R0bD+-w{I&)((=4MCklvFO9F?~D~HzsqTOsS!RLT}oSS-ArrJF7n2khiNdQr@qS z9rOA3F;Z_$t^-6DYB8e4es=wFd|K&_TTe<HA&##B2ElVdk8nldYqHaO*h=69(qVWk zz){>&x8&-M!XZ2+ihF9VKBX|WxGWi|y><%xj-<VZD9~lzp#o^I&Wx859Z#Jr0vZ>? zZ_zo_6~O;&;n51b%%Awm9a>cN4t90tC-`&Yc$LT675H#%+Y5+4u!LYgL>fcDp7xzz zGiBuSbgJhd>%;@gPzKVXS*bob3mfs3tS1+)gJx!}R&t0py9%|a#2c+oF`FiH(rcP8 zPsSRYv>C_FFPvkW0Rb~uJspWg?`3d=auaejUW?i}Gv<&D=06$~`5Y}2D^rdUD|j3} zAB&ZJpu#!1@m;RmL6vf+AP;eBZ%X4IJVr9@_>L~E^*1XKzBc0T0clIh+-)^kT)nZR zcW`n3pp^M7BM=S%VlPR6trdV4cmVEqfQ#&Ug)Z4={c6`=-W4?7TgnHb>WB=FM<-bD z0t*h>`~p*kH($BuS#Yh({e-|%1#Yq6F%En`;Nr$q)pBaJ>WgMfua$948nuhHMv7!o z=JTIc?nrfRx1K8Qh<0b&O6{BTwSCjb+*JA1?0)5f`u^S4N5f-1lj-z<TUl%R<L}}V z|Knfqs%vhJw7(eZ*+WluWxD%N`TRBV*JM85N(KzTFn;}I6SCbV{w_<9HtO*5FN@`B zy3Olk0tc`}aqk#lwcW;4U{)7(n%##96O=Zl%&>mrTJ`tfuh;Kwz^6zE2lI#Gr;26F zB|8BlgH+vDOKQ?4mGZHyIaf*S{wb-3q!yd>bUxN)PIje0<x0h2;eD>Mrfk~$kAAX2 z($#71;Agjaj8C=-7B5<I5w(}K)WB_{*Pol~1kgX117mL)el(`RtXIqEF+YK^#f|Y| zsm|Y-uPc`73*!~V5b8Tc1&6~lX<V+xO#QR93e2xgkn&m5yDPS4aPb3SHmbet@9JOz zormh73Jp@(RMc=~so@%2x3usSfBX%|5$z4NKa@Yd_)4jOsN@eLpV#qcMC}l2G&A`i zOB`y}D*HlF3?S^?ElIqc572to@NG^RC#vz6Dm`VMK>W%{Ih#~wh)e$-=@#8;4G3Yd zZ8T@vyjH+)d&qviEZK~td=Ck*9p0KUIsK-~)Zr5vZ6{3iw{>=-&&?xjB~imX(&x&! z$eLw>%umh*Ityq=Hq*rxP?@&NsgKmliW}$ornAdD!`^$=cwo(#ck@Zp{Rf%Z7(<&X z{)z;6q&RG^r9hm}goWo+drMR7z-umdzxYwHN7T#m;IFfJ5)4kOSSop?u&eW@a&<ZE z19OARZ}U-8)Q(^@_EBVx2x+>wA(|T_DjHRT`MNd7EfK{X334_25kD2~o0kmvb0dA2 zMt&;FlYU0qwxA(HA7)}8V^b$!HLyu_gDPt4ZmG~%UH|+2bh!A(5IdWHtj#x^TX>J? z5fu>%c2RKn7}yj68kSGp`Y6S?u$|y(Sj-}4q>eCx%vJmnw^rFq@qhwVF{5ThD0JPw z<mVOl9CqCq#XXJJ9#z~kxo}!gHtfwxpLbR&H#u#VTSml(Y;V<AlLB9n7eHr(z>|0C zb4U#nZMJaQQx%<NLQwaNS{|1@F{7TZ<wwnsQBruQTwTi3bK1;wt=Xrtp9GcJ*?2Yf za8xR~vAB0!;dI6(gQf2(>rXiWd`(QQmOG8~30>NmtF?xucC#L{et>4I-KeT)B74FT z+lgZOlAF40Vo;O&GEbi^>|_ovhfB)~5(mp+M!|A3J|iKIu7k+ZP;t-v*ymWGvi|rF zKKtjsSbXKQ*!7R`yX~=6pTGSy^h)weYxn|3WN!YXx%tE9#(MvobfmD}Ypg|U91(B< z$XEwCs0<;7#zA&lp3n@(b1TDEjx~nN^MtPyH#QH=5WefqVGDTA@_b^(p{S$6IpzdX z%@gg?dR65mU!S)OqO&UvbhY&bwaqvTeEH*Nd`DmPuE`P%HKsG=32a`t(DI`Sce>M4 zIa9P8jt=#o6FL$O{QA_6(9QfU<acNc|LjLi@GZcB|Jkf##?-2Z?EaD@BCd&`DchAX z=Qw(cdnXp8BjQUIZ?3xw-LF|-5u299J$oI1=g@T%AU{qqEZ{ua9fzOY*DMRc!0nU- z%T?ZXDD}2VS+`tiwPZA9E@y4+kJpYLLVzAoCwO38vF``#sAemP7K1{dwo)0He^qCf z>}yp`sp01U{RaKU-nuBnlo8aQKPqL?0PJINqg=iZlXr8S^6Fn%!O)uU+B*P_jQ6k? z>1Mv!6U;Y8O?Yrj)qLa64f{3a{3sml75laRr^0@OJ-a{4y?>|wh}OE_1l$>BkfE}r zmlDWLsbM}-WqHd=!eD*E-DEg%0Vx^(im+dHc2cw{7fyGfI9p1;5Qg5t<x{i%q~6C0 zbwAJ=kTK0vkg8tJbavUSjcmis?H$ClX}s<cEtf^|${mVE^w%Ws<_qj9kIrWe5nT;L znazUdN?IE>kt7#Ov)6ojhf)$=D?iW_jVSFV|HkCKl<=+)OzRDl@C5ejS8jX=aGAd= zcic*ktzQbu+gK1}Sis%|Aj{&s>7_em2sdf}JL#$Rba&gXwx=C~XloN~y}UostNvof zHJ9Yo31NRHVOVS(E<Yb1O?<uNl;zO9$-DTGvJ3vE{u^!kQg+WL-R&^;ud!J=&4a(E zq4i=W*u*5-7B75{L6OLGnOBKL@b}QAp6z*`!AMgd648A%=HWv`gEl0ad!P3AE}!U6 z?ldQ$QH5%A_<e;JGp5Ns!t%0_E*?0JP;1yrozW4>p^1NXy2_PJ6+47Tx9eAAswS28 znvq1a?KDW(nK3J-DLWF7KMp;@`pleUhc5O@{?Lrw6gIaNEGevy7Y}9HN@jJ{vnl{T z<8TtnrQE<XU>ih$LmS&#c8n!z;6>V?nU#vd-o@?ETZ3k@<a`ok2pO(DZhy^gwp#C_ zmLpoo$~!K<qWsjGXR8N^Npd^9dDcP-T~Gv{`o7WYpp|K3K2DXlCZ__%4(csYx`p5Q z!wH5gb!!ROjPd*0L?t)&vHM*(3@i#GaTy5od8VA`PryiB+`HwXMX@i*u|lQ_|81MF zgRhMAN1be)6&>^EF&k)Z6QfneLX-RGOl9o+q6p@-c9qv;8EbpWeW<_KNSaKcaC^<Q zG5?%sar#Q>d)OM<?|xE5>Nf)FK|4`VJXkbE{fu*I`q9t$8D^=pAO1|rywYG9Qn3dk z@GNT09@I`c>Yo$w6QAky6DvE-SCL(Kw`<!GgS)rc28+G}=f6B*^E=kq1}T4;zUDH0 z`J(|JfVv~>fQXl!8Y&yLYm7|R{H97gvw^*$<~A<Tt{gZMxn#;5#zL-W_b<&7%e68t z5kw}I3hORLLfHFF@l{1E>E_cYtCabLB{e*Ry`%1p79WxZ3-c%4Bn^yl>0LqbPIHc% zj+!N8gZX-TF4Sk0vwcF|`&fdMqefQlh%*<-|E3VE-lw~zDJ9MM`pwJ<NbFt7q*7kU zj}7E}U@p}l6YuoL&(p6h%TN_8b;pn=G9Xaj>`+BD2>p;oyO~HEd_vd&q~ybxVtwJA zX6xnRk78|Qt~H}(pSny6p?BBvr5Tg@7{76yDJZx*t2o^jtQvDSS!mB0Xhv2KQgHk= zf};^WTmubRbG^$l8GgmP8Ce^g9Y6yUlHIJC&wvE6`pJ1)Ev;5eDj({fl{;(%E!v_h z<=qSJv}uB7O%&c;Ja(E%XfACyC2*WXa9Sw;kSA7nVpf-#P2C#Iz@09d>5Ke!h!2A& zB75s-<$)G|yvmTReZzI}LZc{foNnK+d|caL89grkvZuWqb|8xI6TR7gtpw(4?=}#> zbo<}hfl*J88!x+=foit03xh^l)_-GCdXS*ZBcH+fzQ$_9PIKON+qyD=mWNOubvhKQ z`e)D5LU}BhUM8dOe{0v=@L?Rw!9a^4AqpCU;&9sgIrMg#Z_|;`#7bkaErD1UTFECG zs`IJCUA|K*`66Y!;&j@4^EbB3%Rt5-^#o&j&J_QA!lpaTTszpbjCxnbdl?eUE^Dl6 zXdi{^Opxb*NGv%VQaC7M{)#|Jlr$|>WJf<}e^op>)M}ijI@PRg|57IR>g{5LCcXq@ zB3@%0nE^|z>pal#&IeB`?JN{!EM+rZJfqF98^Fh$(g+MJ3F7&#vkj5aI}UB7^&$k@ z@No@FOQ+R^UIz#=<~Ems?9JX33%RKRncy{A$TA11w9?Td{Sg6Ym-&@rgj`x1`RSkC z!q47S{PgYxfp-fZ<_}W?sfzXdJ1GRNqw%wd(<4upN+UuIvBBOcBltja?e>xGzX80J z{i*%tmA!g9Vmv&-iURRuR7Ms4+0C@LZr#OTz|f?NqTYOdcbeN!Jt$G+c_b`Psz2ht zS1zxaU77nfl97Fcw-Frrc;RhCicV6b=wbznK3)|o`m0K;=;B3GHr7r9ONRWhwq}{R zsaygT`KRMmW3<XAzjBA&hwrhWl3lnJUr4dVoiI!5rE$8vYqBu)Vm`1HTg;y(07WXX zF61JN^{hhEWxBn&%GJR~*5)-g<1N)dO!V%;(qv<V*ezLsQ{0G3roE|T?lh-dO7D0{ zerGHWbKb!s5W_XrLkyi3EODU@kK||vHS@OdcETFZ@X_sU<<lHPLJB24%iMsq=x@uN z++`m5h|o=i3t@j~xTXWHUPbRD5rt1Yt0WD%rB(VWcQSo@ueG84N975vjy1w8lW~<X z-~Vt>Hh)O&<kY6nN#<*1Na0VplQJe_>jk+z?4{Kr<FpY2>qJQFCWZ<E@svqbzffoz z#ew%(ml`T4*1J~<dl}B43zJP5^92f_0$|BQG&f-Mk=o2MSKFk-VmK_LkQm(u`J#1g zgS{^-xd;;u8B;%NewRa`k)BSqJ#Cf)^G$bEFJG3NVj}9jN-xuU3aZO=dE3<$Kj$N; z{BAmHq?eI~A2HavymiWUyX`TRFn!8a-URN~NWDd1c~7y*UEQ`bZv@<Jiz75sO`3A* z&{p$(ECo$}vI9;FV!gV8umVkJiV9nnY)w^nmU%#h5K_1gqa(J`jJXRa@gkD$yxhq6 z-cQ%VW!Bw1nz@6pHERwh8A)D@os&#=n|}d;<LuLpv!qq2WX(s|#;kC!iTJI4jX$}4 z>$1i=Ln$2A6E<wG#r|0LFBS)DsL8(Ur+8m<wLi9_Z|uI>UF%KhTkW^EJ?-6w4UKux zWU*byDE%U0hqx*j9?@uj4Q?g!Q*^ZHc$8In+O|PZ_a>*2%W=p>#XWy6-O6atcB);G z=4383vs6y{YivwCYZlGbUTAJds1w}N%o~p*l6NKNf{K*s-Ck&criPDR0#})}=h3I$ z9=b7YE&v2Grqcx-96V?rTK-9Ya_;0#bH-8<&<&ioDopmr<}OT`<Eubn|Fq$nIZWVZ zLQG3KV}AUMWfo(p0ZTwD8WwKfEdxQ(V_W9OVC>r}^XSK^JAO7R%Jyx`u7`$1+taLu z7eT^Fo#y)=s*sSM9)z`gsEjdxND$VNE<>=9Ds^<H%@&+68o5M5RaNpeX8J^@x%eZt zE1bQjuB(!bV7{*SOP$?P-tUfBP96&@)F)~4z&2IWNV|jm?(?6tsP{8z+nLsVjI1BL zMi4SBJAbUmjd=+Ny4p^%ga8b!&Xvsii{<zUaEz4KRz@@Z(Bw6#lsW6yK|d76nX8T= zcu{K*wga-}mZOyt)rwJz5*zPVj_=bmRo4tL^_eBO>*@G%T>(E_ddk#T2R>_%>VMXL zfC{<IqOAFL*j<}Q#uV`@AoCSNp^AQ;<Qt!>)ds`0HamlS{{FMu{kN+8<IDMze_#Hu zSen8AGGl2!<hXd)-lwy%o}18o2%=7!-1HfKGo;P=Fr<saz9RKARGsm9;I+4u5Azwc z4}KJHo*=D)TmgisZ=0JFlYqKh!tqu`b@-;Dzbu9jN{4tHC}S<cXU3dqJHE+((8iV1 zgZo4qu3qi-w^$3kQ^rG{<>jZKv20W~_+wLsP<1u6?=)v+EFQ9w5b!^(Eg)vKjEjvz z$zlV<dVWHKyRyzBY1Ee6rF5|`w({WJBghwkbo+a}+XPv|N7llbglCyk=?&UunR5e4 zU7kg9vL<>O-EC&uHU2DgRAaZ<#wtG5S8oa*u;K<#3)RE@2~gAM@9{TOYe7vB0owws zTP(wl6~*RAb(9(FR!(d!HZ57S_@aeF3b=Gb#>sacwtN9TEo5_F7F;~gzRcW-+(`;W z+h4@<6^ku>&~`}fB+Q7D&Ehho@TVpIkV4d)jzHJCFf%PlQdt`x!TvX{1NDsd?<e{< z+K5kfI#0KL^@zgy16@%ypfsN75mw)@o8mBx2}m12U#QsPY(bNwmgz|z9c<&?E&Pgh zrc?QG=6%*h5?wrGzGFQX{Hj8aKCy<GnN`77Gi2lQ(G;m}^K0uciP9w~r2L|`UA-?X z@0R~Ik@XK<amF!)x19y+{8!!7bx!Y=<>Ob)npiq#`Z0y@rtm~e#-G^T26RR~mJ;<W z`yQGkK1Syhhr;cDUG{yT33ZdD3&QQ*9~?|5zjgc&tdcfRPpRs;TkRkV@fTs(jMj3; zPBZedM!m#B&2&Y22s==2xwb9Z#odsG^Rl{_MH9IaS(|jeND!^{ZbWp7Iy#r1Og<IU ziZGo?b(*6s0kRBnW!__Ft}s2Ox<^<llA%PabQ^4~(!#sZy3_2IjM`@x_&Wnwb$|TL z_8-SySXF)aB1B`4T@P$R?DpY9+-tIY_%xdX@Il_gDn4j-mNjAd&@4U(B6@pl`^1MM z;Dd@;s>O$QI6m9}A7~{<LGD0+^{cosY^j4OBFgor<HwQv^5b@F*5byfYfaE-%ak8F zmq@vpf0G|0tha1bJx(65z;qJN$%I5A?j<cNu3!)9A7RBO?f4Wc4%?R%Zwo|Xk7LBY zJ6YGNzbqFd>{lM1bIsHiTSXp10c;<6NWl3x^fzie#N`N$cM7C#f{U=RafAu9UAA6N zQer8`v}~GeO0MyVP)7sgZ<95*rBJtCE6r7tR=m3C2UB28zU~JRaVXu7LDQKw?_FdW zC3j!jV;VaTNJ4b1Q=<l%!NQhfTM#*{QnvXl@GYZMtRgeVjb_wU)+Dp;5g0|rN&^nW zuf%@%6=%VL3{}dCZ*a%@yP+^D22pHO9`JKs&oT#PRxKW7jgh_py4`r<h%KC;p$c*8 z^rl+z$ywSZ4vlcruEwPy7#Mf6+J+t*NP&v@ybGAMuB?iZQ2o#t)^3Mk{Es3I`qjNr z-3t)TlHtBBbeX!k({yPok;x;@<Wa8~eBlrimkrqQH|J`0;{u1+#^Uy|L}qxiAk~}B zN2mFLB?G&(a5!edgAgFc(vNZx6WS$R$HCx*LmA0dQ_8%-YBpn@RD7_OPv)mKI5rVj z4osl~_5dXf;80uIZNYpw1H&40ywWBj2rhm(?(a1HbP=_UHB0%yc-+NdLvshBNxk+Q z8~gQIEal?n>V=@;+^KJ9eL`{jFyKcISxTCiaXMfv=Ns7zQ!;}fKi1#SA!EUgkMJ*G zCJMh*Xy8-Wx-zE3dcKHx0N!}p;D+ChVd=S7*2JCukK10r1JwKUOW({N?yZ4S=BpSz zl<TYSTg)z5#D?%uZ;K|l*W3hG-0-2ad1OJ5kA@xE<t?*PafAg%DL0!k$$iWG+vqY& zZJ9r0ZTH(UESpoN2@3k^y$eYNXvW(|I;OGsU@b!ySi8CQgyI`D%g528gg<f9StXeS ziP<D^`g1Vccm5u+2Uxt_Ec*qvT_Xm>6uX!@%b(O~9^TAeXZ<Sa>J_gXQ#htSr9(KH z!22d?g&s`d<H}R`IN@huM%CMv-AB`!{hziCwmsHYQ+zEPyY+#-nVcbfwzj)(W@P09 zwd_sy&5ZVSvsHbWV%O9;Tr1HxJG`XtyvU~6(Hfbu91f1MQ>3nY{)5;Z)%p%mm}@SB zF}4raYtm<rd2i;WJ2%(YfWCq_+Bc^e{912~>6_D1J`_1{4=RmKSUSCTFca%tpx$4T z)Fv=uWw(Z;78?E#tO;X14a$MGfY1m*qJ{SqUkP7#@aCSR6?%=(S8A_)7aBp&jQD#T zM(rm{`RQBA?`&&8#fPVX<GR}6pHZnT&|?coajKw7=v&Vg18VjaJHIq)gCo{+Jr#-? z+y;yiDhJy^g(Ws@b=iV}1#p!Xzn`J5eS&y8x3sgg71G0)UKcaQFO+c>ZF>wH33_O) z*g-e>5%rSmp-%5Yu%t?987UF`kJr5`V?mxW6Xsy+xRwYd^NfpvV>S~*hss0^|IED1 zYS%KToECKAz}?`GGpy(uqDTbACHD@lRZ9M28UGXoD0>fS2oPgFUSRJYp3-Y2Gk_W_ z=vF|TYeh`yiM49?fRb(8=zt@!aHOq`8ZHDQQn`hSzqG+t<Zl?Vi2;m9M<7dw*FkJY zJiiUU%?%tmC<c}#PFGxX(gUu5@v*zDP{H=eFf7bBk(B0f7Hi}(ukjr;npK4(C0Db# zPQ28=&2{3o`=xg2pLqhcMq!1)%))zv7Y7~I<lTL42NE)ibL;|Xl5gJk5!rS01tDW9 z-__mrLZ<z}Y$4Kj;xZ~5o{%z+ZnEU9)iZe#?GGx|3sV0lNYyi`jV@Iu;8pfZL8_if zZE~p>2dP&Fsd|<^X#ce^>k$3$gf6o%NYyj*Q?mUHrOvadS<@b*>KVP%(*9Sa>NNiF zgp4^dNYyj-wz_&Xv52bDgRVt-CUpw-2CNjL(&n=jKT@4MIf~z!rgo8<=v44d+WgKM zCz=MwnaLRWHXk2Wh)0&yl%j_V^=mcH4G}yR)M_6Qp(1xBXuc|WEf*j<<Nw0^v@AK5 z$%LJQZS8O97)`#soJ5@}+;2E67k&G$V?A|@qVBHTQqwDEftG^pf7Q|MSkEwR$#@BH zdJ#Ul9s0c-96>VMA4FF+gCx#hW9+8ykeRDEDA=7b?_^PJ7wZ1b5g&WTmA}s(rpcPO z{|Pd;(YASV$|A@(X3rIK(y1=9<zX>aR;nWW#G&z)Db(309qqgTA*c$lE_lgK%FV@% z@nav-Ox%?<VQR>jukIwpg$K`WH?bQRq7*e9iqwpWiwZb_<ae1*kd+^Vf7%J5Y{Gie zsmI)GS7920-aI|)JR_O)JY6I9s*&f5mHy$%GmSzOvRsDKBLnv!KTdQ(s?=EybF54` zgnno|Rs3n?p?<VOR5;Y#$8dU`E@a3bY?J*6$}?Dqmh;zJV06gF1G90ESIb#h!41u| zeng`=;XYEO&)-6wtJERklpiUjXRR7q<VdjPStCz<>+%m#KCm-wd5p|a<=b|dzrd5A zc6vOi>i4DM#sgugu*bzW)1KRf?ZEBX2D{&~JxkxZd<2Kle%nJgyrn%K@Qe1={_XZY z43+z>Wu(1-SA8xXRJ}*n!d!*n#vOCr(u}CL®6SdhC8E(@5YH)Xm}SbwAZ9(B%v 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 P_%-0yfL{Z5Qv?4Gaxh!n literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/README.txt b/pd/portmidi/pm_java/README.txt new file mode 100644 index 000000000..3f616b776 --- /dev/null +++ b/pd/portmidi/pm_java/README.txt @@ -0,0 +1,48 @@ +README.txt +Roger B. Dannenberg +16 Jun 2009 + +This directory was created to implement PmDefaults, a program to +set default input and output devices for PortMidi applications. + +There are three main sub-projects here: + 1) pmjni -- a JNI (Java Native Interface) to access PortMidi + 2) jportmidi -- a Java class to access PortMidi (uses pmjni) + 3) pmdefaults -- the PmDefaults application (uses jportmidi) + +For Mac OS X, you should build the PmDefaults application in Xcode. + +For Win32, an installer for PmDefaults is included in setup/. +To build from sources, you should first build everything including +the portmidi dll (that will be used by the Java application) using +Visual C++ and a provided .sln file in the portmidi home directory. +Then, run make.bat in this directory. The subdirectory win32 will be +created with the application pmdefaults.exe. You can run this application +in the normal way. To move the application, you need to copy *everything* +in win32. To build setup/pmdefaults-setup.exe, I have used both +Setup Generator from Gentee software and Inno Setup from jrsoftware.org. +A script for Inno Setup is included in this directory, but since paths +seem to be absolute, you will have to adjust the paths in the script +before you use it. + +---- implementation notes ---- + +For windows, we use the free software JavaExe.exe. The copy here was +downloaded from + +http://software.techrepublic.com.com/abstract.aspx?kw=javaexe&docid=767485 + +I found this page by visiting http://software.techrepublic.com.com and +searching in the "Software" category for "JavaExe" + +JavaExe works by placing the JavaExe.exe file in the directory with the +Java application jar file and then *renaming* JavaExe.exe to the name +of the jar file, but keeping the .exe extension. (See make.bat for this +step.) Documentation for JavaExe can be obtained by downloading the +whole program from the URL(s) above. + + + + + + diff --git a/pd/portmidi/pm_java/UpdateRsrcJavaExe.exe b/pd/portmidi/pm_java/UpdateRsrcJavaExe.exe new file mode 100644 index 0000000000000000000000000000000000000000..492ec1679ea1f51e36b41fef7a89f666cdc06c9a GIT binary patch literal 102400 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 R1)5TzDFvER;Q!AQ_&-}w(1rj2 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/jportmidi/JPortMidi.java b/pd/portmidi/pm_java/jportmidi/JPortMidi.java new file mode 100644 index 000000000..dd3cc2a1c --- /dev/null +++ b/pd/portmidi/pm_java/jportmidi/JPortMidi.java @@ -0,0 +1,539 @@ +package jportmidi; + +/* PortMidi is a general class intended for any Java program using + the PortMidi library. It encapsulates JPortMidiApi with a more + object-oriented interface. A single PortMidi object can manage + up to one input stream and one output stream. + + This class is not safely callable from multiple threads. It + is the client's responsibility to periodically call the Poll + method which checks for midi input and handles it. +*/ + +import jportmidi.*; +import jportmidi.JPortMidiApi.*; + +public class JPortMidi { + + // timecode to send message immediately + public final int NOW = 0; + + // midi codes + public final int MIDI_NOTE_OFF = 0x80; + public final int MIDI_NOTE_ON = 0x90; + public final int CTRL_ALL_OFF = 123; + public final int MIDI_PITCH_BEND = 0xE0; + public final int MIDI_CLOCK = 0xF8; + public final int MIDI_CONTROL = 0xB0; + public final int MIDI_PROGRAM = 0xC0; + public final int MIDI_START = 0xFA; + public final int MIDI_STOP = 0xFC; + public final int MIDI_POLY_TOUCH = 0xA0; + public final int MIDI_TOUCH = 0xD0; + + // error code -- cannot refresh device list while stream is open: + public final int pmStreamOpen = -5000; + public final int pmOutputNotOpen = -4999; + + // access to JPortMidiApi is through a single, global instance + private static JPortMidiApi pm; + // a reference count tracks how many objects have it open + private static int pmRefCount = 0; + private static int openCount = 0; + + public int error; // user can check here for error codes + private PortMidiStream input; + private PortMidiStream output; + private PmEvent buffer; + protected int timestamp; // remember timestamp from incoming messages + protected boolean trace = false; // used to print midi msgs for debugging + + + public JPortMidi() throws JPortMidiException { + if (pmRefCount == 0) { + pm = new JPortMidiApi(); + pmRefCount++; + System.out.println("Calling Pm_Initialize"); + checkError(pm.Pm_Initialize()); + System.out.println("Called Pm_Initialize"); + } + buffer = new PmEvent(); + } + + public boolean getTrace() { return trace; } + + // set the trace flag and return previous value + public boolean setTrace(boolean flag) { + boolean previous = trace; + trace = flag; + return previous; + } + + // WARNING: you must not call this if any devices are open + public void refreshDeviceLists() + throws JPortMidiException + { + if (openCount > 0) { + throw new JPortMidiException(pmStreamOpen, + "RefreshDeviceLists called while stream is open"); + } + checkError(pm.Pm_Terminate()); + checkError(pm.Pm_Initialize()); + } + + // there is no control over when/whether this is called, but it seems + // to be a good idea to close things when this object is collected + public void finalize() { + if (input != null) { + error = pm.Pm_Close(input); + } + if (input != null) { + int rslt = pm.Pm_Close(output); + // we may lose an error code from closing output, but don't + // lose any real error from closing input... + if (error == pm.pmNoError) error = rslt; + } + pmRefCount--; + if (pmRefCount == 0) { + error = pm.Pm_Terminate(); + } + } + + int checkError(int err) throws JPortMidiException + { + // note that Pm_Read and Pm_Write return positive result values + // which are not errors, so compare with >= + if (err >= pm.pmNoError) return err; + if (err == pm.pmHostError) { + throw new JPortMidiException(err, pm.Pm_GetHostErrorText()); + } else { + throw new JPortMidiException(err, pm.Pm_GetErrorText(err)); + } + } + + // ******** ACCESS TO TIME *********** + + public void timeStart(int resolution) throws JPortMidiException { + checkError(pm.Pt_TimeStart(resolution)); + } + + public void timeStop() throws JPortMidiException { + checkError(pm.Pt_TimeStop()); + } + + public int timeGet() { + return pm.Pt_Time(); + } + + public boolean timeStarted() { + return pm.Pt_TimeStarted(); + } + + // ******* QUERY DEVICE INFORMATION ********* + + public int countDevices() throws JPortMidiException { + return checkError(pm.Pm_CountDevices()); + } + + public int getDefaultInputDeviceID() throws JPortMidiException { + return checkError(pm.Pm_GetDefaultInputDeviceID()); + } + + public int getDefaultOutputDeviceID() throws JPortMidiException { + return checkError(pm.Pm_GetDefaultOutputDeviceID()); + } + + public String getDeviceInterf(int i) { + return pm.Pm_GetDeviceInterf(i); + } + + public String getDeviceName(int i) { + return pm.Pm_GetDeviceName(i); + } + + public boolean getDeviceInput(int i) { + return pm.Pm_GetDeviceInput(i); + } + + public boolean getDeviceOutput(int i) { + return pm.Pm_GetDeviceOutput(i); + } + + // ********** MIDI INTERFACE ************ + + public boolean isOpenInput() { + return input != null; + } + + public void openInput(int inputDevice, int bufferSize) + throws JPortMidiException + { + openInput(inputDevice, "", bufferSize); + } + + public void openInput(int inputDevice, String inputDriverInfo, int bufferSize) + throws JPortMidiException + { + if (isOpenInput()) pm.Pm_Close(input); + else input = new PortMidiStream(); + if (trace) { + System.out.println("openInput " + getDeviceName(inputDevice)); + } + checkError(pm.Pm_OpenInput(input, inputDevice, + inputDriverInfo, bufferSize)); + // if no exception, then increase count of open streams + openCount++; + } + + public boolean isOpenOutput() { + return output != null; + } + + public void openOutput(int outputDevice, int bufferSize, int latency) + throws JPortMidiException + { + openOutput(outputDevice, "", bufferSize, latency); + } + + public void openOutput(int outputDevice, String outputDriverInfo, + int bufferSize, int latency) throws JPortMidiException { + if (isOpenOutput()) pm.Pm_Close(output); + else output = new PortMidiStream(); + if (trace) { + System.out.println("openOutput " + getDeviceName(outputDevice)); + } + checkError(pm.Pm_OpenOutput(output, outputDevice, outputDriverInfo, + bufferSize, latency)); + // if no exception, then increase count of open streams + openCount++; + } + + public void setFilter(int filters) throws JPortMidiException { + if (input == null) return; // no effect if input not open + checkError(pm.Pm_SetFilter(input, filters)); + } + + public void setChannelMask(int mask) throws JPortMidiException { + if (input == null) return; // no effect if input not open + checkError(pm.Pm_SetChannelMask(input, mask)); + } + + public void abort() throws JPortMidiException { + if (output == null) return; // no effect if output not open + checkError(pm.Pm_Abort(output)); + } + + // In keeping with the idea that this class represents an input and output, + // there are separate Close methods for input and output streams, avoiding + // the need for clients to ever deal directly with a stream object + public void closeInput() throws JPortMidiException { + if (input == null) return; // no effect if input not open + checkError(pm.Pm_Close(input)); + input = null; + openCount--; + } + + public void closeOutput() throws JPortMidiException { + if (output == null) return; // no effect if output not open + checkError(pm.Pm_Close(output)); + output = null; + openCount--; + } + + // Poll should be called by client to process input messages (if any) + public void poll() throws JPortMidiException { + if (input == null) return; // does nothing until input is opened + while (true) { + int rslt = pm.Pm_Read(input, buffer); + checkError(rslt); + if (rslt == 0) return; // no more messages + handleMidiIn(buffer); + } + } + + public void writeShort(int when, int msg) throws JPortMidiException { + if (output == null) + throw new JPortMidiException(pmOutputNotOpen, + "Output stream not open"); + if (trace) { + System.out.println("writeShort: " + Integer.toHexString(msg)); + } + checkError(pm.Pm_WriteShort(output, when, msg)); + } + + public void writeSysEx(int when, byte msg[]) throws JPortMidiException { + if (output == null) + throw new JPortMidiException(pmOutputNotOpen, + "Output stream not open"); + if (trace) { + System.out.print("writeSysEx: "); + for (int i = 0; i < msg.length; i++) { + System.out.print(Integer.toHexString(msg[i])); + } + System.out.print("\n"); + } + checkError(pm.Pm_WriteSysEx(output, when, msg)); + } + + public int midiChanMessage(int chan, int status, int data1, int data2) { + return (((data2 << 16) & 0xFF0000) | + ((data1 << 8) & 0xFF00) | + (status & 0xF0) | + (chan & 0xF)); + } + + public int midiMessage(int status, int data1, int data2) { + return ((((data2) << 16) & 0xFF0000) | + (((data1) << 8) & 0xFF00) | + ((status) & 0xFF)); + } + + public void midiAllOff(int channel) throws JPortMidiException { + midiAllOff(channel, NOW); + } + + public void midiAllOff(int chan, int when) throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_CONTROL, CTRL_ALL_OFF, 0)); + } + + public void midiPitchBend(int chan, int value) throws JPortMidiException { + midiPitchBend(chan, value, NOW); + } + + public void midiPitchBend(int chan, int value, int when) + throws JPortMidiException { + writeShort(when, + midiChanMessage(chan, MIDI_PITCH_BEND, value, value >> 7)); + } + + public void midiClock() throws JPortMidiException { + midiClock(NOW); + } + + public void midiClock(int when) throws JPortMidiException { + writeShort(when, midiMessage(MIDI_CLOCK, 0, 0)); + } + + public void midiControl(int chan, int control, int value) + throws JPortMidiException { + midiControl(chan, control, value, NOW); + } + + public void midiControl(int chan, int control, int value, int when) + throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_CONTROL, control, value)); + } + + public void midiNote(int chan, int pitch, int vel) + throws JPortMidiException { + midiNote(chan, pitch, vel, NOW); + } + + public void midiNote(int chan, int pitch, int vel, int when) + throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_NOTE_ON, pitch, vel)); + } + + public void midiProgram(int chan, int program) + throws JPortMidiException { + midiProgram(chan, program, NOW); + } + + public void midiProgram(int chan, int program, int when) + throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_PROGRAM, program, 0)); + } + + public void midiStart() + throws JPortMidiException { + midiStart(NOW); + } + + public void midiStart(int when) + throws JPortMidiException { + writeShort(when, midiMessage(MIDI_START, 0, 0)); + } + + public void midiStop() + throws JPortMidiException { + midiStop(NOW); + } + + public void midiStop(int when) + throws JPortMidiException { + writeShort(when, midiMessage(MIDI_STOP, 0, 0)); + } + + public void midiPolyTouch(int chan, int key, int value) + throws JPortMidiException { + midiPolyTouch(chan, key, value, NOW); + } + + public void midiPolyTouch(int chan, int key, int value, int when) + throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_POLY_TOUCH, key, value)); + } + + public void midiTouch(int chan, int value) + throws JPortMidiException { + midiTouch(chan, value, NOW); + } + + public void midiTouch(int chan, int value, int when) + throws JPortMidiException { + writeShort(when, midiChanMessage(chan, MIDI_TOUCH, value, 0)); + } + + // ****** now we implement the message handlers ****** + + // an array for incoming sysex messages that can grow. + // The downside is that after getting a message, we + + private byte sysexBuffer[] = null; + private int sysexBufferIndex = 0; + + void sysexBufferReset() { + sysexBufferIndex = 0; + if (sysexBuffer == null) sysexBuffer = new byte[256]; + } + + void sysexBufferCheck() { + if (sysexBuffer.length < sysexBufferIndex + 4) { + byte bigger[] = new byte[sysexBuffer.length * 2]; + for (int i = 0; i < sysexBufferIndex; i++) { + bigger[i] = sysexBuffer[i]; + } + sysexBuffer = bigger; + } + // now we have space to write some bytes + } + + // call this to insert Sysex and EOX status bytes + // call sysexBufferAppendBytes to insert anything else + void sysexBufferAppendStatus(byte status) { + sysexBuffer[sysexBufferIndex++] = status; + } + + void sysexBufferAppendBytes(int msg, int len) { + for (int i = 0; i < len; i++) { + byte b = (byte) msg; + if ((msg & 0x80) != 0) { + if (b == 0xF7) { // end of sysex + sysexBufferAppendStatus(b); + sysex(sysexBuffer, sysexBufferIndex); + return; + } + // recursively handle embedded real-time messages + PmEvent buffer = new PmEvent(); + buffer.timestamp = timestamp; + buffer.message = b; + handleMidiIn(buffer); + } else { + sysexBuffer[sysexBufferIndex++] = b; + } + msg = msg >> 8; + } + } + + void sysexBegin(int msg) { + sysexBufferReset(); // start from 0, we have at least 256 bytes now + sysexBufferAppendStatus((byte) (msg & 0xFF)); // first byte is special + sysexBufferAppendBytes(msg >> 8, 3); // process remaining bytes + } + + public void handleMidiIn(PmEvent buffer) + { + if (trace) { + System.out.println("handleMidiIn: " + + Integer.toHexString(buffer.message)); + } + // rather than pass timestamps to every handler, where typically + // timestamps are ignored, just save the timestamp as a member + // variable where methods can access it if they want it + timestamp = buffer.timestamp; + int status = buffer.message & 0xFF; + if (status < 0x80) { + sysexBufferCheck(); // make enough space + sysexBufferAppendBytes(buffer.message, 4); // process 4 bytes + return; + } + int command = status & 0xF0; + int channel = status & 0x0F; + int data1 = (buffer.message >> 8) & 0xFF; + int data2 = (buffer.message >> 16) & 0xFF; + switch (command) { + case MIDI_NOTE_OFF: + noteOff(channel, data1, data2); break; + case MIDI_NOTE_ON: + if (data2 > 0) { + noteOn(channel, data1, data2); break; + } else { + noteOff(channel, data1); + } + break; + case MIDI_CONTROL: + control(channel, data1, data2); break; + case MIDI_POLY_TOUCH: + polyTouch(channel, data1, data2); break; + case MIDI_TOUCH: + touch(channel, data1); break; + case MIDI_PITCH_BEND: + pitchBend(channel, (data1 + (data2 << 7)) - 8192); break; + case MIDI_PROGRAM: + program(channel, data1); break; + case 0xF0: + switch (channel) { + case 0: sysexBegin(buffer.message); break; + case 1: mtcQuarterFrame(data1); + case 2: songPosition(data1 + (data2 << 7)); break; + case 3: songSelect(data1); break; + case 4: /* unused */ break; + case 5: /* unused */ break; + case 6: tuneRequest(); break; + case 7: sysexBufferAppendBytes(buffer.message, buffer.message); break; + case 8: clock(); break; + case 9: tick(); break; + case 0xA: clockStart(); break; + case 0xB: clockContinue(); break; + case 0xC: clockStop(); break; + case 0xD: /* unused */ break; + case 0xE: activeSense(); break; + case 0xF: reset(); break; + } + } + } + + // the value ranges from +8181 to -8192. The interpretation is + // synthesizer dependent. Often the range is +/- one whole step + // (two semitones), but the range is usually adjustable within + // the synthesizer. + void pitchBend(int channel, int value) { return; } + void control(int channel, int control, int value) { return; } + void noteOn(int channel, int pitch, int velocity) { return; } + // you can handle velocity in note-off if you want, but the default + // is to drop the velocity and call the simpler NoteOff handler + void noteOff(int channel, int pitch, int velocity) { + noteOff(channel, pitch); + } + // if the subclass wants to implement NoteOff with velocity, it + // should override the following to make sure all NoteOffs are handled + void noteOff(int channel, int pitch) { return; } + void program(int channel, int program) { return; } + // the byte array may be bigger than the message, length tells how + // many bytes in the array are part of the message + void sysex(byte[] msg, int length) { return; } + void polyTouch(int channel, int key, int value) { return; } + void touch(int channel, int value) { return; } + void mtcQuarterFrame(int value) { return; } + // the value is a 14-bit integer representing 16th notes + void songPosition(int value) { return; } + void songSelect(int value) { return; } + void tuneRequest() { return; } + void clock() { return; } // represents 1/24th of a quarter note + void tick() { return; } // represents 10ms + void clockStart() { return; } + void clockStop() { return; } + void clockContinue() { return; } + void activeSense() { return; } + void reset() { return; } +} diff --git a/pd/portmidi/pm_java/jportmidi/JPortMidiApi.java b/pd/portmidi/pm_java/jportmidi/JPortMidiApi.java new file mode 100644 index 000000000..45dd9d98b --- /dev/null +++ b/pd/portmidi/pm_java/jportmidi/JPortMidiApi.java @@ -0,0 +1,117 @@ +package jportmidi; + +public class JPortMidiApi { + public static class PortMidiStream { + private long address; + } + public static class PmEvent { + public int message; + public int timestamp; + } + + // PmError bindings + public final int pmNoError = 0; + public final int pmNoData = 0; + public final int pmGotData = -1; + public final int pmHostError = -10000; + public final int pmInvalidDeviceId = -9999; + public final int pmInsufficientMemory = -9998; + public final int pmBufferTooSmall = -9997; + public final int pmBufferOverflow = -9996; + public final int pmBadPtr = -9995; + public final int pmBadData = -9994; + public final int pmInternalError = -9993; + public final int pmBufferMaxSize = -9992; + + static public native int Pm_Initialize(); + static public native int Pm_Terminate(); + static public native int Pm_HasHostError(PortMidiStream stream); + static public native String Pm_GetErrorText(int errnum); + static public native String Pm_GetHostErrorText(); + final int pmNoDevice = -1; + static public native int Pm_CountDevices(); + static public native int Pm_GetDefaultInputDeviceID(); + static public native int Pm_GetDefaultOutputDeviceID(); + static public native String Pm_GetDeviceInterf(int i); + static public native String Pm_GetDeviceName(int i); + static public native boolean Pm_GetDeviceInput(int i); + static public native boolean Pm_GetDeviceOutput(int i); + static public native int Pm_OpenInput(PortMidiStream stream, + int inputDevice, + String inputDriverInfo, + int bufferSize); + static public native int Pm_OpenOutput(PortMidiStream stream, + int outputDevice, + String outnputDriverInfo, + int bufferSize, + int latency); + final static public int PM_FILT_ACTIVE = (1 << 0x0E); + final static public int PM_FILT_SYSEX = (1 << 0x00); + final static public int PM_FILT_CLOCK = (1 << 0x08); + final static public int PM_FILT_PLAY = + (1 << 0x0A) | (1 << 0x0C) | (1 << 0x0B); + final static public int PM_FILT_TICK = (1 << 0x09); + final static public int PM_FILT_FD = (1 << 0x0D); + final static public int PM_FILT_UNDEFINED = PM_FILT_FD; + final static public int PM_FILT_RESET = (1 << 0x0F); + final static public int PM_FILT_REALTIME = + PM_FILT_ACTIVE | PM_FILT_SYSEX | PM_FILT_CLOCK; + final static public int PM_FILT_NOTE = (1 << 0x19) | (1 << 0x18); + final static public int PM_FILT_CHANNEL_AFTERTOUCH = (1 << 0x1D); + final static public int PM_FILT_POLY_AFTERTOUCH = (1 << 0x1A); + final static public int PM_FILT_AFTERTOUCH = + (PM_FILT_CHANNEL_AFTERTOUCH | PM_FILT_POLY_AFTERTOUCH); + final static public int PM_FILT_PROGRAM = (1 << 0x1C); + final static public int PM_FILT_CONTROL = (1 << 0x1B); + final static public int PM_FILT_PITCHBEND = (1 << 0x1E); + final static public int PM_FILT_MTC = (1 << 0x01); + final static public int PM_FILT_SONG_POSITION = (1 << 0x02); + final static public int PM_FILT_SONG_SELECT = (1 << 0x03); + final static public int PM_FILT_TUNE = (1 << 0x06); + final static public int PM_FILT_SYSTEMCOMMON = + (PM_FILT_MTC | PM_FILT_SONG_POSITION | + PM_FILT_SONG_SELECT | PM_FILT_TUNE); + static public native int Pm_SetFilter(PortMidiStream stream, int filters); + static public int Pm_Channel(int channel) { return 1 << channel; } + final static public native int Pm_SetChannelMask(PortMidiStream stream, + int mask); + final static public native int Pm_Abort(PortMidiStream stream); + final static public native int Pm_Close(PortMidiStream stream); + static public int Pm_Message(int status, int data1, int data2) { + return (((data2 << 16) & 0xFF0000) | + ((data1 << 8) & 0xFF00) | + (status & 0xFF)); + } + static public int Pm_MessageStatus(int msg) { + return msg & 0xFF; + } + static public int Pm_MessageData1(int msg) { + return (msg >> 8) & 0xFF; + } + static public int Pm_MessageData2(int msg) { + return (msg >> 16) & 0xFF; + } + // only supports reading one buffer at a time + static public native int Pm_Read(PortMidiStream stream, PmEvent buffer); + static public native int Pm_Poll(PortMidiStream stream); + // only supports writing one buffer at a time + static public native int Pm_Write(PortMidiStream stream, PmEvent buffer); + static public native int Pm_WriteShort(PortMidiStream stream, + int when, int msg); + static public native int Pm_WriteSysEx(PortMidiStream stream, + int when, byte msg[]); + + public final int ptNoError = 0; + public final int ptAlreadyStarted = -10000; + public final int ptAlreadyStopped = -9999; + public final int PtInsufficientMemory = -9998; + static public native int Pt_TimeStart(int resolution); + static public native int Pt_TimeStop(); + static public native int Pt_Time(); + static public native boolean Pt_TimeStarted(); + static { + System.out.println("Loading pmjni"); + System.loadLibrary("pmjni"); + System.out.println("done loading pmjni"); + } +} diff --git a/pd/portmidi/pm_java/jportmidi/JPortMidiException.java b/pd/portmidi/pm_java/jportmidi/JPortMidiException.java new file mode 100644 index 000000000..9be8aaf6a --- /dev/null +++ b/pd/portmidi/pm_java/jportmidi/JPortMidiException.java @@ -0,0 +1,12 @@ +// JPortMidiException -- thrown by JPortMidi methods + +package jportmidi; + +public class JPortMidiException extends Exception { + public int error = 0; + public JPortMidiException(int err, String msg) { + super(msg); + error = err; + } +} + diff --git a/pd/portmidi/pm_java/mac-make.sh b/pd/portmidi/pm_java/mac-make.sh new file mode 100644 index 000000000..e5e9592b0 --- /dev/null +++ b/pd/portmidi/pm_java/mac-make.sh @@ -0,0 +1,26 @@ +# script to build a jar file to run PmDefaults from the command line on OS X +# (This is for debugging. Normally, you would use XCode to build PmDefaults.app.) + +# Compile the java Portidi interface classes. +javac jportmidi/*.java + +# Compile the pmdefaults application. +javac -classpath . pmdefaults/*.java + +# Temporarily copy the portmusic_logo.png file here to add to the jar file. +cp pmdefaults/portmusic_logo.png . + +# Create a directory to hold the distribution. +mkdir mac-osx + +# Copy the interface DLL to the distribution directory. +cp ../Release/libpmjni.dylib mac-osx + +# Create a java archive (jar) file of the distribution. +jar cmf pmdefaults/manifest.txt mac-osx/pmdefaults.jar pmdefaults/*.class portmusic_logo.png jportmidi/*.class + +# Clean up the temporary image file now that it is in the jar file. +rm portmusic_logo.png + +echo "You now have a jar file in mac-osx" + diff --git a/pd/portmidi/pm_java/make.bat b/pd/portmidi/pm_java/make.bat new file mode 100644 index 000000000..b614e3f21 --- /dev/null +++ b/pd/portmidi/pm_java/make.bat @@ -0,0 +1,47 @@ +@echo off + +rem Compile the java PortMidi interface classes. +javac jportmidi/*.java + +rem Compile the pmdefaults application. +javac -classpath . pmdefaults/*.java + +rem Temporarily copy the portmusic_logo.png file here to add to the jar file. +copy pmdefaults\portmusic_logo.png . > nul + +rem Create a directory to hold the distribution. +mkdir win32 + +rem Attempt to copy the interface DLL to the distribution directory. + +if exist "..\release\pmjni.dll" goto have-dll + +echo "ERROR: pmjni.dll not found!" +exit /b 1 + +:have-dll +copy "..\release\pmjni.dll" win32\pmjni.dll > nul + +rem Create a java archive (jar) file of the distribution. +jar cmf pmdefaults\manifest.txt win32\pmdefaults.jar pmdefaults\*.class portmusic_logo.png jportmidi\*.class + +rem Clean up the temporary image file now that it is in the jar file. +del portmusic_logo.png + +rem Copy the java execution code obtained from +rem http://devwizard.free.fr/html/en/JavaExe.html to the distribution +rem directory. The copy also renames the file to our desired executable +rem name. +copy JavaExe.exe win32\pmdefaults.exe > nul + +rem Integrate the icon into the executable using UpdateRsrcJavaExe from +rem http://devwizard.free.fr +UpdateRsrcJavaExe -run -exe=win32\pmdefaults.exe -ico=pmdefaults\pmdefaults.ico + +rem Copy the 32-bit windows read me file to the distribution directory. +copy pmdefaults\readme-win32.txt win32\README.txt > nul + +rem Copy the license file to the distribution directory. +copy pmdefaults\pmdefaults-license.txt win32\license.txt > nul + +echo "You can run pmdefaults.exe in win32" diff --git a/pd/portmidi/pm_java/pmdefaults-setup-script.iss b/pd/portmidi/pm_java/pmdefaults-setup-script.iss new file mode 100644 index 000000000..44622ba6a --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults-setup-script.iss @@ -0,0 +1,44 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. +; Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{5094958B-3CD7-4780-A883-69C9E5B95AEF} +AppName=PmDefaults +AppVerName=PmDefaults +AppPublisher=Roger Dannenberg - Carnegie Mellon University +AppPublisherURL=http://portmedia.sourceforge.net/ +AppSupportURL=http://portmedia.sourceforge.net/ +AppUpdatesURL=http://portmedia.sourceforge.net/ +DefaultDirName={pf}\PmDefaults +DefaultGroupName=PmDefaults +LicenseFile=C:\Users\rbd\portmedia\portmidi\pm_java\win32\license.txt +OutputBaseFilename=setup +SetupIconFile=C:\Users\rbd\portmedia\portmidi\pm_java\pmdefaults\pmdefaults.ico +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmdefaults.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmdefaults.jar"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\pmjni.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "C:\Users\rbd\portmedia\portmidi\pm_java\win32\license.txt"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\PmDefaults"; Filename: "{app}\pmdefaults.exe" +Name: "{commondesktop}\PmDefaults"; Filename: "{app}\pmdefaults.exe"; Tasks: desktopicon +Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\PmDefaults"; Filename: "{app}\pmdefaults.exe"; Tasks: quicklaunchicon + +[Run] +Filename: "{app}\pmdefaults.exe"; Description: "{cm:LaunchProgram,PmDefaults}"; Flags: nowait postinstall skipifsilent + diff --git a/pd/portmidi/pm_java/pmdefaults/PmDefaults.java b/pd/portmidi/pm_java/pmdefaults/PmDefaults.java new file mode 100644 index 000000000..20708fc9b --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/PmDefaults.java @@ -0,0 +1,11 @@ +// PmDefaults -- a small application to set PortMIDI default input/output + +package pmdefaults; + +public class PmDefaults { + public static void main(String[] args) { + System.out.println("starting main"); + new PmDefaultsFrame("PortMIDI Setup"); + } +} + diff --git a/pd/portmidi/pm_java/pmdefaults/PmDefaultsFrame.java b/pd/portmidi/pm_java/pmdefaults/PmDefaultsFrame.java new file mode 100644 index 000000000..b38af1b0f --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/PmDefaultsFrame.java @@ -0,0 +1,428 @@ +// PmDefaults -- a small application to set PortMIDI default input/output + +/* Implementation notes: + +This program uses PortMidi to enumerate input and output devices and also +to send output messages to test output devices and +to receive input messages to test input devices. + +*/ + +package pmdefaults; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.lang.Math.*; +import jportmidi.*; +import jportmidi.JPortMidiApi.*; +import java.util.ArrayList; +import java.util.prefs.*; +import java.net.*; + +public class PmDefaultsFrame extends JFrame + implements ActionListener, ComponentListener { + + // This class extends JPortMidi in order to override midi input handling + // In this case, midi input simply blinks the activity light + public class JPM extends JPortMidi { + ActivityLight light; + PmDefaultsFrame frame; + int lightTime; + boolean lightState; + int now; // current time in ms + final int HALF_BLINK_PERIOD = 250; // ms + + public JPM(ActivityLight al, PmDefaultsFrame df) + throws JPortMidiException { + light = al; + frame = df; + lightTime = 0; + lightState = false; // meaning "off" + now = 0; + } + + public void poll(int ms) throws JPortMidiException { + // blink the light. lightState is initially false (off). + // to blink the light, set lightState to true and lightTime + // to now + 0.25s; turn on light + // now > ligntTime && lightState => set lightTime = now + 0.25s; + // set lightState = false + // turn off light + // light can be blinked again when now > lightTime && !lightState + now = ms; + if (now > lightTime && lightState) { + lightTime = now + HALF_BLINK_PERIOD; + lightState = false; + light.setState(false); + } + super.poll(); + } + + public void handleMidiIn(PmEvent buffer) { + System.out.println("midi in: now " + now + + " lightTime " + lightTime + + " lightState " + lightState); + if (now > lightTime && !lightState) { + lightState = true; + lightTime = now + HALF_BLINK_PERIOD; + light.setState(true); + } + } + } + + public class ActivityLight extends JPanel { + Color color; + final Color OFF_COLOR = Color.BLACK; + final Color ON_COLOR = Color.GREEN; + + ActivityLight() { + super(); + Dimension size = new Dimension(50, 25); + setMaximumSize(size); + setPreferredSize(size); + setMinimumSize(size); + color = OFF_COLOR; + System.out.println("ActivityLight " + getSize()); + } + + public void setState(boolean on) { + color = (on ? ON_COLOR : OFF_COLOR); + repaint(); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); // paint background + g.setColor(color); + int x = (getWidth() / 2) - 5; + int y = (getHeight() / 2) - 5; + g.fillOval(x, y, 10, 10); + g.setColor(OFF_COLOR); + g.drawOval(x, y, 10, 10); + } + } + + private JLabel inputLabel; + private JComboBox inputSelection; + // inputIds maps from the index of an item in inputSelection to the + // device ID. Used to open the selected device. + private ArrayList<Integer> inputIds; + private ActivityLight inputActivity; + private JLabel outputLabel; + private JComboBox outputSelection; + // analogous to inputIds, outputIds maps selection index to device ID + private ArrayList<Integer> outputIds; + private JButton testButton; + private JButton refreshButton; + private JButton updateButton; + private JButton closeButton; + private JLabel logo; + + private JPM jpm; + private Timer timer; + + public void componentResized(ComponentEvent e) { + System.out.println(e); + if (e.getComponent() == this) { + Insets insets = getInsets(); + Dimension dim = getSize(); + layoutComponents(dim.width - insets.left - insets.right, + dim.height - insets.top - insets.bottom); + } + } + public void componentMoved(ComponentEvent e) { + System.out.println(e); + } + public void componentHidden(ComponentEvent e) { + System.out.println(e); + } + public void componentShown(ComponentEvent e) { + System.out.println(e); + } + + + PmDefaultsFrame(String title) { + super(title); + initComponents(); + System.out.println("initComponents returned\n"); + pack(); // necessary before calling getInsets(); + // initially, only width matters to layout: + layoutComponents(550, 300); + System.out.println("after layout, pref " + getPreferredSize()); + // now, based on layout-computed preferredSize, set the Frame size + Insets insets = getInsets(); + Dimension dim = getPreferredSize(); + dim.width += (insets.left + insets.right); + dim.height += (insets.top + insets.bottom); + setSize(dim); + System.out.println("size" + getPreferredSize()); + addComponentListener(this); + + timer = new Timer(50 /* ms */, this); + timer.addActionListener(this); + try { + jpm = new JPM(inputActivity, this); + jpm.setTrace(true); + loadDeviceChoices(); + timer.start(); // don't start timer if there's an error + } catch(JPortMidiException e) { + System.out.println(e); + } + } + + void openInputSelection() { + int id = inputSelection.getSelectedIndex(); + if (id < 0) return; // nothing selected + id = (Integer) (inputIds.get(id)); // map to device ID + // openInput will close any previously open input stream + try { + jpm.openInput(id, 100); // buffer size hopes to avoid overflow + } catch(JPortMidiException e) { + System.out.println(e); + } + } + + // make a string to put into preferences describing this device + String makePrefName(int id) { + String name = jpm.getDeviceName(id); + String interf = jpm.getDeviceInterf(id); + // the syntax requires comma-space separator (see portmidi.h) + return interf + ", " + name; + } + + + public void savePreferences() { + Preferences prefs = Preferences.userRoot().node("/PortMidi"); + int id = outputSelection.getSelectedIndex(); + if (id >= 0) { + String prefName = makePrefName(outputIds.get(id)); + System.out.println("output pref: " + prefName); + prefs.put("PM_RECOMMENDED_OUTPUT_DEVICE", prefName); + } + id = inputSelection.getSelectedIndex(); + if (id >= 0) { + String prefName = makePrefName(inputIds.get(id)); + System.out.println("input pref: " + prefName); + prefs.put("PM_RECOMMENDED_INPUT_DEVICE", prefName); + } + try { + prefs.flush(); + } catch(BackingStoreException e) { + System.out.println(e); + } + } + + public void actionPerformed(ActionEvent e) { + Object source = e.getSource(); + try { + if (source == timer) { + jpm.poll(jpm.timeGet()); + } else if (source == refreshButton) { + if (jpm.isOpenInput()) jpm.closeInput(); + if (jpm.isOpenOutput()) jpm.closeOutput(); + jpm.refreshDeviceLists(); + loadDeviceChoices(); + } else if (source == updateButton) { + savePreferences(); + } else if (source == closeButton) { + if (jpm.isOpenInput()) jpm.closeInput(); + if (jpm.isOpenOutput()) jpm.closeOutput(); + } else if (source == testButton) { + sendTestMessages(); + } else if (source == inputSelection) { + // close previous selection and open new one + openInputSelection(); + } else if (source == outputSelection) { + jpm.closeOutput(); // remains closed until Test button reopens + } + } catch(JPortMidiException ex) { + System.out.println(ex); + } + }; + + private void layoutComponents(int width, int height) { + // I tried to do this with various layout managers, but failed + // It seems pretty straightforward to just compute locations and + // sizes. + + int gap = 2; // pixel separation between components + int indent = 20; + int y = gap; + + // inputLabel goes in upper left + inputLabel.setLocation(0, y); + inputLabel.setSize(inputLabel.getPreferredSize()); + + // inputSelection goes below and indented, width based on panel + y += inputLabel.getHeight() + gap; + inputSelection.setLocation(indent, y); + // size of inputSelection must leave room at right for inputButton + // (in fact, inputActivity goes there, but we'll make inputSelection + // and outputSelection the same size, based on leaving room for + // testButton, which is larger than inputActivity.) + Dimension dim = inputSelection.getPreferredSize(); + Dimension dimButton = testButton.getPreferredSize(); + // make button and selection the same height so they align + dim.height = dimButton.height = Math.max(dim.height, dimButton.height); + // make selection width as wide as possible + dim.width = width - indent - dimButton.width - gap; + inputSelection.setSize(dim); + + // inputActivity goes to the right of inputSelection + inputActivity.setLocation(indent + dim.width + gap, y); + // square size to match the height of inputSelection + inputActivity.setSize(dim.height, dim.height); + + // outputLabel goes below + y += dim.height + gap; + outputLabel.setLocation(0, y); + outputLabel.setSize(outputLabel.getPreferredSize()); + + // outputSelection is like inputSelection + y += outputLabel.getHeight() + gap; + outputSelection.setLocation(indent, y); + outputSelection.setSize(dim); + + // testButton is like inputActivity + testButton.setLocation(indent + dim.width + gap, y); + testButton.setSize(dimButton); + System.out.println("button " + dimButton + " selection " + dim); + + // refreshButton is below + y += dim.height + gap; + dim = refreshButton.getPreferredSize(); + refreshButton.setLocation(indent, y); + refreshButton.setSize(dim); + + // updateButton to right of refreshButton + int x = indent + dim.width + gap; + updateButton.setLocation(x, y); + dim = updateButton.getPreferredSize(); + updateButton.setSize(dim); + + // closeButton to right of updateButton + x += dim.width + gap; + closeButton.setLocation(x, y); + dim = closeButton.getPreferredSize(); + closeButton.setSize(dim); + + // place logo centered at bottom + y += dim.height + gap; + logo.setLocation((width - logo.getWidth()) / 2, + height - gap - logo.getHeight()); + + // set overall size + y += logo.getHeight() + gap; + System.out.println("computed best size " + width + ", " + y); + setPreferredSize(new Dimension(width, y)); + } + + private void initComponents() { + Container wholePanel = getContentPane(); + wholePanel.setLayout(null); + setLayout(null); + + inputLabel = new JLabel(); + inputLabel.setText("Default Input"); + wholePanel.add(inputLabel); + + inputSelection = new JComboBox(); + inputSelection.addActionListener(this); + inputSelection.setLocation(20, 30); + inputSelection.setSize(inputSelection.getPreferredSize()); + System.out.println("Adding inputSelection to panel"); + wholePanel.add(inputSelection); + inputIds = new ArrayList<Integer>(); + + inputActivity = new ActivityLight(); + wholePanel.add(inputActivity); + + outputLabel = new JLabel(); + outputLabel.setText("Default Output"); + wholePanel.add(outputLabel); + + outputSelection = new JComboBox(); + outputSelection.addActionListener(this); + wholePanel.add(outputSelection); + testButton = new JButton(); + testButton.setText("Test"); + testButton.addActionListener(this); + wholePanel.add(testButton); + outputIds = new ArrayList<Integer>(); + + refreshButton = new JButton(); + refreshButton.setText("Refresh Device Lists"); + System.out.println("refresh " + refreshButton.getPreferredSize()); + System.out.println(getLayout()); + refreshButton.addActionListener(this); + wholePanel.add(refreshButton); + + updateButton = new JButton(); + updateButton.setText("Update Preferences"); + updateButton.setSize(refreshButton.getPreferredSize()); + updateButton.addActionListener(this); + wholePanel.add(updateButton); + + closeButton = new JButton(); + closeButton.setText("Close/Release Ports"); + closeButton.setSize(refreshButton.getPreferredSize()); + closeButton.addActionListener(this); + wholePanel.add(closeButton); + + // load the logo from the jar file (on Linux and Windows) + ClassLoader cldr = this.getClass().getClassLoader(); + ImageIcon icon; + URL logoURL = cldr.getResource("portmusic_logo.png"); + if (logoURL == null) { + // on Mac, load from bundle + icon = new ImageIcon("portmusic_logo.png"); + } else { + icon = new ImageIcon(logoURL); + } + logo = new JLabel(icon); + logo.setSize(logo.getPreferredSize()); + wholePanel.add(logo); + + setVisible(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + void loadDeviceChoices() throws JPortMidiException { + // initialize and load combo boxes with device descriptions + int n = jpm.countDevices(); + inputSelection.removeAllItems(); + inputIds.clear(); + outputSelection.removeAllItems(); + outputIds.clear(); + for (int i = 0; i < n; i++) { + String interf = jpm.getDeviceInterf(i); + String name = jpm.getDeviceName(i); + System.out.println("name " + name); + String selection = name + " [" + interf + "]"; + if (jpm.getDeviceInput(i)) { + inputIds.add(i); + inputSelection.addItem(selection); + } else { + outputIds.add(i); + outputSelection.addItem(selection); + } + } + } + + void sendTestMessages() { + try { + if (!jpm.isOpenOutput()) { + int id = outputSelection.getSelectedIndex(); + if (id < 0) return; // nothing selected + id = (Integer) (outputIds.get(id)); + System.out.println("calling openOutput"); + jpm.openOutput(id, 10, 10); + } + jpm.midiNote(0, 67, 100); // send an A (440) + jpm.midiNote(0, 67, 0, jpm.timeGet() + 500); + } catch(JPortMidiException e) { + System.out.println(e); + } + } +} + diff --git a/pd/portmidi/pm_java/pmdefaults/README.txt b/pd/portmidi/pm_java/pmdefaults/README.txt new file mode 100644 index 000000000..eb24f5f1d --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/README.txt @@ -0,0 +1,21 @@ +README.txt +Roger B. Dannenberg +2 Jan 2009 + +PmDefaults is a program to set default input and output devices for PortMidi +applications. After running the PmDefaults program and choosing devices, +identifiers for these devices will be returned by +Pm_GetDefaultInputDeviceID() and Pm_GetDefaultOutputDeviceID(). + +Included in this directory are: + +manifest.txt -- used in pmdefaults.jar +pmdefaults-icon.* -- various icons for applications +pmdefaults-license.txt -- a version of portmidi/license.txt formatted for + the windows installer +portmusic_logo.png -- a logo displayed by the pmdefaults application +readme-win32.txt -- this becomes the readme file for the pmdefaults + application. It is copied to win32/README.txt by make.bat + +TO BUILD THE APPLICATION: see ../README.txt + diff --git a/pd/portmidi/pm_java/pmdefaults/manifest.txt b/pd/portmidi/pm_java/pmdefaults/manifest.txt new file mode 100644 index 000000000..f2e301636 --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/manifest.txt @@ -0,0 +1 @@ +Main-Class: pmdefaults/PmDefaults diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults b/pd/portmidi/pm_java/pmdefaults/pmdefaults new file mode 100755 index 000000000..80162469a --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/pmdefaults @@ -0,0 +1 @@ +java -jar /usr/share/java/pmdefaults.jar > /dev/null diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.bmp b/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b34ccd295ab850b37975edbae2fbda46dd6a443f GIT binary patch literal 17464 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 aGxi5A*?+zQeCYF!ADJKO@nO%ubN>%>=M*~t literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.gif b/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d8866cb1dff062c0b749c9fb834106bcfa4dfac GIT binary patch literal 6976 zcmWNVWmuC91BIVw8)F+|LBojA-8Cc}A)};AK-g#mB%~x{bmM3gd>tZ4I}lJ26buAW zoDx#6&O$+X#Q*_6=jYFJ&Y$z=T-SXaioGq#ghmJGz=uBo00Izz2Y~Rv05~u3S7Jce zUr!8x2*Cg$9tbZ0N+JLZ1ds*bNH`P;g+l;P2>{i20Vx2E0|9LS3E=@0VLW&MGys4@ z2p$v&8UmmRz)JwY!vIVN&MN?bM|c4;4`2&G9ASVH4@wNeCj|lgpr8i;b%&zV0Jt59 zumE6wJU}o2rSSk!Xg+BGdICVWK~S~;!UupR0q`&sj~f!BfPw}Bh#(Y@2%!I_eo(Y0 zKUNKnh(`$OVDRby@(dDM1fb)EfGj}3myd^z6VL<rPowyv0bC3q5W$BD;ukg%5Yh+u zOCk6y5fM|om=#{!93$z-C!8)UVFQRT@zO`3l4tN@$wCqd1SuC`$uJS3H=j(pjA(+0 zSb-=pKujtYuNXui<VeW-;bp3%Bp5=(av8;7aiwGlm1vA|ql7|<xNI{)zMe<BK~XVP zN<CIuxj;rWTS+xmMyZ;pku0HoMnNl0Qa4*#m#(D7AnFwpwa=^S<f>{_=&4s|sJE!= zlqeXK%4>JZYq6wAwMvHNN(R+hx(scd24$lPWxX~%t!@qDW=)d@W%Cx2!DW(umyYRq zU6XcIvp%)Mtp=naL(@)8^XppV9wUp(7N(a?%m!4B4C`54)wdebC*Re#J7;is+KhbF z+@{UKx?AhW6O$t&B>N6sySpZKR}a|@nc0o1IX^LUd|>SK(8zv;Z2R2Se!#-Hk8J;d z<TOih>eF#~dDN-Z+Uc&1!>pMz+uo(y(Q#DYeZ|1-wT1JNwO5DTk#C3Ho*Z_aqqvSA z_MEWw7&P`=b8uR5aGpElz2xrv(9Lbs+ULHF#|u-h_eY)AY`kY2y>5Fuu9^FAY&~9@ zdw)3U{>;LE*2(v#v*(Ph--MIjkc<10ozJ|p?}WYAYfIlvH;)xBpIZ(-YgYdMk^;Uv z__5u5r)~T`y9Nz<`MfylzvSz}b@qEj33+CJeA_-?*EMLtIqZ%b?U_@^EC0Y3vRq;7 z#4uV?SST?yDk+la85u^T*dKKTH2#j^??mVTfZzf<NJ%>ub0QBRs1`8AYPna0_-@~9 z*MI3jnV9~GwW<ErhiAoPOC{|GF56e_zibQW98jET&<eTRta?r9Nt4m3H*1|9;kRqZ zc_^t;mh#h9+Zws!U4t7(FS)ilB;Rm<^|agjTJXPJL+UTC2Hwk+QXke>z7~F*+x%!) zb3PSvalJ{Y`{eQ1e;a2nM_>0OjcJAbo{+b{<Z+SSe6#k$Y~)fs@9ULBB6A>&H^jZV zIcAv-Krtgpg6Af4qIk17^^bp20G@??XA-mR(7^4L=(i(-UC*mPsBFq(#Oq~<$V*C< z<AEl1{KG4Ziowh2TTM`?iUv<&(VFTP1EvpGOP|`pdcwNSFL-}!jm#VxE;eO(`OE%# zl>_U_D0pB{RWMXhBoTML1hz_miLu-@FTVHj%!%(6ZgH6Uy50m9_}010+-a*mYnm4S z0WF>VzqYeR^#8p^$9=KWql4LYwRJeA>ae>7i<85v@n1k#nG6)iF3_-Oza&r0cKhgD zB6Mcyp~2x^+Bnck^O%Z@9#53l$g_Xr;*)?+bG6tqi4-n^lB!)qF){s<Q5e{BUKlRT zXp%gGWV~`wJN8Cg8oFgQajNgwrKbjLlMjIOe$3Y<5QpZBOYqz-xl7)s(#Rt5ImUDc znizu<k=2}bHx7s3kR>wLjc8t6FV%1UvTE<=W;)@um#}!I3657<n>&0&=Ke8qnT=L( zah=5=4ww+}UVbBqzmy-$b74eDZ!*sPhnu4e2F<3Zwg-S4rO{TLaj!3riQ_`v6<?Pl zhnpw1YQB6X(uIcSzriDK2~91Kciz99D$}RRKENO)h!0#m(o#yu-%yNm76TH*5^|XB zo}m84-`ADmH!mwZ?ezU$=uD45tpAkFkgEuyqkUpH5B#%n&Gytc#Na>%WbC^*^YH6_ zYfXW0FWFm%r`4hu7m>Kh$OF5t1Ov6Lul~y31#gxght75l_THhjJWr-gK^x3gQMld? z%%fANfTeu7Hjut~t$;hC@zU&p%b!CGAB)j(P5BBaRkv7kV<Lr6U@7=xuHcxRT!~@} zIWOQo^!|I^$dPpq)EUW|zGD_Gqe~A=*=8%-t;&0k2W&1RC3Ky#)H`q%sSX~w2V~!o ze}Bb$AvoQFy?yWzUEwMw+wMqd{5rESt-@IN#Qjm!(e}T0hM;!Q)<194iqE$g-@)UH zWeNthkp`;IAlJ$71&IYR?Soq6&h+lGg-$2j)W7e(*4)j}Hhz3J4;Ki_Ih@~_9wIPR z0M8*eIOPC@sYf5+)Uu0>xk(4Uv*7D*m_S&xIK%`5IXf6sU2ej`-g3rh6;mhleMHut zy{LkrM2VBS1NWkvzeQ-In3;;4`j{O6Q(@JwjVh=QjR=6do^?4?ZL8IpIxmZ2*}8X8 z{OvkNl)2=bPnRvN{RHW%ivoyd`_M2L>C#u&c-QJ$Z1O%rviBWc4La^9v#Upb`a`$; z)w>FDB&wirm_v7b-EOhd?~oxWYtmpx17ux~68Oo4ta6Ms<m+6k({~m1c{stCKo;9} zg}FuDjkstMd>f(DX|ACIgEr=n9jb`D%|L^(e6G!SEA!%%yd6d*7iyI=X0X@7H<)?0 zarn6c%Dya5L$!FZvbEX^L4=wAC_GhJV3uW$B6;h~SA5H<&<%)iFujpao5w@IB<(^p z_tz8Q7&jz>Nw&>FJO@%-OSi@>i6uI897~{h9k?R&Qp}oh#u|(YK4FET!Sxj$8f0w; zGY)U?7%eUE3n{%jT`gE_7UNc0A#$HUcwb|YjxU?o$P+hzJLllmp|>+{C8e?h*Nm|o zU!BSm9bEeOJ)n(n;t|3dYcspSyz!5pmx9w!t|WwCzsfJFEmv<0<s+#)*JJgi`@Ag8 z#}hhzS=dJZ)7R2;xdDyb65&34Ot3KTu5b_2K+B~!`dIz&qR!Ew&e=R1B|_k4ePpuv zrydk?qH9S+ZC7*&*XTVeVe&xFFp}ZXLz92e1+k1f#!xM#A_tpz4RwbcrMSJmod@0@ zkRskKu>y^D(JQrbI$gBb-tY^)tC_ymlD9ZE*tvUdT}r!GS)J?0f{y4+DIM)~{kLal z)?uyVV7Iri>yib-Ef3{Mhh6>HoA&h48dGX``14pK#pRa2K-bVnb)9Rf%-ff2ZoP3E z0P^4fh((&Uu>*8&U~|QW=j_oNRXuY4$WQYxZGDWzc4Bhzj{{(L<so-W=!kE`GS|Tt zlt~(d|2!4unj~M%$zu8`qeIr-47ECqeaUy>HTg4gouyg3o$ZrYi58*)P|`RI!vb&t z902J{hAOZ@!A#ktmEZkg59Mk$y}w<b?~V6WFQMtuQt!<rX>i*&-ST+InkRTk07ONn zBQB5*RU|@F|Koe{sWioD;eK~v(yA|C^l*Xse|;xsR#w>I`_if%;~>L~4l$rZW%kHC z3h}@r1@bI$>Rv<s8trQHm1~8`NsZUc)?d_%_eF4HFKYf;%y>tK)@YF-3Pgx?c`&9h zZ33&sq9cXI0Ys#wqV)2z_|HY+jkcl8y7sr57IAmC+ID?qD4XrxkrK`w00hON>$Bd< ztbZ&tt$$saLWJ^4Gy>J4xcqc8kuK*gy)Jd9m8F5QF47spiqx6cwd1~uANH(xP_6*- zajUe`uM)kNIVBjU^AKVqA@c3!=VD;L7hTC2;&zud$^5EYE!j<>tb%{RlL<&R7Ev!y zP{{moke_qUBlUZo)*qkuHx*A#g+-sx$BN!AoIGl=GEs^tH-)~R((s|E7a~Yhh>2ZM z?4f^NJV}x2-m8eSJmIvBN=|zgTwSECM+ab`9C5;#E;2_pcetA)V_{tO;>+rd{r1cc zz>8leX1GDO1yy8L<I@pjplq|s(8{Ip8e-B?U?8`1GF@s5su-G9DLOoF^Yo<mYzxFB zVqDb!$cD>f79E!fe2F~$#xv|tERtaKeesjY?ar*z>$U?%(lZXmX)FNd$rR9@jAoqn zD1Z~Gu-b;*Ykan^DyzqCZ`Iu@6yQo`-pngl$XATDNQ|c!=H;ANdO^X6#M6b#{km4M zH`1LkKc1%){e(ns+f44hUHvYzU@%OzW&!mgJf~ZdD&At+QUPaX^8A(bRiDKEoftiM zW~XgNy<$$bVk&n%D>B08fXP!c3@GX7AQ#aJ9FU)g;8XJX6A^z=)I1YH=&Lu#5;>#y zEug49&^{tX^FHs%LO^C*s-s<YpNYJo1YUOamZ3yj{q#C=<8+Skv6acZ`YZl|c99>S zW!JEQ@hT7}dgg%5A54zX;$R&YPK@%3N5Ex`c1Z-|@bh(H{=*5>D~0kAei@4RD>$%P z4x9n({Sx?PSb!)M!p$^J>|T#Mm6l~Rl`ZC#crwjRB0MOdJ{?Nq6L1yBGx^Vc6`UY~ zNCp_hINcwX<3!3K)%$uZ6!xx@dfEyTRdnu9GUy9@!rOBE<H&#r;Y1vWAVV&)eCm?Z z7I@Qz#Ik?XQT+`|9)FDKP%P^iIu_rLb~Xn1$cT|ESOXTo$As(vxm^g~e<)=;Kf~sB z@-dU;OUf0k$+Vwj2rm&3WWvXMvD$0^uLH|W^&c;g<}W-wZ(KCIbleyb8?sO+MF~*H zf%WS=18oAA$PhdO9NqS-_leI{IriHysDYAkz*|<0D9~NcJ))dy&MM(!K!-^<*KtsQ z&4pwP2eIp_4t9>!!Ng@ZG7!U_o`_7(Vyc*Lq}dX`3pJE)8`d@?@PY~<x`GAUiY=6a zKZWjG;p5VsL9=@`7q8Sgo{N3{u}bYVe-J&Ie;Yz8CX6vbfo-stLt0u7nAs~HTnHF_ z=$V*SnmX;TSDy{bD?J*F5av`Irel8?!tiXsIUZ|kS5%42;a^O(@b&Y&nb%1QuW73* zCuIc7nN$#?_?X~RwtTuB^k53EUtc^dmMLd)YP&7_f?+g8v}Elk^^~}eur2ycJs?HK zM0ODR7!Ywbco%3=rX2m9QdF#1|6(U@&c;8Dlo!93u<EVzavLq_`j`2~!2$C5t_dCz z8>-F5r29se7kV`-*P>|V{*w`+DdDA&O|z#XSBK7h;b7h{E<o8JW4!Sb%!A9$eYlZK zGh{~X6uN&*&hha!j`EY64x;{yI7Z`_cLjtP;3;wn>SkTV-m&K;*|kfh?2tN{sMtT= zbsKxs;Bbtt4tVk>4>v01Y$TIrTsbZrnbld~oZqnapyie!(?;CnZ9KI7O06k8*Qq$% z1YZ5_qqpjjwAzmio68xSRkWzIq<seF7aM8Ef@tYPL5ZMAe0hdy5-T#VrmiTi(bsjU zTz5DqS(W)7Da&=mp3{LTav;J$`9)m-&#VnGzT$L{&1LMJwcqrwT)cea=h=6NBTk5D zk_w+O8zhqHE60E=HGm%nd%2iZx7_jdL(S%f4XG>rxL5q68^U>%b1-BscN{7+4xtQ# z$#SZftQ_$GtZ}cIOToim=gXrmO^h55J;(|)^zXFo@LNDzQcq<$L<z-*T0V~_Q!Br1 z#4gr#eYu%cJzW*E;MEsio=8d>4f8kY!2Skc7!ySgtEd|`QGZVhZB|4&qT$=Q#2ZmH zfg*tuq8(dp4U9wnDiSS_*I08_pT}L`4y}930icz_LBFJmrI<kE<=sc8{C0YmlS2Ab z`dE!Uk~^5yZBQCeg^mMgGJqjyKy<ijk__G-k1Bl*MP6C(z899Os2aHvcD1OjAbKdI zWP!hK8$<%Ca29C!?a=ko7)2JAJDl^|F!n2@YxKeCwv`BFziWI4c2@+etvAeN;(@bP zQ7)}ocJ%;}%KM*q%Xbr>{B%YyDwf_k)YutYIoyTskbOXe@G}Ni_7f?)gm*>|yZC0} zbbIHKYZ0kwJxf)32mQM~*S{mvO-*n?Z?Icz^f-CIZk>hJ>DI0em16R|)al5d43RDC zI(1O#mX=qsJ0x{JFUrgJ^BXLS2-hNl{PDnz9|X)Vf(RA7Bmfa$@@@dvdH4OkFJG-K zc0;EO;U~*q87B=y2{&**VdnuJDK;QY24xw5Gy~ueBAikHX*vMmq}(4bEm33jN0nD} zhFNV~mOVd|c&N?1$$-nkhSK4YI358OAk6_CL_i`vN^u;T%R<JmV3=lPm}@3RG%%qt z3)yu}$mv#7>X3`t70tco*?mk04k}Ir1z1-ORKUh?h_((aW}I(*Tq~Z2wa0;F4QO3Q zCZ?<W(MR3K;dM~nz@QCk=7Zzo5%J{=h&1PKLr{kWi{&7P$I<`kkPdaBDQp0P1E+E4 z=9L5AZRRIMP5k?)-7K<MTdeH`PZS>q_yNbTN`ew8Ja~FS9$PH<YrafR)}P{nv7$=u zu4!G4vj0IcN-{pGhkbcllvb<L*s6X>Nm+zomv_4R;n0;6tdbP4vo1kY^rtICiVXQo zHq;bP$b?`tw`;YTfiJ?RD@%O|BDKA_HKmWwRR<Jk-0g~=K!*|`3OJo>O-G;cVd7a) z5o|9;#!Qv!L-W<_2B$k`49EVAJoeiW+-5+O$nf*2IsWz7mqb1p9Z;BsSco{SnHHD5 z^QhV9qLoHp?&E3e{}p$Up``6##r^gl+YmlFBxt*-zP!1rr2YO*|ITJA#n^W@^?GQG z*xa~>&8T;;6%-#27}2po&mSSSGFBIBTKs&THD&ydm;GC`qW`AX$%Qi36c;HT4~Ua7 z?o(k=W+k4c&j%yfO=!m2LC)!0Q@P5=_1v*S%Yg6&EU0#i6zh+gy!PnkRlN9f=h%ru zH}Wnv<V=%{_Q`M}9Z)92B8c!{fOmNNjNI?}#{@P`DBRrW(vk8Wm#JgF57HW@Xa^h~ z3HF#YIZS37lI+?eQ6cS%7#iB}FKX+ue^SHu`?!eM{r>4gRoh_6GAM_G*0PTOESs!| z{wJ%189KDMhPraI?Xu8tWRxcEEd#2EgH>?QuYHH|15SXQmoS^>U%j7yNvT{wm#`+Q zEY(_4>#$u6KEF@7;alfF+utXt(SF*lULBi;R&?waUfUr=+i(Mxza%GyuZ;{|=&C54 znBP?kUptL^Q}cOx=<bD{@U6v9dxcY)PhzBMn<#fU4}CSKkF{lvm`UD@7;WLEm*<aB z!HOLJ_t@WbEbL@s!cI3tSK>FWpXXNVdH^eUjM{4-o~0aaF}Zw`a;~a-l-QdQZgvZU zI<Ay98)(|VJu<V*&zK1ya><<6RQ^RA6AuqToDu%U3OL-49-#7nIKXKBhsCSoMYe8_ zPGI-g3fBKUzEHBLFOl9}EX*Z?cm2iR;U!j-v&r>X;}`b(@yN?bs+n)F%2ZG}9@09A z4Xs=~;9y0_pnJ)>GT^`BZMn7f%KLZg7dE0DFUh@Usf?i-#j6w(qJ(Ft66-D4G>!&_ z3gUlZI&q_+m4#o37!mdZb!kl183KzcxfFJ_{8Oq}<>Yxw^d2Z9#MD|LhO1pE(yJ9N zIU~{Os_qMb1l(wAJ@#ijHn0i1$JC146Eufh9+en-Z@$)Vf(X{fX9FONfl2`RI=6Xm zZJ+tV=I`7VeWt~?(1$?k!7q@>8SDX@?GF+VaIzo7;4sL4P<yVorWvSP^h1O1O7@A^ zPU73V|BV{;u62$Ghvlkr^ne18?*$EPw**;iftlM-4oxDPrOBoNZSIHtYRm`7-Dzay zA1zqUHwkZD?1ZDZ3SH?(6&IU^le&?)EVSgaVg7mg5<*=UeWXdfjj5)OLsT=Ja6sxl z3qETJIFVsc7Rf#MaJCNm3+_J%k#BI`JQ@J?83?;Vt!VPP0EpPkh2(7W8vm4=!6^<o zKR;g5TAT49|6hfzeyA^<$5>wxYb`IN<9<NI9(;2#|3iofH9!28H&cMu1HymbO--K) zM6)EJuBiC0@CkLi3J2i)5WGhZg|jUWy#)x=c~$4n3FVV!%W@MCLpvkGk0C%D(YxtB z33o9tZ;@}h59=2KusJHG<LDO&$SpkD+il0`9VR)^RRZ$0Jmg!MOdr8v_u!Ck$eeWD zDU)*{!u{NBLZvI=0@*PD`gK=QwD%u@_t0OZ+j804axaKGyO#yxIEN3nB3O7=$xz|8 zg#Dwl=VYGTyZ$*K^qZXcfU~ZF;=Y^u`EBukp<e-6mshtk_kZl@QHc!8tPBCGYjyGT z9I1T;MRdE%D+vVd<?{Kx2<C(ZvOzrH+Jx2Z)C2Ue<VGUXwjLgRqE>aTeYRO!d}Oo( zr~D*y6Na18`|-p&D@1^s`BV3`RbGOC-khiv`L3}DKZ*Guu@gM~O)2o}-!DotFHR#y zrK5^ETW=bH8M|3STN~4jkQlXNx=!Tkd^a&9mQhuC;XOBOoEXdr8uIN_G70dzt%>9h z;64|fub(tTE^N#UczHNF!kk6|LUMAC-!qGt9kZVcd-YF}_#*!%BJOykG7Le~3kxpx zyDa!-A)=n1Cq+2)+CEZaFd}l5KYyV?sf8R!KqE*Axo_^T@4qC|Kk0u6TD`Zm`{1hJ zbqfYG#=h^UOw8TJDG(g+4L7Essku7;LQFQ*{nd1-@P<+31YH9)aD<K<Nl?W@^NBsR zQnw{IXK8T6>woI0{Q%#{$8NqW9Wmz}jc*rs#aR?GCs4}uDNSgCf6Ui#3odL$Q#mfM zpNEilVj^5gK3k%_>B0$`dwbv|4a9jhK2v4w)gRT-Dh<1H_E#mcYt;Ly67#wCPnu4? z<7=;1n(MbWQO-N1y(X#PKGksYyXKS8#F!do%eV6tl#eGa&D$FCcUL`h;{T<p)Wno1 zb*tZ;|785~`QX!M`WbWjcdQrI_$m6yH9b#dH{J<8%UQ2}>?wKrgje5)PMz13QceNt zsA5H%ftsWBPPelSG<1H>@M3|`qElE`?3B3jRutuA>dLk2YlqrOJi`cH-nXkphxDJ` zC>+~$TRD&z_LX|JrafnUq4(OV_4|C`<GvXldWR!h9QDVupB(p{`n|Z7;zLo^O1ohg zwCQs!O8))glI=so>ub>)r#ynZ%qxYQ&4tIFO*-2T&A+es^j(Bf(=TikTAict@9tZv nXJ)B$#&Na{Ye!6!env)yRCc}ziVi-tDG_xhIVuYR0Zji7JS4e1 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.png b/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..36db120027dce0d9b3919c7b68605e8a3ae4c91d GIT binary patch literal 6986 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%0DF;G%|){;Net#JDv7C+8D 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 W&)LgP+G6ZK7@(@CsZb?v74bjLre1>p literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.xcf b/pd/portmidi/pm_java/pmdefaults/pmdefaults-icon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..7b2acec319eb1c4012bef6c4c0c370960ae92585 GIT binary patch literal 19957 zcmeHvd3YShb!Yd?;35DL;vtFx2*RW&il!)mHz^*#96db;?rYAT0YE|&9ZIB0$}8E5 zDf{y+TXyWkjyLfYOLpw|h_$w}yHOk^mTkq3tw@$EQ6vFUBmfe}+&w)<&(!{2&wx0! zU%oHv|8}UJ>8^V9>eZ`P)$jLSLB~%#e7fPWqYpMbc;e&`htHG6i|%j3#q;=Dg{$23 zIgX<XpVhbwxT<m8Uc4u|HK4x>zct6fcKeBk2aXSIKYr%KF%)sA=gaRod+za*Lk%Y$ zIX86X?9kD3Cr&+bcI&cx9z1^Z)X7t48t&14wx2mZIMC2|U!(R};$}y&YAc!!F41(R zzTus3sOe*8PY)bD@yPLp9W#BQ@bRSzi)Gs%edNSB2!HgUA(HyBQx86PcIezK0jc%k zqC(01rlgPJhyN>%(|?!amYw0a%D;xH|7oTMzYpRf{gQ6!;!1Im;u)^;;yqPV6z}oF zEt_*+Ip@A=&OJ>W@uANOT*QkenP$8U*G%2aM3<n9CU+%%3zK_p=&^I#PYygj1i1^s zCGVlKhK(DchX+qRg1hd4N6yYXZ9jYB{X-2q_RmaRfkrDW=;ri^$A(UlS|5US(5yVJ zDR}@711C=moGm_|9C+mTqp+)njYo;~;K13T?Z-}>DcDlO$#Z8=xRf#N+}F5g|9;HX zuD!eWHSWdDfxV6U_V2!BBV-ZpdGzeL6AwP#aB}FubHx1AW7{7-b!@2N*yE23JbdD4 zu}HIm8F6X!#gD$Lcr!C?(4zi5xV}2ST>n9oJxyijOP&;PNw{QO+<Co4z$M|5aS_Qb zTr`XH>A<xX7tMHO$Eh>tT2CB1v1tdM{-}nr4*ZYeTFNlUkjOB$;rAU3gI`fJj2Ve% zOrl|<@eJm+q3hJ6j~p91*3jD1U^;d3*u69L1(Vr1XK|8Q{ohRHkyDtW|5q0CpW1%@ zYZg=T5vYwmGcyZ|DZwVNj4X&g#qyHB#}e<Sg7YOW%wD{X%iYt~!FQ;wO>1Epxm69E zp3642J8q}n?QPCGVJm8R@O}=Ihw{w8)cg-tWBbllPUK9e%O7Jr%U#ja?S9-UN-f8I zltpzYNIk;X)TQAFit{g0o9&D}MueYbI+j03cb~ysx{2c+Vy~cw?CAnQX5R#3N3fq{ z8yR~7bm`AAmSZ2HyH|0;nsJv~S9+_7j*EYsvG;P^%E3>6=J*{bzqt03O=YJ()5WiO zA7g*lSHpqB@7OP}8|K+>i2=9f6V^HHQy*jOG}j-4Jh|j4u+M&qz409y+sD7n^z7=> z#NcU`t>(OpeMV#ODHhj3OQ#DmPj4G%%;d<kk^gr3_lyNN?we@M|K@+HkM8;gW54|H zM&i)MSPS<RcIBkT;p>c5aqlAzS6=+(TY1J_;$LN<J2<ZDG8@%%&oK5COee=R7PK%1 z2K8a~IqnMk`YZ!}91KcWD*wYZwTyiUV@iI2u|3qfS)0s4<2TW`?m70_X2ycEjW;st z{YNKHKG<2uaR(SXL+yJR>!J2{&S`&*+Mi+ULyT>hZNE=z{}_bK?qux!)L3Gyl^Rzq zYz%@p8|G#k-#6R1D#LzEjlaZL12rzE#`n)oew{81ZBBi4PU~gag6d1T@V8mMlj9Dj z*bCgP##<Qs^P=U{anDg>X-;GAIeIvQT`zp+b;e%#O^$``;W$iG33`rIC`^4L+J<>v z$2~%A>$nq)9p*4~tb)6j+m+4k#%`w6{#_P^`IF7)NPU?77HSwh2lGrcdD#^mw|0U( z$8mdeF}wuHz_CagD!J^6J$qN;{g~TPjqa5@4(-A2ynQ9HSh<(hQSPpFP(|+k<=lDh zU%B)A>06hT%bn~eLRyd|oV=g3Rak8XF4@l5?m|bHjShO?xk)S%?$C#x8m!U^G^76p zY&>-B!x}Z&Fk@FAJAV_S97A(5NfyN#zFW}<wCBHuJn?VOKEIEi&(A)er)Mm{nfCvL z=kU*GpV>nk_a1cca*-g(*yt#`z}U`$Mvq)#O!>%`Y^<grKi&rW@m_dWE%=Zg?&t8q z^xS%nJ&Aj|=si|SPJ{Le)8UCee@q{z(8JQNGVHxGpGvGI?eiqQ=|Wv4Mql|k+|%dD z!c~d=xw0SEX<SssorezoD;HQa7ccy9;Ct(hU)}MrW$3|yM^BzR`^SIhlS4^P-%{^< zawO@Uza78t^v=I+=AC~_=9#zp|9|UOzaNUD&&=$?x~e}92mD8c;+gX5Z^0oaWzW9x z>Fq!Nt-prLZPi==$AJ}a-&1_YM?THXzUo(UxdYmJU;X<H@bvRv$2wN9Db9JbujJD2 z!8WMo=;b+i4?vx~D$gz-E$q)cSA3n{#>KGbKEZLzn|_9uG0#<TawB6O!7%6*s^ccH zg}j&B_S6<m_}Itb6zuuX$J=?V@vPQN$7RZ1XN+Fj>6(G3|KfBVsuB-8!Pwt+&TvR- zZ}Fe7|MeXb<%6HVxAH@55*h=%Q66IK&(JE@8$nGrb%LvdN0XV6Gp4=5xtH*s`ob5o z7-#$^pA0c3+-m>g9>)HW<Mw6QuRB`)nK3*6@V6Ly@#Dnc)*GDK`#J7!8T&RzdV*I{ z?0#$$WB<-^KV{L|;Ej#3pL5)98abMmu<Lk#bJP|n3Zv-bxE97faI0<dUdDdKm895n z<+}38XCU;gwllA99jCs;vKU_YNq8b0XVa8j>^tpb?C-gCtc=CR<}`f_>l3X~#a7J= zS|z{0*ax{)jJ^DX?up0;PHz0qHq~+ReMy#oH^<$8)1~L4!oH=OjziYDy*}H~(feU2 z{cDiu=F=?iz&7zX``t`qjOGl9{31($Aco05#Bml)iGvth?)eI8S95`7zWdpi89T;t zI~aQuAgJ)dRzJm_2SLP|kF3PL7|)~Yx;OHe>P&9>g+V<eRabu_h3DK`ZV+axr}9ns z<r^wERkv#yy^ro$OW*4@lY3gR<KVlnwddB}jd%6GaOVvjvlsUQmwR|Q_Br*o^G0g2 zssR?CW1m2g{4o}RS!zCXC6_z1k;=Zt7<mFTn7cTcUc5!muaZmRZFt}VU;5$)o54uk z@YG@ajNSJX)T@!r__*AP;8TBg?mh^te!lV_VA}cb(f!xhRnRAX!TzC0PabXdX>QL= z{7!vC&)xfRrhdX~|0m7Xe++BTaU++=R5k81?(6I97rVE9nK3uV{SA8@jFXTRNVL#k zVzxoSU*#&`D1&P9a~JS-t~TnpJA2?h0k#$zL>4vxV1VQN;^TXHG8p#{t}&LGOMm&6 zL^BR?ZqskDjwi1@j5q(EV|_ent7q&f>L7z5L`D}hz~mnK^sAWM^e4G>dG=ihH;f^C zisOEyExYCFYy-{r<aAFF6nN#nQ8vYG)x2>XoYQAH4r=%SSM?ojJr`z5^EbH-aPiS% z`X8Wj{biPW_NiCXadwU4?CAEz(M0Mp`*qQa<O)t^`>$B$nGgRD#{QJ!?t7E5{PXv_ zaw9N~_rXiL)chfW01vU>V?4=%Yq|OvvQKsLPYGgW;VG@fZ|?3IP$*T6ck`TXS1Fai zZ^DkJxtG|2mo+|ss`DJ)5*)W57fen2Jc)0*=u>GLIQl2Y&k&lX$3L1M#fl&Fv6Op& z*_`>T)&#-Rlf_Gq*x?f#*Lt%^Q7m8mmmJsd0M-k9^d@Z4c;l5`5mIdqn<&~u3vWpX zbR$?Sf@rhoECy4~d_<@ha&0z&7gSJzCNGG*n6?UnRTQnIRutG4lBj}c6%AtEDwc|B zn^{~~ud&eEmWer=b739Y+NiA!ymRd>!iM?1XHjhvbs}#o6IF}NzOXr1*MO~cVfm~` zC1O@En-<BG6GUOTkh7Q<_DB`g0*1L{&2rQ<%omXw)Ch~UQs_aoh>nHA6>4}f-@0^- zY7<)Cp~fz}12@$wF48UavqH#O7isO5XiKUEP3(*2xX8<~WW{m;!(226)MUqET`d># zR$&Ppf{E4k4(xTd1$I#!fz7&PuV5v@s25mru?_6~9cpaWcd8L>=67ggahMj?q%m%b zAc&Q)>V?)dQ&$12wAz;xo{TRiEZJX`kg=GJ#zj3A7MM_OQO!-wMl5nk_DhoA@AC%& zlArf0lHcp``23Pb@6mg6zCNj5O8BIpB>DXQ04R0-w9o6sgRj)5di?#UkIt<JCxbul z^OyS7{$9`G)_SSJulBjTi`q%lP9m-WUk_>{^SEj~^HLewdR+^-*7((+M3OEkNr|7A zc<%-&HlN{gN$r<NjK$@_rOK-%-k+0viyKr+djAsKd4E2zn0Pt3ELE;?_xKk#sFt#r zj3p{oNO_;MsNWS5?^{%;bxL!wV5lpkTwn<epg6e1IH55AQsp&LehDU^4lJd{<x&oI zv`9pZX30__UL-e3vXn}w+`FWza)EakQ2!F5^O#V*q=VV0o*>na&$FCB(C_nL1;8YI zyf1^_0O@vQK2gArW#TWaEzkxvMhjL_1v=sbi?!#&LadPTeo42KYSF3AuMg-YeSq^} z1<UFmCX%vF=Hq!;;gzYREXN|@cp?#tL~w;d;R(53p13%bh{qL0j>|H>WjrMCU7AoM zu@vf~^Xe0_LCz=S5;?2n<us}z^QvVzsY{m2ypqf07PU=M+hn37p#s6k8x}N8YN94f z!8wshqH%0K=M{1;8DGS6R-Skylvv!VTF%B}k?7)z<+7TLEm4jJN+uOv+@MggL<?|= z#YwUS0xu`UFEJ2elucz8H=qhNqb{xhr&ONwxu^#<p2#j)9@8dg0ev+j%E>gTOI0M5 zr7E)Vh`jV5;?d|5qsAcOv3IJ7#NL5b;vFj@OSFK-<B=sMo64h0mnUFei-x^I&Zl69 z;kkw;V=7a8DueY9r&W`Y<B?<xZAa!(#iv3F(h4c)Ku%>+@o*?SwTLDZR#cW(hz2GF zK2b8O#9Tf)tfF{XJf);EnQWRw49%@ZDVp<9Lp&veL{(|-uFR!SQYkf)QsUt-I#J|k zT*)NQm%bn<cCoY7A(+iJ-gdLiX0|um>}ID`6a>8en@mUc>@y4Ng<*%q-sZ5{L`SQ` zZV{{|li4i7gM#y6Y&O~9CxGat)8;VW-Q0A@)FK!Kv$e%)w3uw7O=nAiox^Tz0#SZ9 zVA9lfJhoabHir{!P0dDl-VWZO6IH8ln1~L7=-QpuPK(9qFtzqLT5L^LlSQ!E91gqP zDO#yJL?!^QHXPVV!TMxr$ri!Z+HA1^LGZSW*kXlSvtCHskf<#yK}J2RyT99J=FN%) z4wKDdZbq%rs^>~e^*SE)vD=(h$YL^E?4pGvO|}7ml^Qs3FXi%t_2SE&mP1yHNw8Zj zBtgc3^phU-<Bf;vHzN$el^cK?H;N|c(_SRXi4~xTuI}=*I4uW7yNJw+0nB8<X@?)} zEU?O1DX0<cY!h0oCZkC_(s2O6TTtz3Z*Q^LXQ;%jpo(>ioknBJ0i)Q`ZlidFytcKo zRlG%He}Guojcpe5;R6Q+v)J0ThFBRoI&2m=f|~3(he%YG_U<l6lhf8JIK<{wlq5S^ zP0fd`Gek}zGC6H+VyoG1vpMlaM6E4G;ouCBNJJ5%T{MdTN0wHrQ#7qWhe=1P1qLuP zKnGDZnt=dCtHshPI?QHDwj?`S?1E)RDveikt<eJa82lVoyU|V^b^+OlGemYxsxp|E zAlOWz)oM4l(g4faV45>jlMY)M3OT3Qj6#!W7VI`FQLT51&9<2-RBh%p;2&!>nFv^d z%4TaMs{Kw!lQ<)m>M(5~Dw`nKML-;r#cEwmR8BiAeMY6K)3g^<qb92jGi$dP;h2-z z^jHoxTV`el;AKCE;)k1Uq6umTF99@(DznkrEQrO4rgcD6_nB-qtP+#OW~wKuJx-Ic z$%3V%&7q1l0jk8Eq<GP0H?_3jQN;>{o%43JNF{12Oe_PswOg$n&9)A(iW^#>Kdb4M z@YZJ1YJzXELxWZzYsy~5cePoKR!oG}W4)jnZ3a-ut#+%;>ae!7R1#4OHUtOI{S1*= zs0LB81#92xu(gVyiLJLDwg@eD`;1DnR-3SzsL+t4vQai#g$As=H3j8?7p>oHo7F)! zpL9UY=GIm_g`?9g4yzgV!HZcN83D*zZH}EFQ!s&6!3I6>Ty%}oDVm86aM5BTDooxH zqB2=T5gW-aqT1O3W*QZ?JdMgKT4-%32VgO+c6&Kd*)d{^8Kz4cBLPR%Y9?h*Y{PcZ z+G>IvosJF|a)E{?jJ{sL1}jbYdp+&#y&gAUQ7{l3^7aq-j{1OtQc_@WpvTb(&o2__ z=;-e54F>z+sCz)5^W`Nk@8x}pKhQrAbo+y#8tZel?(BB;diy;dzsq|x;131|3yvi4 zNgzJ}nw&s;%e5nJ;4OeKm&@(-_4i9Yug^#Bq|4Xulh#YaPR?N9Hnj&j+Fbsw&fZRs z-#rL_(+`J~u-iZoL^nLT60Dz1#shVRl2Tq*+SuhC0w0N&QsCwH^$&n5-;MrqIttwK zyn%~U9R>}Y)d0Yt2Vd)@oVyH)8rA8+tVD-R62H1yji{ffXlOYfkL^>T8dOsTI9}`b zdyWkfundwkId=)l)At^{`+gn8)nYon(d!BLy%4!T(6=0oZ?1O-yIr1czsp(ZX<4_| z<95O0<%8&^msZg=eZQvzSad-0Svz-umw`Lf=k>WgMNY%LNO$twG1ow!|5RY$XwYMC z;z|tMogGjOTz9RzVOKMV4Bif@&mRnU`+eSCPd)MK@VF%?yg=k`r4e;vupakuX~5U- z@9@(0-{p1>1_Lvkx`@cx*X`*U^!eS=pfBjH)akf37upnw)Ls`&>~+BtaQT26JVDQZ z)V&@@`<yN})L3Ap_PU8Gva2_UsRUWj)9>lI4Ml1v05jl7k*?22FPDkhZfM^d0CM*R zTprqu`+5R%$UMGfD2p!Z^97-3Pr&C3xP2&*%X@kV%NMzMU8{&p=l8%WFzc`*PZyCj zbi+z~MY2g>_eK<Qekhuv1^DMaKvakO2Bm(FMpZ9Obz|Rw93ITAFMwI{_E4Hh?soM< zVKc1yd(9k@XdP}pI`eyc0Z$h#Q`z6=38Ga&F5VNOt%tLB`5}G3w_oaM$8%;yo9k#0 z0I8^qDWAtl^L?-jwj@ce;9$qycuXAdLNm}0F@x!Nx-m)dySu%R+b{VB-K4HW7to^Q z3l!y218y&<61QX71$^FPy*@99;uS8BKM(|EL9Q&;v(~uM=Yq1l!9LevB0Ge^N?2br zWC5?21~pnLx!vf)<#!`xqVu?eJ`883%WOb$)qqOYdtK0Bz~k%0Q|xY650;K6SYTE! zsli@~Qp>!%&lm8y`n&0+6SKJjfuP%^QPEP(277xOF@Ui?*swd`>8#T8rQIIdJ0KR; zDnV(!S98z8-7ZOTyWG88315emL0ejuXrv85y?yl7R@;GodGEBl84nNiQBVjoPv1o2 z>+3=BxYZqSOCIm-@SVCq0uImtk)Wr*m<tNzxjj9;9&fPM-PPgm1q=?*?y^b3?ke+1 zJqu;R;i+jQGCn<-O2@MaIMF;@-9%*cjSFMsDPJF(jwG{kEE-8hrbF>0dCK{e%B%3+ z!{InQ;(B>_`sY9S!QWh-91AJQEK8-CDkmo6DuY{3@I?lsTrUs*Tl;-GgddNFA}KkY z%fb;)CT>pUnGy|!ftF)(6htF0ZmV2%@2B6KeEa(3*yXX%gq)5=L#i4Lg`!C%87Jp` z_;;ImZjI?<-}>ff&m0?k=)Ld%&g*YajwZnej(Jjv$qM!M^6n~Kd2QXgx_h_OuC0C7 zmi?`N^4)7wKut*uAszwz2GN@x>yhb)kGf{vn#$_3lA6u?9Phs{5tCCOO2iW+_sFns z$C?toq3T_`4jFfDUsuAdTDNNJ2ZkfDObQ~!2nvl{JhpdjMb(;ng{Qvx$*23ex75|w zaJQMhJPJgV$`ol{Khe0dvd;a#FT8R2!Yh~Fdgbha+VYaRw%^5pn$ks@*B-n7wyNzv zdSeVg8<BzN#Mkz%E2-Z0gQ-N4LJC@6Z+>Ra%9<U|Ut!TWn~uoY)Z0J4x2AH_M@J^Y z)6rOg=F->qtz5b9r<Yk$Nlf1ihm-jm4{xlfJNAdMo72%EpONqHu36dm{Tqy_k#r(8 zolvg+R;*dw{@c+hB~g^;`tuL0yshzXuV+{)8%@PSk#O|-d)6#Bzc?Px#|nHB6R-5H zyKUFEuEQdL>84}hv3PX+6Ll+_|9Ltcn~rIqb0l;*P+QaZ`O6s?S1Of=-b_s2c%pul z`QM@}I$5NNzJ08=YTLOBppnx`Iyx=iygpRBw*9pbi-w9ciLsM)6`Oo-rGeR!iF7Qc z+<dcV-JL_1!kI*vXg0`K#vZRNt#e+<VC-@t4X`%;g0QCHlh@@$GE5j4B;!xj=~o}Q zoQAC=lyowkz4paDYqvfZ%EVKM+Gr?NnS7>!t8V;#Dw&pJz^HsSdg1uy_4{50=ucuU zh-f4m{pnr$lC8f^rPB$>lgy@GwbX90T}#GbiA9=(^0RFQ-Ch42Nh`5LCZ0}4U)r{& z@#Mu+4p_24!zZu)az_Q%@cn7%CZR-9%IIHgTqAsYGLr$*BA=A<>H{lvb)O$krjrOC z#S?EI-%#82N(kzT7x|2&lb5V_8tR_7A*YmBG#k3{diT5TdGGZILLL;3(qv92uk>uJ zSpV=1IgQ1oMBe_Eb<@rtMU$|ku%<$cD=l9c*j80PG#1aKV)5zpm6QA4ZM~34%b8?2 zQk;r(>hi;lHS2>Tv1}?94X0ms+}HT%#aK#7C!#acp2`ltZ|9o&zSpNS>DXjq`d<!h zY5M-vjEXfeLo=+T-hQgFu0j0QYp}7z^!3L!H$3#_jaW9HPlZD<Od74!RQlQ%cdV;F z{FArhsaRy<%F)f6KX)S(OXu?$ibiNe<7)QmvpZI<+5f`}Sl+RlKlkrG_|sS-Nn2W4 zMX;g3Dw`U9Zs+n9d%kr+mb1ywSI&5)*TYE!W@Kn-hA5eM>mT=2R_*!H<uuZ`(W&A8 zxb$`;632cPE^KKKYC)<)3-0TLWfs+FT9g&gDtSR?(V2ORLEx=RHRh2~pn8RpX%2^T zQ3^@pqQXnpa)NNyt*tH2mbQ+CnGIysL}Uha7G97YEv;>Khjm*ew~&hRECr&pXl=2( z4#EXnAQsYk@Y!{im|$(~u(xaeXKBeoM(B=+(tsI`t|o9%;jk_w;)N1R7RbSb`m8~( zH!LPlEdUd|MMb0pn{v9;P*GwaK8ZF!v_b;ZY%y4PQFXL5;~kvR@dksQCz6|ptvCor znN5~vz(d4L+S;7k&{xL5mFaaLi8>v2rxQr~uqZZL4g&#Y9Clm#5zz2DRbQe9&4>fR z6o+VbSVaU)j0cV8CTpA1juUWtL#Y8NWzeX0AZOk-Y8HfctG(GMHXXK!O`;uMp`ild z60Q_P({{o;X1ieRv^(2d?AGm?m#@o~==J2LZxF(i`4Vl-mQI_qPv|;W1y?$+M@o5v z5JO|A)NaD*_tFylb%Ub2d&eCdUv?0jQvgZ?x8czvumWJs>kRA7EzY)Po73qBf#MJ; zBxIzs9n<BtJB^N(7AOxYguV1pDpNre2=NG!q6(AcqKP0m>aB$J%w~tJ4K&GCo7LtJ zIxU1PCrw>QC_*Th9EB+;EI`T10#S#xoiJmrTL5&9pb`-XG8>Dz$w8U38(Mc_ON(O# z$C=v!L@8H{?vSshNST&+opeHKpl!RO181xtKSZ?K^c4OAiJ6u{$bn>?h&Y0yV-LqQ zBY#cCLh&yItw43yL|HuW;e}~yGg70@rh@>d#%5r3{L<>mB1)wpP*{{^`zb+0mL0;D zW96wPBjs~dMC$~dkRm*4w~K;aD7B=`fYe8*Hj7$fmet@YFIEa^M8%FcnoviEig|}D zm?B=RM!FSAzzs;{llC-uv4mHMSi+RG206_o%JE$zs-~7^V$w>Mp~VM@Nx4vh(4LVL z5G&L;Xb#Y-Trf~}(sUSABdyed*aiDW6jC%HIAO*=*h#b9D42u?Zqc-vTkRbVgqbWx z8zPa2^qGt{qXQ8T8o`Luf`Ca!duN-)(qf^AmrZcMG!VnI?R9iI+knf@3mfKVC3(Nz zmzM%MWJUM@A4KY8LE4g%fVu!K{N}WL&4OGE5<aL_0F8Y}fKrNaL9z_+3!ZC`56Y6q z)9dr}cJ&a|{In1Gzi`R}QV?8vx?AsE#(`#0DwFr?B*ok3?g&^)w6(Y(b4j_-I6URf zUhS`mN=p}ZL_Rj4v)k3@6S4nb2jZxsYx8nYpg{`G<?40fR2QP8_<I2!MDqrYY@`(6 z15toK52y^-Ja|2^8ig-UKo2~C3bbzoE1X=Zz67h9002CFig5J%{Qbas2zo>Vp6;F4 zsLH?vaaAxGgOpw`l+imd5FG3a1f_txv)4$Q8D!>iybe%e971~i-ob$6?(ZM;_Yb(d z-Y#G|J@%IkG%LPopf69*74Y~6{q6x@YkMo<-#m`$aQQNH!w04b1oeCRq;9vjr?czO zYAs01>#;v``jYYz5RG8+0)c+FyT7wD;ON-596cbOQ4a4L%0mD{W0VL2ngx1IrCfD6 zZHLrHw)EZmH<a;Z`CT9Z0p{56#fdTsX+(KL`La#+o<2`|Z?~g^2m+)ysT0S@NXpc* zhW$>&k9znXrOypL_W7(B^d!3R`doe3Qn_VqEo}f#h+*(<g)mgGzqbXPCO{1<3bvVW zqDP=!$+(adOrZ-P(ss~5!=MTFczSRW$lZ&05x|!ZloSZa27E`m&>5D5H-^wu&mB1V z16^xTpahu^nQL&s1DXk>HT``7#F#j4eNP`!{HXLxC76H)i4XG9)Ib2yr6XKfA3{=? zNy3bh9(E9*#Wn(n44Hg`QkT24-5cl!+U$p9nhio)qDgD;kd{zf!Wx5;$gm2h4yd(+ zJ}HN<LG%EEP(HVtQlVMxZ~_e*_5)xGq8vyKQW{DGAB>dprK<lST97$(Nd<JN2x-8& z%d|%|fKXb!l!6p!M?@-CJJgBb8wrtw;!unb5vV4iK~QN*Kp_OhqaVi)JV$#`9m5LO z<b_BWLm5s{XwV-B{;1RdoynNpLLIRNf1N)Gnb9xBV(O(U7*jCd?niJdfOX*uc!LOr zK;;29rb8OSjEq18*ld^AJqW>JECH+n^x|>%dj<yvL0d2Bf_&imQAD{A+i`&vVi`2F zLI1!&`#?Ve2-qv74fB&xyrQ9JfGK#AS~dyEE%M99=VhE^IR!XX$dBn1Rfa>mVSaXu zQfJhjGH4oUWcs=WMdxIiWn`>kv2Z99OJ!Il6Q8^>{2S2BODBUS&O?}~P&C8x@wZ?7 z*RP+pEn*an7Sd#iL~8uX_d5>US6>5~c}YD5u>-^fVi_eXUwOIj(6*Y2a(*GB6uf#R zgREZi#&hl4SCw+5Wd_iU&K*3&P~u9K<!-*vv$+ymK+aIUh>r@tKb}w~U-oUO((B8r z;0l7KphVJ3JdRXe3ObHNuKxH4g~2kFIFhO(qTw6x<U?_m4ae{oFq!aFI2L~EzaOSR zT&4mmxj-}lqKKT6W3d!VsR&O*r$)Ya1a26PawEi822Sc_<ok8<7*nG+qDT@0M5HrU zpEqwnRH1U^n&p)w_T_L&25!Q?>F`8c8N2-Un=d{8j1hqZuC%(Qs){564W>a&CUOAq ziR-`qvS;7@8*6LIkv+q-Uyi0iQwYCAFI~9y@4tO^V9&<eYid^3tyxoh=h}6(>+Ymp zE=GZt!r?c660`-{x7My*w|4#A+x9fs2cG`spFMH@{CA1wLO2}_N5((t*>%shZJXY; zY1?jNXW--)esOUOf+Zr9Eg!iMLK0PZ`v-ls73+2%{m@@N_p9Gu9KL!Z0_=p~3DY7F z7p4frPY%0ktLl3GV=@E)hDb;zms4TYi8!UWBNrwR`B3uLf4aAR-!s>hls<*nQ6ia2 zV`?JPlUi33$&AY6)bBg?+I}`1Po^`eL?kpF3d5r1$vB0dM!+VcW;61eX9e+l<9U_^ zO?YB#Y<wyTMu`Y$!WSnJiV{^~*IxFvJaJV?CHZ7rNrXca6CtcEEFx0j1dd`v!vL?p zI)3_cI1&ygQt7;!P9esVO6N%A$zjk;P2T`wOuX{zF~r3}GM%GO<`Kt20y;-0F-C@` z5^_8=H5EeVVLHl@$>35|C5op+EU(dok|~6vFc3r*u!?~z<56e~0W-9iro#u>D`5zx zlTn-|l|*Sch?SM#oP$c*QHIHE&<NmFMdT~YhbcvkMMgk1NlEVH#SoCc7E$3-lL?G3 zIyDuQ5p;{EG?SYK(c~K-ibF`+Cge~k9w!<ehZOYKR`Oax{WT)dB!(17q!R~>n3fNs zS792{)E~%pFfVk@gVX`(5fqVA`Aj&JN=2sWl)}ick_}DZ{5vxKH*lhXsp(`smxc~P zNSaTCNS=|)GQtv**Amg#1g1mDut*}u$ZV3+$?&x+M04dorc%)xmtJ}GcmML+5USFN zNR+YZo2i5xy*&E*Yx4QhCuJnTtnJtwChioRHYf6;fOnnnR>>{bfUTBA%GhmA?awgA zs>K!nYQPpz?4aB`k-_^GDA$x}akRHnym(9x&|?*i@cUb>aQ#7}QGqY=;XCLrCdrda zIxSkd3U~w=b3qTBodqnigUEpFAUqm}2`)2rVYpRGEc9GbXMjIpGdA0SWS0SwXksGn zt>a5k;lODC!J;qJh=mq<s<0c8p3{LII2v7MAsAK1D9uz_jxS5I%?xQ$Bs0Mz-j*lm zQe-dd^kqC(W<p*SM2P~C4M>8}5;CSF9MC5Q2kA5GfGV8Y(9jR?RpAr@;34G;qv*_l z1Oj&i2oFH7RM11945c|K>lnkHg=7|2XK^+Ob{x^wYAEGj%B9;Z2LZ_D7Un4@s@&e{ zG&;>T)7%=0xO1DG?M^36!tz-@+Ia%m+SV>u9Y-w976HdC3rSXtp#fu%t?kXd4r7ZA zqn%qve_kOQtt}>-T|6SruhUW>yKHu&)oH@~&ud3@$+ad#3#?{wzVzE6ecpt;s|pZ3 zPe{seDxLObC=KX!jv8_{k}+v-Ljyzz#JOGNL<`l`w}{3g(EGePwWX61RElV6K4P{5 z<j)ye&O#BBxWh~_2SU>LS3av1warR@R}tTev9&ehC<^^65p{DYtRi9fNXfpgHsOIL zEDH=4M7p^|S-|p@h*0pRG|pmBxS(W~L)vZ@?|=|`{1Mh20QFchb0o+*ZPsmY=@Z-A zaqIxV63b<7>yX_cV4WJa2raGM-AKZlVV5}CJ*R`Hv8k=~Ky!!Xu-y)2WBJUjuNT5N zf6(bba0XT>AOc6xfwEcohL4y`h?SYGj>ASoKP&{YjX1S}Sc}tK$m9e5Hi3!IB_O!a z>}bYO9?|SHwTl*0i_JQ73Srpj>}qKN(8eMbot;Lp!)k^=I9cE@BIZB`2hNv%Rp6yj zmxq!Icl9E@3Hao7_w@G_yvl&IQM&5x?dc}?dAo~pf5D)~)f<Fc4zClwt{;AE#?{@| z1#NTVRY<XVaac0w0|j}><oA-lS}$cEsM43CmrSY8jkF-ZhGf9`N%-yH5<p%mg0-k4 zgj()(BRNe7rW62JMKzjdPyxt^Y}_&=agS=QIg#L?G5lYW16}BNWN>i+r7VEVA_+%d z8g$5#pAHurD3H(^{_=&V942|v{XjI7*V6k`VzXW%cpKHb-IUA&?_xEw^)%Kjr^Chr zw71Fy5T%2F1|<2x0iHU%@u(g-T}a8@<A+~OutXtnjQ=FR-meSPOJSTu(g70cyW!7k zn1O-~03nbR<j7Z&GGZKdK`7)tWaFg)sanDT(qbZ(fGAd1iQkPhE}&x7Y+VkUELP>Z zZcq21uOH&isf+1#CEUB)kw5ejpqs-nX23Ss-skOd2YPXGcTP>7(uv8wVEa*D&#|Na zxmB151J~^dbR+)Y9h_T(ZMT%S`K4a(pr7E!92rs=cF9(Vt&?(t^Lx4<J;}>D-B60A zt~sruU8T^4r_T+eK*D$~!)WIgyj9vg?twwX1AKF<a@}?keq)b67#Q&M&8tINlKyx{ z>4LI@K49rNy{X+jw0k9by#s?j0Oi887%)R=+!p2_>hC^?$!YZU_WIj3@Tv0^;oB_H zWUt4EzoV(N1YNCSM;`zvz#c3{C4;z?rN?P;7rE-OlF|}T_qYjJlHJH;8!*~Jk4n&u z6uBOj1F?1WJstv<2>&QVQl!ZS{oQn|X%gnQz10SNAVfex1|lh#RuHB&9FTf2{K~!E zuAV-~0<77Om7pyUJQVticzXKXMytEGD<JiG(3Q?#CZ%sxj}Q2LE`N6~qy>IQ4}^h( z=mi6#5n|n=qk(=L{P%ZBL$r|k0bCKgKy;uV|G8(f{KG?lqu$;@uc!Z5kG}_DB5WYO zp`g1DCpTu2{5Sgo#{xjK9zy%xqdop1HyCNF3-O+U%-G5#c$e2+GB2;*^|342EX(5j zXLuqy9!4fu0k(v@j>D_#<?$?2F8J%#>^wW1f!msnhv3t}Wu%NT5^Xr|tYvb>r$&E; zgkj_H5uE5u#X|9PE}n!tnMCdxKp4r;^>XxU5BD_J8Y;FAPNl;)2%o}XRrD#nl1(CE z2a2hKjhj~^Mzv*dGCe&Rg7=E!)jCB7Z~In0Xt;V+4a`Zu(KDKyz&TNzhlcN}Az689 zBAU?BK_gsQB@Co=WACT}=ppA-a&zI1<M1%N<%9-!N-C<$3|#fr-m!F=GC-jl6F6*2 zj(AE{ArXAm;i}5Aie-kXZJx`?931G-)I^95q#|3C!Wq`W;G+-+ry|R?4E-UdAlJmp zVS)wm@YGaT28O`!F}6HKu10yTV%JA6$q5zs0lff~g+o(ec=ihL4Nlo&KZM+?+J1Qx zt~5C56>{noU<d_SX^JTDx&&ufzVg05zY6zWk#TUhkO7RA@cODc<3l6Up==hAwfa^? z8CSM;|A#Na+fFkK?^XrY?QL5>__~rp-X22U;uKqDSiS3eqYU5(#{=e+pRTLf{&!;$ z#zLt~d`|fX?^?d?*|*e`8kw3(&z46&+EB6euSSrujf{o?C2n;b{luoK9p~T5W)hP( zqM^AJ-`!ES@1fyjEIbt<EHc~T-^F`(`EF#UknhZ}xfQQI*0|Yzkts<;Logw;EiV4> zQ0@I+NhtC0NH#aOV&XNaw$}6N`1EKf3rI8DV(Qv^Hr{^ZXTwN);=BW${)h65XZz#D zG;4192YYIFf9maMJd2PB!Zg}U7f&e{X_CrY){UFQ?~T0m+V6*_BGH(lWYT0+8NkV6 znl+xjdiws=HTO2zJ3Ag4o(e_cK-w9kP!W%qD$q<u<5!=2U~R>^ExS$rr>{g2^FY>{ z&j5wOXl7F9vH0aLHgDOuSLlEC(kOa}Pfvzp3K=<I9a#+W;_1;}A9MJ>@Uz#irEx4E zt3;*|mLOEAAQN3oALrQEORtV!yBdy6MiL15K#~XmBN=+CXn5>uJ_POOvM@a4l+*aX ziU4TC25~~8Xq?Djhod+spUneI;@ChUozCTP$|0IfMii{gLTAZq*RD@Qn2b##sz$Rh z8LMsz$4TT&0-50gP5A1SOIN26Fp?9gEDKG7$>gPr*Kz!0GOQ`+eCgL@{7og!oM{*L Fe*ix}lyLw6 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults-license.txt b/pd/portmidi/pm_java/pmdefaults/pmdefaults-license.txt new file mode 100644 index 000000000..aa7173419 --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/pmdefaults-license.txt @@ -0,0 +1,37 @@ +LICENSE INFORMATION + +PmDefaults is a small program to set default MIDI input and output +devices for other programs using the PortMidi library. + +Latest version available at: http://sourceforge.net/projects/portmedia + +Copyright (c) 1999-2000 Ross Bencina and Phil Burk +Copyright (c) 2001-2009 Roger B. Dannenberg + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files +(the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +The text above constitutes the entire PortMidi license; however, +the PortMusic community also makes the following non-binding requests: + +Any person wishing to distribute modifications to the Software is +requested to send the modifications to the original developer so that +they can be incorporated into the canonical version. It is also +requested that these non-binding requests be included along with the +license above. diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults.icns b/pd/portmidi/pm_java/pmdefaults/pmdefaults.icns new file mode 100644 index 0000000000000000000000000000000000000000..75840850bbe8e8b69f9628f1b09cf219aeaeee1b GIT binary patch literal 36751 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 L;6dR3I|Tk0Jh)GT literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/pmdefaults.ico b/pd/portmidi/pm_java/pmdefaults/pmdefaults.ico new file mode 100644 index 0000000000000000000000000000000000000000..801a7062aa76c5ee8a3bc8090191a8f74c76f835 GIT binary patch literal 99678 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 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/portmusic_logo.png b/pd/portmidi/pm_java/pmdefaults/portmusic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..17a063a6ab93ce6976acf0de8fad8c30f23e7394 GIT binary patch literal 753 zcmV<N0uKF&P)<h;3K|Lk000e1NJLTq003A30018d0{{R3R2KTu00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyFi=cXMa<01 ziHV7^v9XMd(PwMS*x2bA8Z|~pv?nT=b%gO%RaLvY<bja+005Z)00960{{hm`J^%m$ zM@d9MRCwCVmWz_4APhx$CA<Xw|8MsusI89OU9;0uyHtrt<KgBeGGqELHPe^dHh$QC z4mKn`nNNeQb=uok;LK^s`2lv$y7G>zs>>TI)OFA&*bc|zi<H@Dy|Y?S+#4|Wm?Js` z8#inj#aPQ^T(QK%V6Rfhmg0=<*t+zIx7``g`%^HhA)EyasRiBv1|JQ}F2g#RDHs)m zZ_VmdCu<2Cm!}@H-nuGwb}(s}R)lI#MRJ8{$rhE>DEU#Qhkd3v=|kwN$IzhQLP!rW z1R_{tWV$$lc$u3S6s@}HD{$lqCJA}i`Es|0MHTju_%SONuZkzXJWZZzU9>D_@juEQ zQ1hmwi+KvpU8-2S?|;PS!n}e5Wb@yg70m9{CoLtse;}Vcgan-O=fP_sPcTKaK<D+| z*D*p2L;84u`4(@%A#raHaBbSo<k-A)tq#I(7jX6d2Ao+>pc8md0;obEKzPgh)S@SV z!w3SFNx6oX;Oag)f|c9T89V^ST_oa$2Z^CZj0jiLHFEiu5Q|t5WVJtlr{JDXV2@=g z8ZXLY-K_9)lN}seBsc-ExHRexM%KiK2Y2__>r#w0fDK%e?sQO$cm!NG;}wjYaSBTg zS8&DF_h7FU?cgD?MS$r9PMi;4^vPo>D`-hAY~WatJlRl_i!>quBX}4uU?e4K4i%iY zlySNNOLgIm`B-Q2HZVAnSzVGyz|hc6$y@dV^Xp$}s&p9FbM4Y~$sAq}p}pQdd{)H# j|NJNP55T|F{s=Gt?@5G_w9tJQ00000NkvXXu0mjfb!S&6 literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_java/pmdefaults/readme-win32.txt b/pd/portmidi/pm_java/pmdefaults/readme-win32.txt new file mode 100644 index 000000000..4aa1c60d9 --- /dev/null +++ b/pd/portmidi/pm_java/pmdefaults/readme-win32.txt @@ -0,0 +1,11 @@ +README.txt +Roger B. Dannenberg +1 Jan 2009 + +This directory contains files that implement: + +pmdefaults -- a program to set PortMidi default input/output devices + +You can copy and rename this *whole directory* to move the application +to a convenient place. The application to run is pmdefaults.exe. + diff --git a/pd/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h b/pd/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h new file mode 100644 index 000000000..2208be601 --- /dev/null +++ b/pd/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h @@ -0,0 +1,293 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class jportmidi_JPortMidiApi */ + +#ifndef _Included_jportmidi_JPortMidiApi +#define _Included_jportmidi_JPortMidiApi +#ifdef __cplusplus +extern "C" { +#endif +#undef jportmidi_JPortMidiApi_PM_FILT_ACTIVE +#define jportmidi_JPortMidiApi_PM_FILT_ACTIVE 16384L +#undef jportmidi_JPortMidiApi_PM_FILT_SYSEX +#define jportmidi_JPortMidiApi_PM_FILT_SYSEX 1L +#undef jportmidi_JPortMidiApi_PM_FILT_CLOCK +#define jportmidi_JPortMidiApi_PM_FILT_CLOCK 256L +#undef jportmidi_JPortMidiApi_PM_FILT_PLAY +#define jportmidi_JPortMidiApi_PM_FILT_PLAY 7168L +#undef jportmidi_JPortMidiApi_PM_FILT_TICK +#define jportmidi_JPortMidiApi_PM_FILT_TICK 512L +#undef jportmidi_JPortMidiApi_PM_FILT_FD +#define jportmidi_JPortMidiApi_PM_FILT_FD 8192L +#undef jportmidi_JPortMidiApi_PM_FILT_UNDEFINED +#define jportmidi_JPortMidiApi_PM_FILT_UNDEFINED 8192L +#undef jportmidi_JPortMidiApi_PM_FILT_RESET +#define jportmidi_JPortMidiApi_PM_FILT_RESET 32768L +#undef jportmidi_JPortMidiApi_PM_FILT_REALTIME +#define jportmidi_JPortMidiApi_PM_FILT_REALTIME 16641L +#undef jportmidi_JPortMidiApi_PM_FILT_NOTE +#define jportmidi_JPortMidiApi_PM_FILT_NOTE 50331648L +#undef jportmidi_JPortMidiApi_PM_FILT_CHANNEL_AFTERTOUCH +#define jportmidi_JPortMidiApi_PM_FILT_CHANNEL_AFTERTOUCH 536870912L +#undef jportmidi_JPortMidiApi_PM_FILT_POLY_AFTERTOUCH +#define jportmidi_JPortMidiApi_PM_FILT_POLY_AFTERTOUCH 67108864L +#undef jportmidi_JPortMidiApi_PM_FILT_AFTERTOUCH +#define jportmidi_JPortMidiApi_PM_FILT_AFTERTOUCH 603979776L +#undef jportmidi_JPortMidiApi_PM_FILT_PROGRAM +#define jportmidi_JPortMidiApi_PM_FILT_PROGRAM 268435456L +#undef jportmidi_JPortMidiApi_PM_FILT_CONTROL +#define jportmidi_JPortMidiApi_PM_FILT_CONTROL 134217728L +#undef jportmidi_JPortMidiApi_PM_FILT_PITCHBEND +#define jportmidi_JPortMidiApi_PM_FILT_PITCHBEND 1073741824L +#undef jportmidi_JPortMidiApi_PM_FILT_MTC +#define jportmidi_JPortMidiApi_PM_FILT_MTC 2L +#undef jportmidi_JPortMidiApi_PM_FILT_SONG_POSITION +#define jportmidi_JPortMidiApi_PM_FILT_SONG_POSITION 4L +#undef jportmidi_JPortMidiApi_PM_FILT_SONG_SELECT +#define jportmidi_JPortMidiApi_PM_FILT_SONG_SELECT 8L +#undef jportmidi_JPortMidiApi_PM_FILT_TUNE +#define jportmidi_JPortMidiApi_PM_FILT_TUNE 64L +#undef jportmidi_JPortMidiApi_PM_FILT_SYSTEMCOMMON +#define jportmidi_JPortMidiApi_PM_FILT_SYSTEMCOMMON 78L +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Initialize + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Initialize + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Terminate + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Terminate + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_HasHostError + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1HasHostError + (JNIEnv *, jclass, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetErrorText + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetErrorText + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetHostErrorText + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetHostErrorText + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_CountDevices + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1CountDevices + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDefaultInputDeviceID + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultInputDeviceID + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDefaultOutputDeviceID + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultOutputDeviceID + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDeviceInterf + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInterf + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDeviceName + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceName + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDeviceInput + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInput + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_GetDeviceOutput + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceOutput + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_OpenInput + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;ILjava/lang/String;I)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenInput + (JNIEnv *, jclass, jobject, jint, jstring, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_OpenOutput + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;ILjava/lang/String;II)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenOutput + (JNIEnv *, jclass, jobject, jint, jstring, jint, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_SetFilter + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetFilter + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_SetChannelMask + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetChannelMask + (JNIEnv *, jclass, jobject, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Abort + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Abort + (JNIEnv *, jclass, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Close + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Close + (JNIEnv *, jclass, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Read + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;Ljportmidi/JPortMidiApi/PmEvent;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Read + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Poll + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Poll + (JNIEnv *, jclass, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_Write + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;Ljportmidi/JPortMidiApi/PmEvent;)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Write + (JNIEnv *, jclass, jobject, jobject); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_WriteShort + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;II)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteShort + (JNIEnv *, jclass, jobject, jint, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pm_WriteSysEx + * Signature: (Ljportmidi/JPortMidiApi/PortMidiStream;I[B)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteSysEx + (JNIEnv *, jclass, jobject, jint, jbyteArray); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pt_TimeStart + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStart + (JNIEnv *, jclass, jint); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pt_TimeStop + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStop + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pt_Time + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1Time + (JNIEnv *, jclass); + +/* + * Class: jportmidi_JPortMidiApi + * Method: Pt_TimeStarted + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStarted + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class jportmidi_JPortMidiApi_PmEvent */ + +#ifndef _Included_jportmidi_JPortMidiApi_PmEvent +#define _Included_jportmidi_JPortMidiApi_PmEvent +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class jportmidi_JPortMidiApi_PortMidiStream */ + +#ifndef _Included_jportmidi_JPortMidiApi_PortMidiStream +#define _Included_jportmidi_JPortMidiApi_PortMidiStream +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/pd/portmidi/pm_java/pmjni/pmjni-VC8.vcproj b/pd/portmidi/pm_java/pmjni/pmjni-VC8.vcproj new file mode 100644 index 000000000..b7b2e2db3 --- /dev/null +++ b/pd/portmidi/pm_java/pmjni/pmjni-VC8.vcproj @@ -0,0 +1,225 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="pmjni" + ProjectGUID="{7AA255C8-48BF-40AC-97BA-F7E7BA4DDAA8}" + RootNamespace="pmjni" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(SolutionDir)\pm_common";"$(SolutionDir)\porttime";"$(ProjectDir)";"E:\Program Files\Java\jdk1.5.0_14\include";"E:\Program Files\Java\jdk1.5.0_14\include\win32"" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PMJNI_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="winmm.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(SolutionDir)\pm_common";"$(SolutionDir)\porttime";"$(ProjectDir)";"E:\Program Files\Java\jdk1.5.0_14\include";"E:\Program Files\Java\jdk1.5.0_14\include\win32"" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PMJNI_EXPORTS" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="winmm.lib" + LinkIncremental="1" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\pmjni.c" + > + </File> + <File + RelativePath="..\..\pm_common\pmutil.c" + > + </File> + <File + RelativePath="..\..\pm_win\pmwin.c" + > + </File> + <File + RelativePath="..\..\pm_win\pmwinmm.c" + > + </File> + <File + RelativePath="..\..\pm_common\portmidi.c" + > + </File> + <File + RelativePath="..\..\porttime\porttime.c" + > + </File> + <File + RelativePath="..\..\porttime\ptwinmm.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_java/pmjni/pmjni.c b/pd/portmidi/pm_java/pmjni/pmjni.c new file mode 100644 index 000000000..95e51dda4 --- /dev/null +++ b/pd/portmidi/pm_java/pmjni/pmjni.c @@ -0,0 +1,354 @@ +#include "portmidi.h" +#include "porttime.h" +#include "jportmidi_JportMidiApi.h" +#include <stdio.h> + +// these macros assume JNIEnv *env is declared and valid: +// +#define CLASS(c, obj) jclass c = (*env)->GetObjectClass(env, obj) +#define ADDRESS_FID(fid, c) \ + jfieldID fid = (*env)->GetFieldID(env, c, "address", "J") +// Uses Java Long (64-bit) to make sure there is room to store a +// pointer. Cast this to a C long (either 32 or 64 bit) to match +// the size of a pointer. Finally cast int to pointer. All this +// is supposed to avoid C compiler warnings and (worse) losing +// address bits. +#define PMSTREAM(obj, fid) ((PmStream *) (long) (*env)->GetLongField(env, obj, fid)) +// Cast stream to long to convert integer to pointer, then expand +// integer to 64-bit jlong. This avoids compiler warnings. +#define SET_PMSTREAM(obj, fid, stream) \ + (*env)->SetLongField(env, obj, fid, (jlong) (long) stream) + + +/* + * Method: Pm_Initialize + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Initialize + (JNIEnv *env, jclass cl) +{ + return Pm_Initialize(); +} + + +/* + * Method: Pm_Terminate + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Terminate + (JNIEnv *env, jclass cl) +{ + return Pm_Terminate(); +} + + +/* + * Method: Pm_HasHostError + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1HasHostError + (JNIEnv *env, jclass cl, jobject jstream) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_HasHostError(PMSTREAM(jstream, fid)); +} + + +/* + * Method: Pm_GetErrorText + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetErrorText + (JNIEnv *env, jclass cl, jint i) +{ + return (*env)->NewStringUTF(env, Pm_GetErrorText(i)); +} + + +/* + * Method: Pm_GetHostErrorText + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetHostErrorText + (JNIEnv *env, jclass cl) +{ + char msg[PM_HOST_ERROR_MSG_LEN]; + Pm_GetHostErrorText(msg, PM_HOST_ERROR_MSG_LEN); + return (*env)->NewStringUTF(env, msg); +} + + +/* + * Method: Pm_CountDevices + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1CountDevices + (JNIEnv *env, jclass cl) +{ + return Pm_CountDevices(); +} + + +/* + * Method: Pm_GetDefaultInputDeviceID + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultInputDeviceID + (JNIEnv *env, jclass cl) +{ + return Pm_GetDefaultInputDeviceID(); +} + + +/* + * Method: Pm_GetDefaultOutputDeviceID + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDefaultOutputDeviceID + (JNIEnv *env, jclass cl) +{ + return Pm_GetDefaultOutputDeviceID(); +} + + +/* + * Method: Pm_GetDeviceInterf + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInterf + (JNIEnv *env, jclass cl, jint i) +{ + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (!info) return NULL; + return (*env)->NewStringUTF(env, info->interf); +} + + +/* + * Method: Pm_GetDeviceName + */ +JNIEXPORT jstring JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceName + (JNIEnv *env, jclass cl, jint i) +{ + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (!info) return NULL; + return (*env)->NewStringUTF(env, info->name); +} + + +/* + * Method: Pm_GetDeviceInput + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceInput + (JNIEnv *env, jclass cl, jint i) +{ + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (!info) return (jboolean) 0; + return (jboolean) info->input; +} + + +/* + * Method: Pm_GetDeviceOutput + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pm_1GetDeviceOutput + (JNIEnv *env, jclass cl, jint i) +{ + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (!info) return (jboolean) 0; + return (jboolean) info->output; +} + + +/* + * Method: Pm_OpenInput + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenInput + (JNIEnv *env, jclass cl, + jobject jstream, jint index, jstring extras, jint bufsiz) +{ + PmError rslt; + PortMidiStream *stream; + CLASS(c, jstream); + ADDRESS_FID(fid, c); + rslt = Pm_OpenInput(&stream, index, NULL, bufsiz, NULL, NULL); + SET_PMSTREAM(jstream, fid, stream); + return rslt; +} + + +/* + * Method: Pm_OpenOutput + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1OpenOutput + (JNIEnv *env, jclass cl, jobject jstream, jint index, jstring extras, + jint bufsiz, jint latency) +{ + PmError rslt; + PortMidiStream *stream; + CLASS(c, jstream); + ADDRESS_FID(fid, c); + rslt = Pm_OpenOutput(&stream, index, NULL, bufsiz, NULL, NULL, latency); + SET_PMSTREAM(jstream, fid, stream); + return rslt; +} + + +/* + * Method: Pm_SetFilter + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetFilter + (JNIEnv *env, jclass cl, jobject jstream, jint filters) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_SetFilter(PMSTREAM(jstream, fid), filters); +} + + +/* + * Method: Pm_SetChannelMask + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1SetChannelMask + (JNIEnv *env, jclass cl, jobject jstream, jint mask) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_SetChannelMask(PMSTREAM(jstream, fid), mask); +} + + +/* + * Method: Pm_Abort + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Abort + (JNIEnv *env, jclass cl, jobject jstream) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_Abort(PMSTREAM(jstream, fid)); +} + + +/* + * Method: Pm_Close + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Close + (JNIEnv *env, jclass cl, jobject jstream) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_Close(PMSTREAM(jstream, fid)); +} + + +/* + * Method: Pm_Read + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Read + (JNIEnv *env, jclass cl, jobject jstream, jobject jpmevent) +{ + CLASS(jstream_class, jstream); + ADDRESS_FID(address_fid, jstream_class); + jclass jpmevent_class = (*env)->GetObjectClass(env, jpmevent); + jfieldID message_fid = + (*env)->GetFieldID(env, jpmevent_class, "message", "I"); + jfieldID timestamp_fid = + (*env)->GetFieldID(env, jpmevent_class, "timestamp", "I"); + PmEvent buffer; + PmError rslt = Pm_Read(PMSTREAM(jstream, address_fid), &buffer, 1); + (*env)->SetIntField(env, jpmevent, message_fid, buffer.message); + (*env)->SetIntField(env, jpmevent, timestamp_fid, buffer.timestamp); + return rslt; +} + + +/* + * Method: Pm_Poll + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Poll + (JNIEnv *env, jclass cl, jobject jstream) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_Poll(PMSTREAM(jstream, fid)); +} + + +/* + * Method: Pm_Write + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1Write + (JNIEnv *env, jclass cl, jobject jstream, jobject jpmevent) +{ + CLASS(jstream_class, jstream); + ADDRESS_FID(address_fid, jstream_class); + jclass jpmevent_class = (*env)->GetObjectClass(env, jpmevent); + jfieldID message_fid = + (*env)->GetFieldID(env, jpmevent_class, "message", "I"); + jfieldID timestamp_fid = + (*env)->GetFieldID(env, jpmevent_class, "timestamp", "I"); + // note that we call WriteShort because it's simpler than constructing + // a buffer and passing it to Pm_Write + return Pm_WriteShort(PMSTREAM(jstream, address_fid), + (*env)->GetIntField(env, jpmevent, timestamp_fid), + (*env)->GetIntField(env, jpmevent, message_fid)); +} + + +/* + * Method: Pm_WriteShort + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteShort + (JNIEnv *env, jclass cl, jobject jstream, jint when, jint msg) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + return Pm_WriteShort(PMSTREAM(jstream, fid), when, msg); +} + + +/* + * Method: Pm_WriteSysEx + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pm_1WriteSysEx + (JNIEnv *env, jclass cl, jobject jstream, jint when, jbyteArray jmsg) +{ + CLASS(c, jstream); + ADDRESS_FID(fid, c); + jbyte *bytes = (*env)->GetByteArrayElements(env, jmsg, 0); + PmError rslt = Pm_WriteSysEx(PMSTREAM(jstream, fid), when, + (unsigned char *) bytes); + (*env)->ReleaseByteArrayElements(env, jmsg, bytes, 0); + return rslt; +} + +/* + * Method: Pt_TimeStart + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStart + (JNIEnv *env, jclass c, jint resolution) +{ + return Pt_Start(resolution, NULL, NULL); +} + +/* + * Method: Pt_TimeStop + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStop + (JNIEnv *env, jclass c) + { + return Pt_Stop(); + } + +/* + * Method: Pt_Time + */ +JNIEXPORT jint JNICALL Java_jportmidi_JPortMidiApi_Pt_1Time + (JNIEnv *env, jclass c) + { + return Pt_Time(); + } + +/* + * Method: Pt_TimeStarted + */ +JNIEXPORT jboolean JNICALL Java_jportmidi_JPortMidiApi_Pt_1TimeStarted + (JNIEnv *env, jclass c) +{ + return Pt_Started(); +} + + diff --git a/pd/portmidi/pm_java/pmjni/pmjni.rc b/pd/portmidi/pm_java/pmjni/pmjni.rc new file mode 100644 index 000000000..1b7522b7a --- /dev/null +++ b/pd/portmidi/pm_java/pmjni/pmjni.rc @@ -0,0 +1,63 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/pd/portmidi/pm_java/setup/pmdefaults-setup.exe b/pd/portmidi/pm_java/setup/pmdefaults-setup.exe new file mode 100644 index 0000000000000000000000000000000000000000..78ef52c3e440708affcc7e8908cb51f8a9ad5faf GIT binary patch literal 485013 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Μ3O6|d9v?XBvE^+5%puiV?L_}N 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 T-HY<>|Ls65&7Z0N{;}O>)f+{n literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_linux/README_LINUX.txt b/pd/portmidi/pm_linux/README_LINUX.txt old mode 100644 new mode 100755 index d3adf5a9b..754f41a2d --- a/pd/portmidi/pm_linux/README_LINUX.txt +++ b/pd/portmidi/pm_linux/README_LINUX.txt @@ -1,31 +1,101 @@ README_LINUX.txt for PortMidi Roger Dannenberg -29 Aug 2006 +14 Oct 2009 -To make PortMidi and PortTime, go back up to the portmidi -directory and type +To make PortMidi, you need cmake and the Java SDK. +Go back up to the portmidi directory and type: -make -f pm_linux/Makefile +ccmake . -(You can also copy pm_linux/Makefile to the portmidi -directory and just type "make".) +Type 'c' (configure) and then 'g' (generate). You may have +to manually set JAVA_INCLUDE_PATH and JAVA_JVM_LIBRARY +by typing 't' (toggle to advanced mode) and using the +editor to change the fields. You can find possible values +for JAVA_INCLUDE_PATH by typing "locate jni.h", and for +JAVA_JVM_LIBRARY by typing locate libjvm". + +You also need JAVA_INCLUDE_PATH2, but this will normally +be set automatically after you set JAVA_INCLUDE_PATH and +run "configure" (type "c" to ccmake). Normally, +JAVA_INCLUDE_PATH2 is the linux subdirectory within +JAVA_INCLUDE_PATH. + +Notice that the CMAKE_BUILD_TYPE can be Debug or Release. +Stick with Release if you are not debugging. + +After successfully generating make files with ccmake, you +can run make: + +make The Makefile will build all test programs and the portmidi -library. You may want to modify the Makefile to remove the -PM_CHECK_ERRORS definition. For experimental software, +library. For experimental software, especially programs running from the command line, we -recommend using PM_CHECK_ERRORS -- it will terminate your +recommend using the Debug version -- it will terminate your program and print a helpful message if any PortMidi -function returns an error code. +function returns an error code. (Released software should +check for error codes and handle them, but for quick, +non-critical projects, the automatic "print and die" +handling can save some work.) + +THE pmdefaults PROGRAM + +You should install pmdefaults. It provides a graphical interface +for selecting default MIDI IN and OUT devices so that you don't +have to build device selection interfaces into all your programs +and so users have a single place to set a preference. + +Follow the instructions above to run ccmake, making sure that +CMAKE_BUILD_TYPE is Release. Run make as described above. Then: + +sudo make install + +This will install PortMidi libraries and the pmdefault program. +You must alos have the environment variable LD_LIBRARY_PATH set +to include /usr/local/lib (where libpmjni.so is installed). + +Now, you can run pmdefault. + -If you do not compile with PM_CHECK_ERRORS, you should -check for errors yourself. +SETTING LD_LIBRARY_PATH -This code has not been carefully tested; however, -all test programs in pm_test seem to run properly. +pmdefaults will not work unless LD_LIBRARY_PATH includes a +directory (normally /usr/local/lib) containing libpmjni.so, +installed as described above. + +To set LD_LIBRARY_PATH, you might want to add this to your +~/.profile (if you use the bash shell): + +LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib +export LD_LIBRARY_PATH + + +A NOTE ABOUT AMD64: + +When compiling portmidi under linux on an AMD64, I had to add the -fPIC +flag to the gcc flags. + +Reason: when trying to build John Harrison's pyPortMidi gcc bailed out +with this error: + +./linux/libportmidi.a(pmlinux.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC +./linux/libportmidi.a: could not read symbols: Bad value +collect2: ld returned 1 exit status +error: command 'gcc' failed with exit status 1 + +What they said: +http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml?part=1&chap=3 +On certain architectures (AMD64 amongst them), shared libraries *must* +be "PIC-enabled". CHANGELOG +22-jan-2010 Roger B. Dannenberg + Updated instructions about Java paths + +14-oct-2009 Roger B. Dannenberg + Using CMake now for building and configuration + 29-aug-2006 Roger B. Dannenberg Fixed PortTime to join with time thread for clean exit. diff --git a/pd/portmidi/pm_linux/finddefault.c b/pd/portmidi/pm_linux/finddefault.c new file mode 100644 index 000000000..634031689 --- /dev/null +++ b/pd/portmidi/pm_linux/finddefault.c @@ -0,0 +1,92 @@ +/* finddefault.c -- find_default_device() implementation + Roger Dannenberg, Jan 2009 +*/ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "portmidi.h" + +#define STRING_MAX 256 + +/* skip over spaces, return first non-space */ +void skip_spaces(FILE *inf) +{ + char c; + while (isspace(c = getc(inf))) ; + ungetc(c, inf); +} + +/* trim leading spaces and match a string */ +int match_string(FILE *inf, char *s) +{ + skip_spaces(inf); + while (*s && *s == getc(inf)) s++; + return (*s == 0); +} + + +/* +/* Parse preference files, find default device, search devices -- + */ +PmDeviceID find_default_device(char *path, int input, PmDeviceID id) +/* path -- the name of the preference we are searching for + input -- true iff this is an input device + id -- current default device id + returns matching device id if found, otherwise id +*/ +{ + static char *pref_2 = "/.java/.userPrefs/"; + static char *pref_3 = "prefs.xml"; + char *pref_1 = getenv("HOME"); + char *full_name, *path_ptr; + FILE *inf; + int c, i; + if (!pref_1) goto nopref; // cannot find preference file + // full_name will be larger than necessary + full_name = malloc(strlen(pref_1) + strlen(pref_2) + strlen(pref_3) + + strlen(path) + 2); + strcpy(full_name, pref_1); + strcat(full_name, pref_2); + // copy all but last path segment to full_name + if (*path == '/') path++; // skip initial slash in path + path_ptr = strrchr(path, '/'); + if (path_ptr) { // copy up to slash after full_name + path_ptr++; + int offset = strlen(full_name); + memcpy(full_name + offset, path, path_ptr - path); + full_name[offset + path_ptr - path] = 0; // end of string + } else { + path_ptr = path; + } + strcat(full_name, pref_3); + inf = fopen(full_name, "r"); + if (!inf) goto nopref; // cannot open preference file + // We're not going to build or link in a full XML parser. + // Instead, find the path string and quoute. Then, look for + // "value", "=", quote. Then get string up to quote. + while ((c = getc(inf)) != EOF) { + char pref_str[STRING_MAX]; + if (c != '"') continue; // scan up to quote + // look for quote string quote + if (!match_string(inf, path_ptr)) continue; // path not found + if (getc(inf) != '"') continue; // path not found, keep scanning + if (!match_string(inf, "value")) goto nopref; // value not found + if (!match_string(inf, "=")) goto nopref; // = not found + if (!match_string(inf, "\"")) goto nopref; // quote not found + // now read the value up to the close quote + for (i = 0; i < STRING_MAX; i++) { + if ((c = getc(inf)) == '"') break; + pref_str[i] = c; + } + if (i == STRING_MAX) continue; // value too long, ignore + pref_str[i] == 0; + i = pm_find_default_device(pref_str, input); + if (i != pmNoDevice) { + id = i; + } + break; + } + nopref: + return id; +} diff --git a/pd/portmidi/pm_linux/pmlinux.c b/pd/portmidi/pm_linux/pmlinux.c old mode 100644 new mode 100755 index dcb2b8b25..49e266d78 --- a/pd/portmidi/pm_linux/pmlinux.c +++ b/pd/portmidi/pm_linux/pmlinux.c @@ -12,6 +12,9 @@ #include "stdlib.h" #include "portmidi.h" +#include "pmutil.h" +#include "pminternal.h" + #ifdef PMALSA #include "pmlinuxalsa.h" #endif @@ -20,7 +23,10 @@ #include "pmlinuxnull.h" #endif -PmError pm_init() +PmDeviceID pm_default_input_device_id = -1; +PmDeviceID pm_default_output_device_id = -1; + +void pm_init() { /* Note: it is not an error for PMALSA to fail to initialize. * It may be a design error that the client cannot query what subsystems @@ -33,7 +39,15 @@ PmError pm_init() #ifdef PMNULL pm_linuxnull_init(); #endif - return pmNoError; + // this is set when we return to Pm_Initialize, but we need it + // now in order to (successfully) call Pm_CountDevices() + pm_initialized = TRUE; + pm_default_input_device_id = find_default_device( + "/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE, + pm_default_input_device_id); + pm_default_output_device_id = find_default_device( + "/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE, + pm_default_output_device_id); } void pm_term(void) @@ -43,14 +57,13 @@ void pm_term(void) #endif } -PmDeviceID pm_default_input_device_id = -1; -PmDeviceID pm_default_output_device_id = -1; - PmDeviceID Pm_GetDefaultInputDeviceID() { + Pm_Initialize(); return pm_default_input_device_id; } PmDeviceID Pm_GetDefaultOutputDeviceID() { + Pm_Initialize(); return pm_default_output_device_id; } diff --git a/pd/portmidi/pm_linux/pmlinux.h b/pd/portmidi/pm_linux/pmlinux.h old mode 100644 new mode 100755 diff --git a/pd/portmidi/pm_linux/pmlinuxalsa.c b/pd/portmidi/pm_linux/pmlinuxalsa.c old mode 100644 new mode 100755 index 6132e0906..a86adfb6d --- a/pd/portmidi/pm_linux/pmlinuxalsa.c +++ b/pd/portmidi/pm_linux/pmlinuxalsa.c @@ -9,9 +9,7 @@ #include "stdlib.h" #include "portmidi.h" -#ifdef NEWBUFFER #include "pmutil.h" -#endif #include "pminternal.h" #include "pmlinuxalsa.h" #include "string.h" @@ -39,7 +37,6 @@ #define GET_DESCRIPTOR_PORT(info) (((int)(info)) & 0xff) #define BYTE unsigned char -#define UINT unsigned long extern pm_fns_node pm_linuxalsa_in_dictionary; extern pm_fns_node pm_linuxalsa_out_dictionary; @@ -385,12 +382,12 @@ static PmError alsa_abort(PmInternal *midi) #ifdef GARBAGE This is old code here temporarily for reference -static PmError alsa_write(PmInternal *midi, PmEvent *buffer, long length) +static PmError alsa_write(PmInternal *midi, PmEvent *buffer, int32_t length) { alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor; int i, bytes; unsigned char byte; - long msg; + PmMessage msg; desc->error = 0; for (; length > 0; length--, buffer++) { @@ -423,7 +420,7 @@ static PmError alsa_write(PmInternal *midi, PmEvent *buffer, long length) } if (desc->error < 0) return pmHostError; - VERBOSE printf("snd_seq_drain_output: 0x%x\n", seq); + VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int) seq); desc->error = snd_seq_drain_output(seq); if (desc->error < 0) return pmHostError; @@ -448,7 +445,7 @@ static PmError alsa_write_flush(PmInternal *midi, PmTimestamp timestamp) static PmError alsa_write_short(PmInternal *midi, PmEvent *event) { int bytes = midi_message_length(event->message); - long msg = event->message; + PmMessage msg = event->message; int i; alsa_descriptor_type desc = (alsa_descriptor_type) midi->descriptor; for (i = 0; i < bytes; i++) { diff --git a/pd/portmidi/pm_linux/pmlinuxalsa.h b/pd/portmidi/pm_linux/pmlinuxalsa.h old mode 100644 new mode 100755 diff --git a/pd/portmidi/pm_mac/Makefile.osx b/pd/portmidi/pm_mac/Makefile.osx new file mode 100755 index 000000000..383255481 --- /dev/null +++ b/pd/portmidi/pm_mac/Makefile.osx @@ -0,0 +1,129 @@ +# MAKEFILE FOR PORTMIDI + +# Roger B. Dannenberg +# Sep 2009 + +# NOTE: you can use +# make -f pm_osx/Makefile.osx configuration=Release +# to override the default Debug configuration +configuration=Release + +PF=/usr/local + +# For debugging, define PM_CHECK_ERRORS +ifeq ($(configuration),Release) + CONFIG = Release +else + CONFIG = Debug +endif + +current: all + +all: $(CONFIG)/CMakeCache.txt + cd $(CONFIG); make + +$(CONFIG)/CMakeCache.txt: + rm -f CMakeCache.txt + mkdir -p $(CONFIG) + cd $(CONFIG); cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=$(CONFIG) + + +**** For instructions: make -f pm_mac\Makefile.osx help ****\n' + +help: + echo $$'\n\n\ +This is help for portmidi/pm_mac/Makefile.osx\n\n\ +Installation path for dylib is $(PF)\n\ +To build Release version libraries and test applications,\n \ +make -f pm_mac/Makefile.osx\n\ +To build Debug version libraries and test applications,\n \ +make -f pm_mac/Makefile.osx configuration=Debug\n\ +To install universal dynamic library,\n \ +sudo make -f pm_mac/Makefile.osx install\n\ +To install universal dynamic library with xcode,\n \ +make -f pm_mac/Makefile.osx install-with-xcode\n\ +To make PmDefaults Java application,\n \ +make -f pm_mac/Makefile.osx pmdefaults\n\n \ +configuration = $(configuration)\n' + + +clean: + rm -f *.o *~ core* */*.o */*/*.o */*~ */core* pm_test/*/pm_dll.dll + rm -f *.opt *.ncb *.plg pm_win/Debug/pm_dll.lib pm_win/Release/pm_dll.lib + rm -f pm_test/*.opt pm_test/*.ncb + rm -f pm_java/pmjni/*.o pm_java/pmjni/*~ pm_java/*.h + rm -rf Release/CMakeFiles Debug/CMakeFiles + rm -rf pm_mac/pmdefaults/lib pm_mac/pmdefaults/src + +cleaner: clean + rm -rf pm_mac/build + rm -rf pm_mac/Debug pm_mac/Release pm_test/Debug pm_test/Release + rm -f Debug/*.dylib Release/*.dylib + rm -f pm_java/pmjni/Debug/*.jnilib + rm -f pm_java/pmjni/Release/*.jnilib + +cleanest: cleaner + rm -f Debug/libportmidi_s.a Release/libportmidi_s.a + rm -f pm_test/Debug/test pm_test/Debug/sysex pm_test/Debug/midithread + rm -f pm_test/Debug/latency pm_test/Debug/midithru + rm -f pm_test/Debug/qtest pm_test/Debug/mm + rm -f pm_test/Release/test pm_test/Release/sysex pm_test/Release/midithread + rm -f pm_test/Release/latency pm_test/Release/midithru + rm -f pm_test/Release/qtest pm_test/Release/mm + rm -f pm_java/*/*.class + rm -f pm_java/pmjni/jportmidi_JPortMidiApi_PortMidiStream.h + +backup: cleanest + cd ..; zip -r portmidi.zip portmidi + +install: porttime/porttime.h pm_common/portmidi.h \ + $(CONFIG)/libportmidi.dylib + install porttime/porttime.h $(PF)/include/ + install pm_common/portmidi.h $(PF)/include + install $(CONFIG)/libportmidi.dylib $(PF)/lib/ + +# note - this uses xcode to build and install portmidi universal binaries +install-with-xcode: + sudo xcodebuild -project pm_mac/pm_mac.xcodeproj \ + -configuration Release install DSTROOT=/ + +##### build pmdefault ###### + +pm_java/pmjni/jportmidi_JPortMidiApi.h: pm_java/jportmidi/JPortMidiApi.class + cd pm_java; javah jportmidi.JPortMidiApi + mv pm_java/jportmidi_JportMidiApi.h pm_java/pmjni + +JAVASRC = pmdefaults/PmDefaultsFrame.java \ + pmdefaults/PmDefaults.java \ + jportmidi/JPortMidiApi.java jportmidi/JPortMidi.java \ + jportmidi/JPortMidiException.java + +# this compiles ALL of the java code +pm_java/jportmidi/JPortMidiApi.class: $(JAVASRC:%=pm_java/%) + cd pm_java; javac $(JAVASRC) + +$(CONFIG)/libpmjni.dylib: + mkdir -p $(CONFIG) + cd $(CONFIG); make -f ../pm_mac/$(MAKEFILE) + +pmdefaults: $(CONFIG)/libpmjni.dylib pm_java/jportmidi/JPortMidiApi.class +ifeq ($(CONFIG),Debug) + echo "Error: you cannot build pmdefaults in a Debug configuration \n\ + You should use configuration=Release in the Makefile command line. " + @exit 2 +endif + xcodebuild -project pm_mac/pm_mac.xcodeproj \ + -configuration Release -target PmDefaults + echo "pmdefaults java application is made" + +###### test plist reader ####### +PLHDR = pm_mac/readbinaryplist.h +PLSRC = pm_mac/plisttest.c pm_mac/readbinaryplist.c +pm_mac/plisttest: $(PLHDR) $(PLSRC) + cc $(VFLAGS) -Ipm_mac \ + -I/Developer/Headers/FlatCarbon \ + -I/System/Library/Frameworks/CoreFoundation.framework/Headers \ + -I/System/Library/Frameworks/CoreServices.framework/Headers \ + $(PLSRC) -o pm_mac/$(CONFIG)/plisttest \ + -framework CoreFoundation -framework CoreServices + diff --git a/pd/portmidi/pm_mac/README_MAC.txt b/pd/portmidi/pm_mac/README_MAC.txt new file mode 100644 index 000000000..6fa693840 --- /dev/null +++ b/pd/portmidi/pm_mac/README_MAC.txt @@ -0,0 +1,163 @@ +README_MAC.txt for PortMidi +Roger Dannenberg +20 nov 2009 +revised 20 Sep 2010 for Xcode 3.2.4 and CMake 8.2-2 + +To build PortMidi for Mac OS X, you must install Xcode and +CMake. + +CMake can build either command-line Makefiles or Xcode projects. +These approaches are described in separate sections below. + +==== CLEANING UP ==== +(Skip this for now, but later you might want start from a clean +slate.) + +Start in the portmedia/portmidi directory. + +make -f pm_mac/Makefile.osx clean + +will remove .o, CMakeFiles, and other intermediate files. + +Using "cleaner" instead of "clean" will also remove jni-related +intermediate files. + +Using "cleanest" instead of "clean" or "cleaner" will also remove +application binaries and the portmidi libraries. (It will not +uninstall anything, however.) + +==== USING CMAKE (AND COMMAND LINE TOOLS) ==== + +Start in the portmedia/portmidi directory. + +make -f pm_mac/Makefile.osx + +(Begin note: make will invoke cmake to build a Makefile and then make to +build portmidi. This extra level allows you to correctly build +both Release and Debug versions. Release is the default, so to get +the Debug version, use: + +make -f pm_mac/Makefile.osx configuration=Debug +) + +Release version executables and libraries are now in + portmedia/portmidi/Release + +Debug version executables and libraries are created in + portmedia/portmidi/Debug +The Debug versions are compiled with PM_CHECK_ERRORS which +prints an error message and aborts when an error code is returned +by PortMidi functions. This is useful for small command line +applications. Otherwise, you should check and handle error returns +in your program. + +You can install portmidi as follows: + +cd Release; sudo make install + +This will install /usr/local/include/{portmidi.h, porttime.h} +and /usr/local/lib/{libportmidi.dylib, libportmidi_s.a, libpmjni.dylib} + +You should now make the pmdefaults.app: + +make -f pm_mac/Makefile.osx pmdefaults + +NOTE: pmdefaults.app will be in pm_mac/Release/. + +Please copy pmdefaults.app to your Applications folder or wherever +you would normally expect to find it. + +==== USING CMAKE TO BUILD Xcode PROJECT ==== + +Before you can use Xcode, you need a portmidi.xcodeproj file. +CMake builds a location-dependent Xcode project, so unfortunately +it is not easy to provide an Xcode project that is ready to use. +Therefore, you should make your own. Once you have it, you can +use it almost like any other Xcode project, and you will not have +to go back to CMake. + +(1) Install CMake if you do not have it already. + +(2) Open portmedia/portmidi/CMakeLists.txt with CMake + +(3) Use Configure and Generate buttons + +(4) This creates portmedia/portmidi/portmidi.xcodeproj. + +Note: You will also use pm_mac/pm_mac.xcodeproj, which +is not generated by CMake. + +(5) Open portmidi/portmidi.xcodeproj with Xcode and +build what you need. The simplest thing is to build the +ALL_BUILD target. The default will be to build the Debug +version, but you may want to change this to Release. + +NOTE: ALL_BUILD may report errors. Try simply building again +or rebuilding specific targets that fail until they build +without errors. There appears to be a race condition or +missing dependencies in the build system. + +The Debug version is compiled with PM_CHECK_ERRORS, and the +Release version is not. PM_CHECK_ERRORS will print an error +message and exit your program if any error is returned from +a call into PortMidi. + +CMake (currently) also creates MinSizRel and RelWithDebInfo +versions, but only because I cannot figure out how to disable +them. + +You will probably want the application PmDefaults, which sets +default MIDI In and Out devices for PortMidi. You may also +want to build a Java application using PortMidi. Since I have +not figured out how to use CMake to make an OS X Java application, +use pm_mac/pm_mac.xcodeproj as follows: + +(6) open pm_mac/pm_mac.xcodeproj + +(7) pm_java/pmjni/portmidi_JportmidiApi.h is needed +by libpmjni.jnilib, the Java native interface library. Since +portmidi_JportmidiApi.h is included with PortMidi, you can skip +to step 8, but if you really want to rebuild everything from +scratch, build the JPortMidiHeaders project first, and continue +with step 8: + +(8) If you did not build libpmjni.dylib using portmidi.xcodeproj, +do it now. (It depends on portmidi_JportmidiApi.h, and the +PmDefaults project depends on libpmjni.dylib.) + +(9) Returning to pm_mac.xcodeproj, build the PmDefaults program. + +(10) If you wish, copy pm_mac/build/Deployment/PmDefaults.app to +your applications folder. + +(11) If you want to install libportmidi.dylib, first make it with +Xcode, then + sudo make -f pm_mac/Makefile.osx install +This command will install /usr/local/include/{porttime.h, portmidi.h} +and /usr/local/lib/libportmidi.dylib +Note that the "install" function of xcode creates portmidi/Release +and does not install the library to /usr/local/lib, so please use +the command line installer. + + +CHANGELOG + +20-Sep-2010 Roger B. Dannenberg + Adapted to Xcode 3.2.4 +20-Nov-2009 Roger B. Dannenberg + Added some install instructions +26-Sep-2009 Roger B. Dannenberg + More changes for using CMake, Makefiles, XCode +20-Sep-2009 Roger B. Dannenberg + Modifications for using CMake +14-Sep-2009 Roger B. Dannenberg + Modifications for using CMake +17-Jan-2007 Roger B. Dannenberg + Explicit instructions for Xcode +15-Jan-2007 Roger B. Dannenberg + Changed instructions because of changes to Makefile.osx +07-Oct-2006 Roger B. Dannenberg + Added directions for xcodebuild +29-aug-2006 Roger B. Dannenberg + Updated this documentation. + diff --git a/pd/portmidi/pm_mac/finddefault.c b/pd/portmidi/pm_mac/finddefault.c new file mode 100644 index 000000000..59e02a10b --- /dev/null +++ b/pd/portmidi/pm_mac/finddefault.c @@ -0,0 +1,57 @@ +/* finddefault.c -- find_default_device() implementation + Roger Dannenberg, June 2008 +*/ + +#include <stdlib.h> +#include <string.h> +#include "portmidi.h" +#include "pmutil.h" +#include "pminternal.h" +#include "pmmacosxcm.h" +#include "readbinaryplist.h" + +/* Parse preference files, find default device, search devices -- + This parses the preference file(s) once for input and once for + output, which is inefficient but much simpler to manage. Note + that using the readbinaryplist.c module, you cannot keep two + plist files (user and system) open at once (due to a simple + memory management scheme). +*/ +PmDeviceID find_default_device(char *path, int input, PmDeviceID id) +/* path -- the name of the preference we are searching for + input -- true iff this is an input device + id -- current default device id + returns matching device id if found, otherwise id +*/ +{ + static char *pref_file = "com.apple.java.util.prefs.plist"; + char *pref_str = NULL; + // read device preferences + value_ptr prefs = bplist_read_user_pref(pref_file); + if (prefs) { + value_ptr pref_val = value_dict_lookup_using_path(prefs, path); + if (pref_val) { + pref_str = value_get_asciistring(pref_val); + } + } + if (!pref_str) { + bplist_free_data(); /* look elsewhere */ + prefs = bplist_read_system_pref(pref_file); + if (prefs) { + value_ptr pref_val = value_dict_lookup_using_path(prefs, path); + if (pref_val) { + pref_str = value_get_asciistring(pref_val); + } + } + } + if (pref_str) { /* search devices for match */ + int i = pm_find_default_device(pref_str, input); + if (i != pmNoDevice) { + id = i; + } + } + if (prefs) { + bplist_free_data(); + } + return id; +} diff --git a/pd/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj b/pd/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj new file mode 100755 index 000000000..0d06e565e --- /dev/null +++ b/pd/portmidi/pm_mac/pm_mac.xcodeproj/project.pbxproj @@ -0,0 +1,594 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXAggregateTarget section */ + 3D634CAB1247805C0020F829 /* JPortMidiHeaders */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 3D634CAE1247807A0020F829 /* Build configuration list for PBXAggregateTarget "JPortMidiHeaders" */; + buildPhases = ( + 3D634CAA1247805C0020F829 /* ShellScript */, + ); + dependencies = ( + 3D634CB0124781580020F829 /* PBXTargetDependency */, + ); + name = JPortMidiHeaders; + productName = JPortMidiHeaders; + }; + 3DE2142D124662AA0033C839 /* CopyJavaSources */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 3DE21434124662FF0033C839 /* Build configuration list for PBXAggregateTarget "CopyJavaSources" */; + buildPhases = ( + 3DE2142C124662AA0033C839 /* CopyFiles */, + ); + comments = "The reason for copying files here is that the Compile Java target looks in a particular place for sources. It would be much better to simply have Compile Java look in the original location for all sources, but I don't know how to do that. -RBD\n"; + dependencies = ( + ); + name = CopyJavaSources; + productName = CopyJavaSources; + }; + 89D0F1C90F3B704E007831A7 /* PmDefaults */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "PmDefaults" */; + buildPhases = ( + ); + dependencies = ( + 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */, + 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */, + 3DE21431124662C50033C839 /* PBXTargetDependency */, + ); + name = PmDefaults; + productName = pmdefaults; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 3DE2137F124653FB0033C839 /* portmusic_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 3DE2137E124653FB0033C839 /* portmusic_logo.png */; }; + 3DE21435124663860033C839 /* PmDefaultsFrame.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */; }; + 3DE214361246638A0033C839 /* PmDefaults.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE2137B1246538B0033C839 /* PmDefaults.java */; }; + 3DE214371246638F0033C839 /* JPortMidiException.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21382124654DE0033C839 /* JPortMidiException.java */; }; + 3DE214381246638F0033C839 /* JPortMidiApi.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21381124654CF0033C839 /* JPortMidiApi.java */; }; + 3DE214391246638F0033C839 /* JPortMidi.java in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3DE21380124654BC0033C839 /* JPortMidi.java */; }; + 3DE216131246AC0E0033C839 /* libpmjni.dylib in Copy Java Resources */ = {isa = PBXBuildFile; fileRef = 3DE216101246ABE30033C839 /* libpmjni.dylib */; }; + 3DE216951246D57A0033C839 /* pmdefaults.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3DE216901246C6410033C839 /* pmdefaults.icns */; }; + 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 89C3F2900F5250A300B0048E /* Credits.rtf */; }; + 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 89D0F0210F392F20007831A7 /* InfoPlist.strings */; }; + 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */ = {isa = PBXBuildFile; fileRef = 89D0F03E0F39304A007831A7 /* JavaApplicationStub */; }; + 89D0F16A0F3A124E007831A7 /* pmdefaults.jar in Copy Java Resources */ = {isa = PBXBuildFile; fileRef = 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 3D634CAF124781580020F829 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 89D0F1C90F3B704E007831A7; + remoteInfo = PmDefaults; + }; + 3DE21430124662C50033C839 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3DE2142D124662AA0033C839; + remoteInfo = CopyJavaSources; + }; + 3DE2145D124666900033C839 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3DE2142D124662AA0033C839; + remoteInfo = CopyJavaSources; + }; + 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D1107260486CEB800E47090; + remoteInfo = "Assemble Application"; + }; + 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 89D0F0480F393A6F007831A7; + remoteInfo = "Compile Java"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 3DE2142C124662AA0033C839 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "${PROJECT_DIR}/pmdefaults/src/java"; + dstSubfolderSpec = 0; + files = ( + 3DE21435124663860033C839 /* PmDefaultsFrame.java in CopyFiles */, + 3DE214361246638A0033C839 /* PmDefaults.java in CopyFiles */, + 3DE214371246638F0033C839 /* JPortMidiException.java in CopyFiles */, + 3DE214381246638F0033C839 /* JPortMidiApi.java in CopyFiles */, + 3DE214391246638F0033C839 /* JPortMidi.java in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 89D0F0440F393070007831A7 /* Copy Executable */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + 89D0F0410F39306C007831A7 /* JavaApplicationStub in Copy Executable */, + ); + name = "Copy Executable"; + runOnlyForDeploymentPostprocessing = 0; + }; + 89D0F11F0F394189007831A7 /* Copy Java Resources */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 15; + files = ( + 89D0F16A0F3A124E007831A7 /* pmdefaults.jar in Copy Java Resources */, + 3DE216131246AC0E0033C839 /* libpmjni.dylib in Copy Java Resources */, + ); + name = "Copy Java Resources"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 3DE2137B1246538B0033C839 /* PmDefaults.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = PmDefaults.java; path = ../pm_java/pmdefaults/PmDefaults.java; sourceTree = SOURCE_ROOT; }; + 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = PmDefaultsFrame.java; path = ../pm_java/pmdefaults/PmDefaultsFrame.java; sourceTree = SOURCE_ROOT; }; + 3DE2137E124653FB0033C839 /* portmusic_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = portmusic_logo.png; path = ../pm_java/pmdefaults/portmusic_logo.png; sourceTree = SOURCE_ROOT; }; + 3DE21380124654BC0033C839 /* JPortMidi.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidi.java; path = ../pm_java/jportmidi/JPortMidi.java; sourceTree = SOURCE_ROOT; }; + 3DE21381124654CF0033C839 /* JPortMidiApi.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidiApi.java; path = ../pm_java/jportmidi/JPortMidiApi.java; sourceTree = SOURCE_ROOT; }; + 3DE21382124654DE0033C839 /* JPortMidiException.java */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.java; name = JPortMidiException.java; path = ../pm_java/jportmidi/JPortMidiException.java; sourceTree = SOURCE_ROOT; }; + 3DE213841246555A0033C839 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = /System/Library/Frameworks/CoreMIDI.framework; sourceTree = "<absolute>"; }; + 3DE21390124655760033C839 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; }; + 3DE213BE1246557F0033C839 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; }; + 3DE216101246ABE30033C839 /* libpmjni.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpmjni.dylib; path = ../Release/libpmjni.dylib; sourceTree = SOURCE_ROOT; }; + 3DE216901246C6410033C839 /* pmdefaults.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = pmdefaults.icns; path = ../pm_java/pmdefaults/pmdefaults.icns; sourceTree = SOURCE_ROOT; }; + 89C3F2910F5250A300B0048E /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; }; + 89D0F0220F392F20007831A7 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + 89D0F0230F392F20007831A7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 89D0F03E0F39304A007831A7 /* JavaApplicationStub */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = JavaApplicationStub; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub; sourceTree = "<absolute>"; }; + 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaNativeFoundation.framework; path = /System/Library/Frameworks/JavaVM.framework/Versions/A/Frameworks/JavaNativeFoundation.framework; sourceTree = "<absolute>"; }; + 89D0F1390F3948A9007831A7 /* pmdefaults/make */ = {isa = PBXFileReference; lastKnownFileType = folder; path = pmdefaults/make; sourceTree = "<group>"; }; + 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = pmdefaults.jar; path = build/Release/pmdefaults.jar; sourceTree = SOURCE_ROOT; }; + 89D0F1860F3A2442007831A7 /* JavaVM.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaVM.framework; path = /System/Library/Frameworks/JavaVM.framework; sourceTree = "<absolute>"; }; + 8D1107320486CEB800E47090 /* PmDefaults.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PmDefaults.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 3DE213841246555A0033C839 /* CoreMIDI.framework */, + 3DE21390124655760033C839 /* CoreFoundation.framework */, + 3DE213BE1246557F0033C839 /* CoreAudio.framework */, + 89D0F1860F3A2442007831A7 /* JavaVM.framework */, + 89D0F0840F394066007831A7 /* JavaNativeFoundation.framework */, + ); + name = "Linked Frameworks"; + sourceTree = "<group>"; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = "Other Frameworks"; + sourceTree = "<group>"; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 89D0F15D0F3A0FF7007831A7 /* pmdefaults.jar */, + 8D1107320486CEB800E47090 /* PmDefaults.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 29B97314FDCFA39411CA2CEA /* pmdefaults */ = { + isa = PBXGroup; + children = ( + 3DE216101246ABE30033C839 /* libpmjni.dylib */, + 89D0F0260F392F48007831A7 /* Source */, + 89D0F0200F392F20007831A7 /* Resources */, + 89D0F1390F3948A9007831A7 /* pmdefaults/make */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = pmdefaults; + sourceTree = "<group>"; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + 3DE2136A124652E20033C839 /* pm_java */ = { + isa = PBXGroup; + children = ( + 3DE21379124653150033C839 /* pmdefaults */, + 3DE2137A1246531D0033C839 /* jportmidi */, + ); + name = pm_java; + path = ..; + sourceTree = "<group>"; + }; + 3DE21379124653150033C839 /* pmdefaults */ = { + isa = PBXGroup; + children = ( + 3DE2137D124653CB0033C839 /* PmDefaultsFrame.java */, + 3DE2137B1246538B0033C839 /* PmDefaults.java */, + ); + name = pmdefaults; + sourceTree = "<group>"; + }; + 3DE2137A1246531D0033C839 /* jportmidi */ = { + isa = PBXGroup; + children = ( + 3DE21382124654DE0033C839 /* JPortMidiException.java */, + 3DE21381124654CF0033C839 /* JPortMidiApi.java */, + 3DE21380124654BC0033C839 /* JPortMidi.java */, + ); + name = jportmidi; + sourceTree = "<group>"; + }; + 89D0F0200F392F20007831A7 /* Resources */ = { + isa = PBXGroup; + children = ( + 3DE216901246C6410033C839 /* pmdefaults.icns */, + 3DE2137E124653FB0033C839 /* portmusic_logo.png */, + 89C3F2900F5250A300B0048E /* Credits.rtf */, + 89D0F0230F392F20007831A7 /* Info.plist */, + 89D0F0210F392F20007831A7 /* InfoPlist.strings */, + 89D0F03E0F39304A007831A7 /* JavaApplicationStub */, + ); + name = Resources; + path = pmdefaults/resources; + sourceTree = "<group>"; + }; + 89D0F0260F392F48007831A7 /* Source */ = { + isa = PBXGroup; + children = ( + 3DE2136A124652E20033C839 /* pm_java */, + ); + name = Source; + path = pmdefaults/src; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 89D0F0480F393A6F007831A7 /* Compile Java */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "-e -f \"${SRCROOT}/make/build.xml\" -debug \"$ACTION\""; + buildConfigurationList = 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/ant; + buildWorkingDirectory = ""; + dependencies = ( + 3DE2145E124666900033C839 /* PBXTargetDependency */, + ); + name = "Compile Java"; + passBuildSettingsInEnvironment = 1; + productName = "Compile Java"; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* Assemble Application */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */; + buildPhases = ( + 89D0F0440F393070007831A7 /* Copy Executable */, + 89D0F11F0F394189007831A7 /* Copy Java Resources */, + 8D1107290486CEB800E47090 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Assemble Application"; + productInstallPath = "$(HOME)/Applications"; + productName = pmdefaults; + productReference = 8D1107320486CEB800E47090 /* PmDefaults.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "pm_mac" */; + compatibilityVersion = "Xcode 3.0"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* pmdefaults */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 3D634CAB1247805C0020F829 /* JPortMidiHeaders */, + 89D0F1C90F3B704E007831A7 /* PmDefaults */, + 3DE2142D124662AA0033C839 /* CopyJavaSources */, + 89D0F0480F393A6F007831A7 /* Compile Java */, + 8D1107260486CEB800E47090 /* Assemble Application */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3DE216951246D57A0033C839 /* pmdefaults.icns in Resources */, + 89D0F0240F392F20007831A7 /* InfoPlist.strings in Resources */, + 89C3F2920F5250A300B0048E /* Credits.rtf in Resources */, + 3DE2137F124653FB0033C839 /* portmusic_logo.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3D634CAA1247805C0020F829 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo BUILT_PRODUCTS_DIR is ${BUILT_PRODUCTS_DIR}\njavah -classpath \"${BUILT_PRODUCTS_DIR}/pmdefaults.jar\" -force -o \"${BUILT_PRODUCTS_DIR}/jportmidi_JportMidiApi.h\" \"jportmidi.JPortMidiApi\"\nmv \"${BUILT_PRODUCTS_DIR}/jportmidi_JportMidiApi.h\" ../pm_java/pmjni/\necho \"Created ../pm_java/pmjni/jportmidi_JportMidiApi.h\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3D634CB0124781580020F829 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 89D0F1C90F3B704E007831A7 /* PmDefaults */; + targetProxy = 3D634CAF124781580020F829 /* PBXContainerItemProxy */; + }; + 3DE21431124662C50033C839 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3DE2142D124662AA0033C839 /* CopyJavaSources */; + targetProxy = 3DE21430124662C50033C839 /* PBXContainerItemProxy */; + }; + 3DE2145E124666900033C839 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3DE2142D124662AA0033C839 /* CopyJavaSources */; + targetProxy = 3DE2145D124666900033C839 /* PBXContainerItemProxy */; + }; + 89D0F1CD0F3B7062007831A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D1107260486CEB800E47090 /* Assemble Application */; + targetProxy = 89D0F1CC0F3B7062007831A7 /* PBXContainerItemProxy */; + }; + 89D0F1D10F3B7062007831A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 89D0F0480F393A6F007831A7 /* Compile Java */; + targetProxy = 89D0F1D00F3B7062007831A7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 89C3F2900F5250A300B0048E /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 89C3F2910F5250A300B0048E /* English */, + ); + name = Credits.rtf; + sourceTree = "<group>"; + }; + 89D0F0210F392F20007831A7 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 89D0F0220F392F20007831A7 /* English */, + ); + name = InfoPlist.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3D634CAC1247805C0020F829 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = JPortMidiHeaders; + }; + name = Debug; + }; + 3D634CAD1247805C0020F829 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = JPortMidiHeaders; + ZERO_LINK = NO; + }; + name = Release; + }; + 3DE2142E124662AB0033C839 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = CopyJavaSources; + }; + name = Debug; + }; + 3DE2142F124662AB0033C839 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = CopyJavaSources; + ZERO_LINK = NO; + }; + name = Release; + }; + 89D0F0490F393A6F007831A7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = pmdefaults; + SRCROOT = ./pmdefaults; + }; + name = Debug; + }; + 89D0F04A0F393A6F007831A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = pmdefaults; + SRCROOT = ./pmdefaults; + }; + name = Release; + }; + 89D0F1CA0F3B704F007831A7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = pmdefaults; + }; + name = Debug; + }; + 89D0F1CB0F3B704F007831A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = pmdefaults; + }; + name = Release; + }; + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = pmdefaults/resources/Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = pmdefaults; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + INFOPLIST_FILE = pmdefaults/resources/Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = PmDefaults; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; + ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; + ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3D634CAE1247807A0020F829 /* Build configuration list for PBXAggregateTarget "JPortMidiHeaders" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3D634CAC1247805C0020F829 /* Debug */, + 3D634CAD1247805C0020F829 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3DE21434124662FF0033C839 /* Build configuration list for PBXAggregateTarget "CopyJavaSources" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3DE2142E124662AB0033C839 /* Debug */, + 3DE2142F124662AB0033C839 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 89D0F04B0F393AB7007831A7 /* Build configuration list for PBXLegacyTarget "Compile Java" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 89D0F0490F393A6F007831A7 /* Debug */, + 89D0F04A0F393A6F007831A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 89D0F1D20F3B7080007831A7 /* Build configuration list for PBXAggregateTarget "PmDefaults" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 89D0F1CA0F3B704F007831A7 /* Debug */, + 89D0F1CB0F3B704F007831A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Assemble Application" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "pm_mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/pd/portmidi/pm_mac/pmdefaults/make/build.xml b/pd/portmidi/pm_mac/pmdefaults/make/build.xml new file mode 100644 index 000000000..bd08c6820 --- /dev/null +++ b/pd/portmidi/pm_mac/pmdefaults/make/build.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="pmdefaults" default="jar" basedir=".."> + + <!-- Global Properties --> + <property environment="env"/> + + + <!-- building in Xcode --> + <condition property="product" value="${env.PRODUCT_NAME}"> + <isset property="env.PRODUCT_NAME"/> + </condition> + + <condition property="src" value="${env.SRCROOT}/src"> + <isset property="env.SRCROOT"/> + </condition> + + <condition property="obj" value="${env.OBJECT_FILE_DIR}"> + <isset property="env.OBJECT_FILE_DIR"/> + </condition> + + <condition property="dst" value="${env.BUILT_PRODUCTS_DIR}"> + <isset property="env.BUILT_PRODUCTS_DIR"/> + </condition> + + + <!-- building from the command line --> + <condition property="src" value="src"> + <not> + <isset property="src"/> + </not> + </condition> + + <condition property="obj" value="build/obj"> + <not> + <isset property="obj"/> + </not> + </condition> + + <condition property="dst" value="build"> + <not> + <isset property="dst"/> + </not> + </condition> + + <condition property="product" value="pmdefaults"> + <not> + <isset property="product"/> + </not> + </condition> + + + <!-- Targets --> + <target name="init" description="Create build directories"> + <mkdir dir="${obj}/${product}"/> + <mkdir dir="${dst}"/> + </target> + + <target name="compile" depends="init" description="Compile"> + <javac destdir="${obj}/${product}" deprecation="on" source="1.5" target="1.5" fork="true" debug="true" debuglevel="lines,source"> + <src path="${src}/java"/> + <classpath path="${src}/../lib/eawt-stubs.jar"/> + </javac> + </target> + + <target name="copy" depends="init" description="Copy resources"> + + </target> + + <target name="jar" depends="compile, copy" description="Assemble Jar file"> + <jar jarfile="${dst}/${product}.jar" basedir="${obj}/${product}" manifest="resources/Manifest" index="true"/> + </target> + + <target name="install" depends="jar" description="Alias for 'jar'"> + <!-- sent by Xcode --> + </target> + + <target name="clean" description="Removes build directories"> + <!-- sent by Xcode --> + <delete dir="${obj}/${product}"/> + <delete file="${dst}/${product}.jar"/> + </target> + + <target name="installhdrs" description=""> + <!-- sent by Xcode --> + <echo>"Nothing to do for install-headers phase"</echo> + </target> +</project> diff --git a/pd/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh b/pd/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh new file mode 100755 index 000000000..2217580d0 --- /dev/null +++ b/pd/portmidi/pm_mac/pmdefaults/make/find-classrefs.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +# Prints all class references made by all classes in a Jar file +# Depends on the output formatting of javap + +# create a temporary working directory +dir=`mktemp -d $TMPDIR/classrefs.XXXXXX` + +asm_dump="$dir/asm_dump" +all_classes="$dir/all_classes" + +# for each class in a Jar file, dump the full assembly +javap -c -classpath "$1" `/usr/bin/jar tf "$1" | grep "\.class" | sort | xargs | sed -e 's/\.class//g'` > $asm_dump + +# dump the initial list of all classes in the Jar file +/usr/bin/jar tf $1 | grep "\.class" | sed -e 's/\.class//g' >> $all_classes + +# dump all static class references +cat $asm_dump | grep //class | awk -F"//class " '{print $2}' | sort | uniq >> $all_classes + +# dump all references to classes made in methods +cat $asm_dump | grep //Method | awk -F"//Method " '{print $2}' | sort | uniq | grep "\." | awk -F"." '{print $1}' | sort | uniq >> $all_classes + +# dump all references to classes by direct field access +cat $asm_dump | grep //Field | awk -F"//Field " '{print $2}' | sort | uniq | grep "\:L" | awk -F"\:L" '{print $2}' | sort | uniq | awk -F"\;" '{print $1}' >> $all_classes + +# sort and reformat +sort $all_classes | uniq | grep -v "\"" | sed -e 's/\//\./g' + +# cleanup +rm -rf $dir diff --git a/pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf b/pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf new file mode 100644 index 000000000..18f83781e --- /dev/null +++ b/pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/Credits.rtf @@ -0,0 +1,14 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Author: +\b0 \ + Roger B. Dannenberg\ +\ + +\b With special thanks to: +\b0 \ + National Science Foundation\ +} \ No newline at end of file diff --git a/pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings b/pd/portmidi/pm_mac/pmdefaults/resources/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..c7e5600f98a243b56851ce705e364d2712c690f9 GIT binary patch literal 220 zcmYk0%?`mp6h_b5Q%t%P@wXMLZb+~o9-wGxP)&=3H}aA=x{}F!cjmj_J-MHEk2ZlB z7q%pv$a#{o)4N+MYMl#(HCQus>M!%%rEKywSKXuON0VyPqvct!V#1BH+=8Y3L~g>y xsgzhk=|m-e&!J(A<wU&H*j(jQYA;s<bM@r;?Gjk4`QL_DNge$meFol$5nuOnCrJPR literal 0 HcmV?d00001 diff --git a/pd/portmidi/pm_mac/pmdefaults/resources/Info.plist b/pd/portmidi/pm_mac/pmdefaults/resources/Info.plist new file mode 100644 index 000000000..58bedb450 --- /dev/null +++ b/pd/portmidi/pm_mac/pmdefaults/resources/Info.plist @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>JavaApplicationStub</string> + <key>CFBundleIconFile</key> + <string>pmdefaults.icns</string> + <key>CFBundleIdentifier</key> + <string></string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>PmDefaults</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>Java</key> + <dict> + <key>ClassPath</key> + <string>$JAVAROOT/pmdefaults.jar</string> + <key>JVMVersion</key> + <string>1.5+</string> + <key>MainClass</key> + <string>pmdefaults.PmDefaults</string> + <key>Properties</key> + <dict> + <key>apple.laf.useScreenMenuBar</key> + <string>true</string> + </dict> + </dict> +</dict> +</plist> diff --git a/pd/portmidi/pm_mac/pmdefaults/resources/Manifest b/pd/portmidi/pm_mac/pmdefaults/resources/Manifest new file mode 100644 index 000000000..5dee9b0dc --- /dev/null +++ b/pd/portmidi/pm_mac/pmdefaults/resources/Manifest @@ -0,0 +1 @@ +Main-Class: pmdefaults/PmDefaults diff --git a/pd/portmidi/pm_mac/pmmac.c b/pd/portmidi/pm_mac/pmmac.c old mode 100644 new mode 100755 index fbf31c83d..13ac68300 --- a/pd/portmidi/pm_mac/pmmac.c +++ b/pd/portmidi/pm_mac/pmmac.c @@ -11,27 +11,44 @@ non-CoreMIDI devices. #include "stdlib.h" #include "portmidi.h" +#include "pmutil.h" +#include "pminternal.h" #include "pmmacosxcm.h" -PmError pm_init() +PmDeviceID pm_default_input_device_id = -1; +PmDeviceID pm_default_output_device_id = -1; + +void pm_init() { - return pm_macosxcm_init(); + PmError err = pm_macosxcm_init(); + // this is set when we return to Pm_Initialize, but we need it + // now in order to (successfully) call Pm_CountDevices() + pm_initialized = TRUE; + if (!err) { + pm_default_input_device_id = find_default_device( + "/PortMidi/PM_RECOMMENDED_INPUT_DEVICE", TRUE, + pm_default_input_device_id); + pm_default_output_device_id = find_default_device( + "/PortMidi/PM_RECOMMENDED_OUTPUT_DEVICE", FALSE, + pm_default_output_device_id); + } } + void pm_term(void) { pm_macosxcm_term(); } -PmDeviceID pm_default_input_device_id = -1; -PmDeviceID pm_default_output_device_id = -1; PmDeviceID Pm_GetDefaultInputDeviceID() { + Pm_Initialize(); return pm_default_input_device_id; } PmDeviceID Pm_GetDefaultOutputDeviceID() { + Pm_Initialize(); return pm_default_output_device_id; } diff --git a/pd/portmidi/pm_mac/pmmac.h b/pd/portmidi/pm_mac/pmmac.h old mode 100644 new mode 100755 diff --git a/pd/portmidi/pm_mac/pmmacosxcm.c b/pd/portmidi/pm_mac/pmmacosxcm.c old mode 100644 new mode 100755 index 4971da1b6..78513573d --- a/pd/portmidi/pm_mac/pmmacosxcm.c +++ b/pd/portmidi/pm_mac/pmmacosxcm.c @@ -26,9 +26,7 @@ //#define CM_DEBUG 1 #include "portmidi.h" -#ifdef NEWBUFFER #include "pmutil.h" -#endif #include "pminternal.h" #include "porttime.h" #include "pmmac.h" @@ -40,17 +38,34 @@ #include <CoreServices/CoreServices.h> #include <CoreMIDI/MIDIServices.h> #include <CoreAudio/HostTime.h> +#include <unistd.h> #define PACKET_BUFFER_SIZE 1024 +/* maximum overall data rate (OS X limit is 15000 bytes/second) */ +#define MAX_BYTES_PER_S 14000 + +/* Apple reports that packets are dropped when the MIDI bytes/sec + exceeds 15000. This is computed by "tracking the number of MIDI + bytes scheduled into 1-second buckets over the last six seconds + and averaging these counts." + + This is apparently based on timestamps, not on real time, so + we have to avoid constructing packets that schedule high speed + output even if the actual writes are delayed (which was my first + solution). + + The LIMIT_RATE symbol, if defined, enables code to modify + timestamps as follows: + After each packet is formed, the next allowable timestamp is + computed as this_packet_time + this_packet_len * delay_per_byte -/* this is very strange: if I put in a reasonable - number here, e.g. 128, which would allow sysex data - to be sent 128 bytes at a time, then I lose sysex - data in my loopback test. With a buffer size of 4, - we put at most 4 bytes in a packet (but maybe many - packets in a packetList), and everything works fine. + This is the minimum timestamp allowed in the next packet. + + Note that this distorts accurate timestamps somewhat. */ -#define SYSEX_BUFFER_SIZE 4 +#define LIMIT_RATE 1 + +#define SYSEX_BUFFER_SIZE 128 #define VERBOSE_ON 1 #define VERBOSE if (VERBOSE_ON) @@ -59,21 +74,29 @@ #define MIDI_EOX 0xf7 #define MIDI_STATUS_MASK 0x80 -static MIDIClientRef client = NULL; /* Client handle to the MIDI server */ -static MIDIPortRef portIn = NULL; /* Input port handle */ -static MIDIPortRef portOut = NULL; /* Output port handle */ +// "Ref"s are pointers on 32-bit machines and ints on 64 bit machines +// NULL_REF is our representation of either 0 or NULL +#ifdef __LP64__ +#define NULL_REF 0 +#else +#define NULL_REF NULL +#endif + +static MIDIClientRef client = NULL_REF; /* Client handle to the MIDI server */ +static MIDIPortRef portIn = NULL_REF; /* Input port handle */ +static MIDIPortRef portOut = NULL_REF; /* Output port handle */ extern pm_fns_node pm_macosx_in_dictionary; extern pm_fns_node pm_macosx_out_dictionary; typedef struct midi_macosxcm_struct { - unsigned long sync_time; /* when did we last determine delta? */ + PmTimestamp sync_time; /* when did we last determine delta? */ UInt64 delta; /* difference between stream time and real time in ns */ - UInt64 last_time; /* last output time */ + UInt64 last_time; /* last output time in host units*/ int first_message; /* tells midi_write to sychronize timestamps */ int sysex_mode; /* middle of sending sysex */ - unsigned long sysex_word; /* accumulate data when receiving sysex */ - unsigned int sysex_byte_count; /* count how many received */ + uint32_t sysex_word; /* accumulate data when receiving sysex */ + uint32_t sysex_byte_count; /* count how many received */ char error[PM_HOST_ERROR_MSG_LEN]; char callback_error[PM_HOST_ERROR_MSG_LEN]; Byte packetBuffer[PACKET_BUFFER_SIZE]; @@ -83,7 +106,12 @@ typedef struct midi_macosxcm_struct { MIDITimeStamp sysex_timestamp; /* timestamp to use with sysex data */ /* allow for running status (is running status possible here? -rbd): -cpr */ unsigned char last_command; - long last_msg_length; + int32_t last_msg_length; + /* limit midi data rate (a CoreMidi requirement): */ + UInt64 min_next_time; /* when can the next send take place? */ + int byte_count; /* how many bytes in the next packet list? */ + Float64 us_per_host_tick; /* host clock frequency, units of min_next_time */ + UInt64 host_ticks_per_byte; /* host clock units per byte at maximum rate */ } midi_macosxcm_node, *midi_macosxcm_type; /* private function declarations */ @@ -94,7 +122,7 @@ char* cm_get_full_endpoint_name(MIDIEndpointRef endpoint); static int -midi_length(long msg) +midi_length(int32_t msg) { int status, high, low; static int high_lengths[] = { @@ -102,7 +130,7 @@ midi_length(long msg) 3, 3, 3, 3, 2, 2, 3, 1 /* 0x80 through 0xf0 */ }; static int low_lengths[] = { - 1, 1, 3, 2, 1, 1, 1, 1, /* 0xf0 through 0xf8 */ + 1, 2, 3, 2, 1, 1, 1, 1, /* 0xf0 through 0xf8 */ 1, 1, 1, 1, 1, 1, 1, 1 /* 0xf9 through 0xff */ }; @@ -110,7 +138,7 @@ midi_length(long msg) high = status >> 4; low = status & 15; - return (high != 0xF0) ? high_lengths[high] : low_lengths[low]; + return (high != 0xF) ? high_lengths[high] : low_lengths[low]; } static PmTimestamp midi_synchronize(PmInternal *midi) @@ -237,7 +265,7 @@ readProc(const MIDIPacketList *newPackets, void *refCon, void *connRefCon) PmEvent event; MIDIPacket *packet; unsigned int packetIndex; - unsigned long now; + uint32_t now; unsigned int status; #ifdef CM_DEBUG @@ -262,9 +290,9 @@ readProc(const MIDIPacketList *newPackets, void *refCon, void *connRefCon) packet->length); */ for (packetIndex = 0; packetIndex < newPackets->numPackets; packetIndex++) { /* Set the timestamp and dispatch this message */ - event.timestamp = + event.timestamp = (PmTimestamp) /* explicit conversion */ ( (AudioConvertHostTimeToNanos(packet->timeStamp) - m->delta) / - (UInt64) 1000000; + (UInt64) 1000000); status = packet->data[0]; /* process packet as sysex data if it begins with MIDI_SYSEX, or MIDI_EOX or non-status byte with no running status */ @@ -305,9 +333,8 @@ midi_in_open(PmInternal *midi, void *driverInfo) /* time_get does not take a parameter, so coerce */ midi->time_proc = (PmTimeProcPtr) Pt_Time; } - - endpoint = (MIDIEndpointRef) descriptors[midi->device_id].descriptor; - if (endpoint == NULL) { + endpoint = (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor; + if (endpoint == NULL_REF) { return pmInvalidDeviceId; } @@ -335,7 +362,7 @@ midi_in_open(PmInternal *midi, void *driverInfo) pm_hosterror = macHostError; sprintf(pm_hosterror_text, "Host error %ld: MIDIPortConnectSource() in midi_in_open()", - macHostError); + (long) macHostError); midi->descriptor = NULL; pm_free(m); return pmHostError; @@ -355,8 +382,8 @@ midi_in_close(PmInternal *midi) if (!m) return pmBadPtr; - endpoint = (MIDIEndpointRef) descriptors[midi->device_id].descriptor; - if (endpoint == NULL) { + endpoint = (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor; + if (endpoint == NULL_REF) { pm_hosterror = pmBadPtr; } @@ -366,7 +393,7 @@ midi_in_close(PmInternal *midi) pm_hosterror = macHostError; sprintf(pm_hosterror_text, "Host error %ld: MIDIPortDisconnectSource() in midi_in_close()", - macHostError); + (long) macHostError); err = pmHostError; } @@ -400,7 +427,11 @@ midi_out_open(PmInternal *midi, void *driverInfo) m->packet = NULL; m->last_command = 0; m->last_msg_length = 0; - + m->min_next_time = 0; + m->byte_count = 0; + m->us_per_host_tick = 1000000.0 / AudioGetHostClockFrequency(); + m->host_ticks_per_byte = (UInt64) (1000000.0 / + (m->us_per_host_tick * MAX_BYTES_PER_S)); return pmNoError; } @@ -420,7 +451,18 @@ midi_out_close(PmInternal *midi) static PmError midi_abort(PmInternal *midi) { - return pmNoError; + PmError err = pmNoError; + OSStatus macHostError; + MIDIEndpointRef endpoint = + (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor; + macHostError = MIDIFlushOutput(endpoint); + if (macHostError != noErr) { + pm_hosterror = macHostError; + sprintf(pm_hosterror_text, + "Host error %ld: MIDIFlushOutput()", (long) macHostError); + err = pmHostError; + } + return err; } @@ -430,13 +472,22 @@ midi_write_flush(PmInternal *midi, PmTimestamp timestamp) OSStatus macHostError; midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor; MIDIEndpointRef endpoint = - (MIDIEndpointRef) descriptors[midi->device_id].descriptor; + (MIDIEndpointRef) (long) descriptors[midi->device_id].descriptor; assert(m); assert(endpoint); if (m->packet != NULL) { /* out of space, send the buffer and start refilling it */ + /* before we can send, maybe delay to limit data rate. OS X allows + * 15KB/s. */ + UInt64 now = AudioGetCurrentHostTime(); + if (now < m->min_next_time) { + usleep((useconds_t) + ((m->min_next_time - now) * m->us_per_host_tick)); + } macHostError = MIDISend(portOut, endpoint, m->packetList); m->packet = NULL; /* indicate no data in packetList now */ + m->min_next_time = now + m->byte_count * m->host_ticks_per_byte; + m->byte_count = 0; if (macHostError != noErr) goto send_packet_error; } return pmNoError; @@ -445,7 +496,7 @@ send_packet_error: pm_hosterror = macHostError; sprintf(pm_hosterror_text, "Host error %ld: MIDISend() in midi_write()", - macHostError); + (long) macHostError); return pmHostError; } @@ -459,15 +510,21 @@ send_packet(PmInternal *midi, Byte *message, unsigned int messageLength, midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor; assert(m); - /* printf("add %d to packet %lx len %d\n", message[0], m->packet, messageLength); */ + /* printf("add %d to packet %p len %d\n", message[0], m->packet, messageLength); */ m->packet = MIDIPacketListAdd(m->packetList, sizeof(m->packetBuffer), m->packet, timestamp, messageLength, message); + m->byte_count += messageLength; if (m->packet == NULL) { /* out of space, send the buffer and start refilling it */ /* make midi->packet non-null to fool midi_write_flush into sending */ m->packet = (MIDIPacket *) 4; - if ((err = midi_write_flush(midi, timestamp)) != pmNoError) return err; + /* timestamp is 0 because midi_write_flush ignores timestamp since + * timestamps are already in packets. The timestamp parameter is here + * because other API's need it. midi_write_flush can be called + * from system-independent code that must be cross-API. + */ + if ((err = midi_write_flush(midi, 0)) != pmNoError) return err; m->packet = MIDIPacketListInit(m->packetList); assert(m->packet); /* if this fails, it's a programming error */ m->packet = MIDIPacketListAdd(m->packetList, sizeof(m->packetBuffer), @@ -482,8 +539,8 @@ send_packet(PmInternal *midi, Byte *message, unsigned int messageLength, static PmError midi_write_short(PmInternal *midi, PmEvent *event) { - long when = event->timestamp; - long what = event->message; + PmTimestamp when = event->timestamp; + PmMessage what = event->message; MIDITimeStamp timestamp; UInt64 when_ns; midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor; @@ -502,9 +559,6 @@ midi_write_short(PmInternal *midi, PmEvent *event) /* if latency == 0, midi->now is not valid. We will just set it to zero */ if (midi->latency == 0) when = 0; when_ns = ((UInt64) (when + midi->latency) * (UInt64) 1000000) + m->delta; - /* make sure we don't go backward in time */ - if (when_ns < m->last_time) when_ns = m->last_time; - m->last_time = when_ns; timestamp = (MIDITimeStamp) AudioConvertNanosToHostTime(when_ns); message[0] = Pm_MessageStatus(what); @@ -512,6 +566,15 @@ midi_write_short(PmInternal *midi, PmEvent *event) message[2] = Pm_MessageData2(what); messageLength = midi_length(what); + /* make sure we go foreward in time */ + if (timestamp < m->min_next_time) timestamp = m->min_next_time; + + #ifdef LIMIT_RATE + if (timestamp < m->last_time) + timestamp = m->last_time; + m->last_time = timestamp + messageLength * m->host_ticks_per_byte; + #endif + /* Add this message to the packet list */ return send_packet(midi, message, messageLength, timestamp); } @@ -549,16 +612,18 @@ midi_end_sysex(PmInternal *midi, PmTimestamp when) midi_macosxcm_type m = (midi_macosxcm_type) midi->descriptor; assert(m); - /* make sure we don't go backward in time */ - if (m->sysex_timestamp < m->last_time) m->sysex_timestamp = m->last_time; + /* make sure we go foreward in time */ + if (m->sysex_timestamp < m->min_next_time) + m->sysex_timestamp = m->min_next_time; + + #ifdef LIMIT_RATE + if (m->sysex_timestamp < m->last_time) + m->sysex_timestamp = m->last_time; + m->last_time = m->sysex_timestamp + m->sysex_byte_count * + m->host_ticks_per_byte; + #endif - /* if flush has been called in the meantime, packet list is NULL */ - if (m->packet == NULL) { - m->packet = MIDIPacketListInit(m->packetList); - assert(m->packet); - } - - /* now send what's in the buffer */ + /* now send what's in the buffer */ err = send_packet(midi, m->sysex_buffer, m->sysex_byte_count, m->sysex_timestamp); m->sysex_byte_count = 0; @@ -656,9 +721,9 @@ CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal) CFRelease(str); } - MIDIEntityRef entity = NULL; + MIDIEntityRef entity = NULL_REF; MIDIEndpointGetEntity(endpoint, &entity); - if (entity == NULL) + if (entity == NULL_REF) // probably virtual return result; @@ -672,13 +737,17 @@ CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal) } } // now consider the device's name - MIDIDeviceRef device = NULL; + MIDIDeviceRef device = NULL_REF; MIDIEntityGetDevice(entity, &device); - if (device == NULL) + if (device == NULL_REF) return result; str = NULL; MIDIObjectGetStringProperty(device, kMIDIPropertyName, &str); + if (CFStringGetLength(result) == 0) { + CFRelease(result); + return str; + } if (str != NULL) { // if an external device has only one entity, throw away // the endpoint name and just use the device name @@ -686,6 +755,10 @@ CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal) CFRelease(result); return str; } else { + if (CFStringGetLength(str) == 0) { + CFRelease(str); + return result; + } // does the entity name already start with the device name? // (some drivers do this though they shouldn't) // if so, do not prepend @@ -703,6 +776,7 @@ CFStringRef EndpointName(MIDIEndpointRef endpoint, bool isExternal) return result; } + // Obtain the name of an endpoint, following connections. // The result should be released by the caller. static CFStringRef ConnectedEndpointName(MIDIEndpointRef endpoint) @@ -710,17 +784,17 @@ static CFStringRef ConnectedEndpointName(MIDIEndpointRef endpoint) CFMutableStringRef result = CFStringCreateMutable(NULL, 0); CFStringRef str; OSStatus err; - int i; + long i; // Does the endpoint have connections? CFDataRef connections = NULL; - int nConnected = 0; + long nConnected = 0; bool anyStrings = false; err = MIDIObjectGetDataProperty(endpoint, kMIDIPropertyConnectionUniqueID, &connections); if (connections != NULL) { // It has connections, follow them // Concatenate the names of all connected devices - nConnected = CFDataGetLength(connections) / sizeof(MIDIUniqueID); + nConnected = CFDataGetLength(connections) / (int32_t) sizeof(MIDIUniqueID); if (nConnected) { const SInt32 *pid = (const SInt32 *)(CFDataGetBytePtr(connections)); for (i = 0; i < nConnected; ++i, ++pid) { @@ -889,7 +963,7 @@ PmError pm_macosxcm_init(void) /* Iterate over the MIDI input devices */ for (i = 0; i < numInputs; i++) { endpoint = MIDIGetSource(i); - if (endpoint == NULL) { + if (endpoint == NULL_REF) { continue; } @@ -899,13 +973,13 @@ PmError pm_macosxcm_init(void) /* Register this device with PortMidi */ pm_add_device("CoreMIDI", cm_get_full_endpoint_name(endpoint), - TRUE, (void*)endpoint, &pm_macosx_in_dictionary); + TRUE, (void *) (long) endpoint, &pm_macosx_in_dictionary); } /* Iterate over the MIDI output devices */ for (i = 0; i < numOutputs; i++) { endpoint = MIDIGetDestination(i); - if (endpoint == NULL) { + if (endpoint == NULL_REF) { continue; } @@ -915,20 +989,22 @@ PmError pm_macosxcm_init(void) /* Register this device with PortMidi */ pm_add_device("CoreMIDI", cm_get_full_endpoint_name(endpoint), - FALSE, (void*)endpoint, &pm_macosx_out_dictionary); + FALSE, (void *) (long) endpoint, + &pm_macosx_out_dictionary); } return pmNoError; error_return: pm_hosterror = macHostError; - sprintf(pm_hosterror_text, "Host error %ld: %s\n", macHostError, error_text); + sprintf(pm_hosterror_text, "Host error %ld: %s\n", (long) macHostError, + error_text); pm_macosxcm_term(); /* clear out any opened ports */ return pmHostError; } void pm_macosxcm_term(void) { - if (client != NULL) MIDIClientDispose(client); - if (portIn != NULL) MIDIPortDispose(portIn); - if (portOut != NULL) MIDIPortDispose(portOut); + if (client != NULL_REF) MIDIClientDispose(client); + if (portIn != NULL_REF) MIDIPortDispose(portIn); + if (portOut != NULL_REF) MIDIPortDispose(portOut); } diff --git a/pd/portmidi/pm_mac/pmmacosxcm.h b/pd/portmidi/pm_mac/pmmacosxcm.h old mode 100644 new mode 100755 index 172593595..97235b5dd --- a/pd/portmidi/pm_mac/pmmacosxcm.h +++ b/pd/portmidi/pm_mac/pmmacosxcm.h @@ -1,4 +1,6 @@ /* system-specific definitions */ PmError pm_macosxcm_init(void); -void pm_macosxcm_term(void); \ No newline at end of file +void pm_macosxcm_term(void); + +PmDeviceID find_default_device(char *path, int input, PmDeviceID id); diff --git a/pd/portmidi/pm_mac/readbinaryplist.c b/pd/portmidi/pm_mac/readbinaryplist.c new file mode 100644 index 000000000..bccd09518 --- /dev/null +++ b/pd/portmidi/pm_mac/readbinaryplist.c @@ -0,0 +1,1115 @@ +/* + +readbinaryplist.c -- Roger B. Dannenberg, Jun 2008 +Based on ReadBinaryPList.m by Jens Ayton, 2007 + +Note that this code is intended to read preference files and has an upper +bound on file size (currently 100MB) and assumes in some places that 32 bit +offsets are sufficient. + +Here are his comments: + +Reader for binary property list files (version 00). + +This has been found to work on all 566 binary plists in my ~/Library/Preferences/ +and /Library/Preferences/ directories. This probably does not provide full +test coverage. It has also been found to provide different data to Apple's +implementation when presented with a key-value archive. This is because Apple's +implementation produces undocumented CFKeyArchiverUID objects. My implementation +produces dictionaries instead, matching the in-file representation used in XML +and OpenStep plists. See extract_uid(). + +Full disclosure: in implementing this software, I read one comment and one +struct defintion in CFLite, Apple's implementation, which is under the APSL +license. I also deduced the information about CFKeyArchiverUID from that code. +However, none of the implementation was copied. + +Copyright (C) 2007 Jens Ayton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +/* A note about memory management: +Strings and possibly other values are unique and because the values +associated with IDs are cached, you end up with a directed graph rather +than a tree. It is tricky to free the data because if you do a simple +depth-first search to free nodes, you will free nodes twice. I decided +to allocate memory from blocks of 1024 bytes and keep the blocks in a +list associated with but private to this module. So the user should +access this module by calling: + bplist_read_file() or bplist_read_user_pref() or + bplist_read_system_pref() +which returns a value. When you are done with the value, call + bplist_free_data() +This will of course free the value_ptr returned by bplist_read_*() + +To deal with memory exhaustion (what happens when malloc returns +NULL?), use setjmp/longjmp -- a single setjmp protects the whole +parser, and allocate uses longjmp to abort. After abort, memory +is freed and NULL is returned to caller. There is not much here +in the way of error reporting. + +Memory is obtained by calling allocate which either returns the +memory requested or calls longjmp, so callers don't have to check. + +*/ + +#include <sys/types.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <stdio.h> +#include <sys/stat.h> +#include "readbinaryplist.h" +#include <Carbon/Carbon.h> + +#define NO 0 +#define YES 1 +#define BOOL int + +#define MAXPATHLEN 256 + +/* there are 2 levels of error logging/printing: + * BPLIST_LOG and BPLIST_LOG_VERBOSE + * either or both can be set to non-zero to turn on + * If BPLIST_LOG_VERBOSE is true, then BPLIST_LOG + * is also true. + * + * In the code, logging is done by calling either + * bplist_log() or bplist_log_verbose(), which take + * parameters like printf but might be a no-op. + */ + +/* #define BPLIST_LOG_VERBOSE 1 */ + +#if BPLIST_LOG_VERBOSE + #ifndef BPLIST_LOG + #define BPLIST_LOG 1 + #endif +#endif + +#if BPLIST_LOG + #define bplist_log printf +#else + #define bplist_log(...) +#endif + +#if BPLIST_LOG_VERBOSE + #define bplist_log_verbose bplist_log +#else + #define bplist_log_verbose(...) +#endif + + +/********* MEMORY MANAGEMENT ********/ +#define BLOCK_SIZE 1024 +// memory is aligned to multiples of this; assume malloc automatically +// aligns to this number and assume this number is > sizeof(void *) +#define ALIGNMENT 8 +static void *block_list = NULL; +static char *free_ptr = NULL; +static char *end_ptr = NULL; +static jmp_buf abort_parsing; + +static void *allocate(size_t size) +{ + void *result; + if (free_ptr + size > end_ptr) { + size_t how_much = BLOCK_SIZE; + // align everything to 8 bytes + if (size > BLOCK_SIZE - ALIGNMENT) { + how_much = size + ALIGNMENT; + } + result = malloc(how_much); + if (result == NULL) { + /* serious problem */ + longjmp(abort_parsing, 1); + } + *((void **)result) = block_list; + block_list = result; + free_ptr = ((char *) result) + ALIGNMENT; + end_ptr = ((char *) result) + how_much; + } + // now, there is enough rooom at free_ptr + result = free_ptr; + free_ptr += size; + return result; +} + +void bplist_free_data() +{ + while (block_list) { + void *next = *(void **)block_list; + free(block_list); + block_list = next; + } + free_ptr = NULL; + end_ptr = NULL; +} + +// layout of trailer -- last 32 bytes in plist data + uint8_t unused[6]; + uint8_t offset_int_size; + uint8_t object_ref_size; + uint64_t object_count; + uint64_t top_level_object; + uint64_t offset_table_offset; + + +enum +{ + kHEADER_SIZE = 8, + kTRAILER_SIZE = 32, //sizeof(bplist_trailer_node), + kMINIMUM_SANE_SIZE = kHEADER_SIZE + kTRAILER_SIZE +}; + + +static const char kHEADER_BYTES[kHEADER_SIZE] = "bplist00"; + +// map from UID key to previously parsed value +typedef struct cache_struct { + uint64_t key; + value_ptr value; + struct cache_struct *next; +} cache_node, *cache_ptr; + + +typedef struct bplist_info +{ + uint64_t object_count; + const uint8_t *data_bytes; + uint64_t length; + uint64_t offset_table_offset; + uint8_t offset_int_size; + uint8_t object_ref_size; + cache_ptr cache; +} bplist_info_node, *bplist_info_ptr; + + +static value_ptr bplist_read_pldata(pldata_ptr data); +static value_ptr bplist_read_pref(char *filename, OSType folder_type); +static uint64_t read_sized_int(bplist_info_ptr bplist, uint64_t offset, uint8_t size); +static uint64_t read_offset(bplist_info_ptr bplist, uint64_t index); +static BOOL read_self_sized_int(bplist_info_ptr bplist, uint64_t offset, uint64_t *outValue, size_t *outSize); + +static value_ptr extract_object(bplist_info_ptr bplist, uint64_t objectRef); +static value_ptr extract_simple(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_int(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_real(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_date(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_data(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_ascii_string(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_unicode_string(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_uid(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset); +static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset); + + +value_ptr value_create() +{ + value_ptr value = (value_ptr) allocate(sizeof(value_node)); + return value; +} + + +void value_set_integer(value_ptr v, int64_t i) { + v->tag = kTAG_INT; v->integer = i; +} + +void value_set_real(value_ptr v, double d) { + v->tag = kTAG_REAL; v->real = d; +} + +// d is seconds since 1 January 2001 +void value_set_date(value_ptr v, double d) { + v->tag = kTAG_DATE; v->real = d; +} + +void value_set_ascii_string(value_ptr v, const uint8_t *s, size_t len) { + v->tag = kTAG_ASCIISTRING; + v->string = (char *) allocate(len + 1); + memcpy(v->string, s, len); + v->string[len] = 0; +} + +void value_set_unicode_string(value_ptr v, const uint8_t *s, size_t len) { + v->tag = kTAG_UNICODESTRING; + v->string = (char *) allocate(len + 1); + memcpy(v->string, s, len); + v->string[len] = 0; +} + +void value_set_uid(value_ptr v, uint64_t uid) +{ + v->tag = kTAG_UID; v->uinteger = uid; +} + +// v->data points to a pldata that points to the actual bytes +// the bytes are copied, so caller must free byte source (*data) +void value_set_data(value_ptr v, const uint8_t *data, size_t len) { + v->tag = kTAG_DATA; + pldata_ptr pldata = (pldata_ptr) allocate(sizeof(pldata_node)); + pldata->data = (uint8_t *) allocate(len); + memcpy(pldata->data, data, len); + pldata->len = len; + v->data = pldata; + printf("value at %p gets data at %p\n", v, pldata); +} + +// caller releases ownership of array to value_ptr v +void value_set_array(value_ptr v, value_ptr *array, size_t length) { + array_ptr a = (array_ptr) allocate(sizeof(array_node)); + a->array = array; + a->length = length; + v->tag = kTAG_ARRAY; + v->array = a; +} + +// caller releases ownership of dict to value_ptr v +void value_set_dict(value_ptr v, dict_ptr dict) { + v->tag = kTAG_DICTIONARY; + v->dict = dict; +} + + +// look up an objectref in the cache, a ref->value_ptr mapping +value_ptr cache_lookup(cache_ptr cache, uint64_t ref) +{ + while (cache) { + if (cache->key == ref) { + return cache->value; + } + cache = cache->next; + } + return NULL; +} + + +// insert an objectref and value in the cache +void cache_insert(cache_ptr *cache, uint64_t ref, value_ptr value) +{ + cache_ptr c = (cache_ptr) allocate(sizeof(cache_node)); + c->key = ref; + c->value = value; + c->next = *cache; + *cache = c; +} + + +// insert an objectref and value in a dictionary +void dict_insert(dict_ptr *dict, value_ptr key, value_ptr value) +{ + dict_ptr d = (dict_ptr) allocate(sizeof(dict_node)); + d->key = key; + d->value = value; + d->next = *dict; + *dict = d; +} + + +BOOL is_binary_plist(pldata_ptr data) +{ + if (data->len < kMINIMUM_SANE_SIZE) return NO; + return memcmp(data->data, kHEADER_BYTES, kHEADER_SIZE) == 0; +} + + +value_ptr bplist_read_file(char *filename) +{ + struct stat stbuf; + pldata_node pldata; + FILE *file; + size_t n; + value_ptr value; + int rslt = stat(filename, &stbuf); + if (rslt) { + #if BPLIST_LOG + perror("in stat"); + #endif + bplist_log("Could not stat %s, error %d\n", filename, rslt); + return NULL; + } + // if file is >100MB, assume it is not a preferences file and give up + if (stbuf.st_size > 100000000) { + bplist_log("Large file %s encountered (%llu bytes) -- not read\n", + filename, stbuf.st_size); + return NULL; + } + pldata.len = (size_t) stbuf.st_size; + // note: this is supposed to be malloc, not allocate. It is separate + // from the graph structure, large, and easy to free right after + // parsing. + pldata.data = (uint8_t *) malloc(pldata.len); + if (!pldata.data) { + bplist_log("Could not allocate %lu bytes for %s\n", + (unsigned long) pldata.len, filename); + return NULL; + } + file = fopen(filename, "rb"); + if (!file) { + bplist_log("Could not open %s\n", filename); + return NULL; + } + n = fread(pldata.data, 1, pldata.len, file); + if (n != pldata.len) { + bplist_log("Error reading from %s\n", filename); + return NULL; + } + value = bplist_read_pldata(&pldata); + free(pldata.data); + return value; +} + + +value_ptr bplist_read_pref(char *filename, OSType folder_type) +{ + FSRef prefdir; + char cstr[MAXPATHLEN]; + + OSErr err = FSFindFolder(kOnAppropriateDisk, folder_type, + FALSE, &prefdir); + if (err) { + bplist_log("Error finding preferences folder: %d\n", err); + return NULL; + } + err = FSRefMakePath(&prefdir, (UInt8 *) cstr, (UInt32) (MAXPATHLEN - 1)); + if (err) { + bplist_log("Error making path name for preferences folder: %d\n", err); + return NULL; + } + strlcat(cstr, "/", MAXPATHLEN); + strlcat(cstr, filename, MAXPATHLEN); + return bplist_read_file(cstr); +} + + +value_ptr bplist_read_system_pref(char *filename) { + return bplist_read_pref(filename, kSystemPreferencesFolderType); +} + + +value_ptr bplist_read_user_pref(char *filename) { + return bplist_read_pref(filename, kPreferencesFolderType); +} + + +// data is stored with high-order bytes first. +// read from plist data in a machine-independent fashion +// +uint64_t convert_uint64(uint8_t *ptr) +{ + uint64_t rslt = 0; + int i; + // shift in bytes, high-order first + for (i = 0; i < sizeof(uint64_t); i++) { + rslt <<= 8; + rslt += ptr[i]; + } + return rslt; +} + + +value_ptr bplist_read_pldata(pldata_ptr data) +{ + value_ptr result = NULL; + bplist_info_node bplist; + uint8_t *ptr; + uint64_t top_level_object; + int i; + + if (data == NULL) return NULL; + if (!is_binary_plist(data)) { + bplist_log("Bad binary plist: too short or invalid header.\n"); + return NULL; + } + + // read trailer + ptr = (uint8_t *) (data->data + data->len - kTRAILER_SIZE); + bplist.offset_int_size = ptr[6]; + bplist.object_ref_size = ptr[7]; + bplist.object_count = convert_uint64(ptr + 8); + top_level_object = convert_uint64(ptr + 16); + bplist.offset_table_offset = convert_uint64(ptr + 24); + + // Basic sanity checks + if (bplist.offset_int_size < 1 || bplist.offset_int_size > 8 || + bplist.object_ref_size < 1 || bplist.object_ref_size > 8 || + bplist.offset_table_offset < kHEADER_SIZE) { + bplist_log("Bad binary plist: trailer declared insane.\n"); + return NULL; + } + + // Ensure offset table is inside file + uint64_t offsetTableSize = bplist.offset_int_size * bplist.object_count; + if (offsetTableSize + bplist.offset_table_offset + kTRAILER_SIZE > + data->len) { + bplist_log("Bad binary plist: offset table overlaps end of container.\n"); + return NULL; + } + + bplist.data_bytes = data->data; + bplist.length = data->len; + bplist.cache = NULL; /* dictionary is empty */ + + bplist_log_verbose("Got a sane bplist with %llu items, offset_int_size: %u, object_ref_size: %u\n", + bplist.object_count, bplist.offset_int_size, + bplist.object_ref_size); + /* at this point, we are ready to do some parsing which allocates + memory for the result data structure. If memory allocation (using + allocate fails, a longjmp will return to here and we simply give up + */ + i = setjmp(abort_parsing); + if (i == 0) { + result = extract_object(&bplist, top_level_object); + } else { + bplist_log("allocate() failed to allocate memory. Giving up.\n"); + result = NULL; + } + if (!result) { + bplist_free_data(); + } + return result; +} + + +static value_ptr extract_object(bplist_info_ptr bplist, uint64_t objectRef) +{ + uint64_t offset; + value_ptr result = NULL; + uint8_t objectTag; + + if (objectRef >= bplist->object_count) { + // Out-of-range object reference. + bplist_log("Bad binary plist: object index is out of range.\n"); + return NULL; + } + + // Use cached object if it exists + result = cache_lookup(bplist->cache, objectRef); + if (result != NULL) return result; + + // Otherwise, find object in file. + offset = read_offset(bplist, objectRef); + if (offset > bplist->length) { + // Out-of-range offset. + bplist_log("Bad binary plist: object outside container.\n"); + return NULL; + } + objectTag = *(bplist->data_bytes + offset); + switch (objectTag & 0xF0) { + case kTAG_SIMPLE: + result = extract_simple(bplist, offset); + break; + + case kTAG_INT: + result = extract_int(bplist, offset); + break; + + case kTAG_REAL: + result = extract_real(bplist, offset); + break; + + case kTAG_DATE: + result = extract_date(bplist, offset); + break; + + case kTAG_DATA: + result = extract_data(bplist, offset); + break; + + case kTAG_ASCIISTRING: + result = extract_ascii_string(bplist, offset); + break; + + case kTAG_UNICODESTRING: + result = extract_unicode_string(bplist, offset); + break; + + case kTAG_UID: + result = extract_uid(bplist, offset); + break; + + case kTAG_ARRAY: + result = extract_array(bplist, offset); + break; + + case kTAG_DICTIONARY: + result = extract_dictionary(bplist, offset); + break; + + default: + // Unknown tag. + bplist_log("Bad binary plist: unknown tag 0x%X.\n", + (objectTag & 0x0F) >> 4); + result = NULL; + } + + // Cache and return result. + if (result != NULL) + cache_insert(&bplist->cache, objectRef, result); + return result; +} + + +static uint64_t read_sized_int(bplist_info_ptr bplist, uint64_t offset, + uint8_t size) +{ + assert(bplist->data_bytes != NULL && size >= 1 && size <= 8 && + offset + size <= bplist->length); + + uint64_t result = 0; + const uint8_t *byte = bplist->data_bytes + offset; + + do { + // note that ints seem to be high-order first + result = (result << 8) | *byte++; + } while (--size); + + return result; +} + + +static uint64_t read_offset(bplist_info_ptr bplist, uint64_t index) +{ + assert(index < bplist->object_count); + + return read_sized_int(bplist, + bplist->offset_table_offset + bplist->offset_int_size * index, + bplist->offset_int_size); +} + + +static BOOL read_self_sized_int(bplist_info_ptr bplist, uint64_t offset, + uint64_t *outValue, size_t *outSize) +{ + uint32_t size; + int64_t value; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + size = 1 << (bplist->data_bytes[offset] & 0x0F); + if (size > 8) { + // Maximum allowable size in this implementation is 1<<3 = 8 bytes. + // This also happens to be the biggest we can handle. + return NO; + } + + if (offset + 1 + size > bplist->length) { + // Out of range. + return NO; + } + + value = read_sized_int(bplist, offset + 1, size); + + if (outValue != NULL) *outValue = value; + if (outSize != NULL) *outSize = size + 1; // +1 for tag byte. + return YES; +} + + +static value_ptr extract_simple(bplist_info_ptr bplist, uint64_t offset) +{ + assert(bplist->data_bytes != NULL && offset < bplist->length); + value_ptr value = value_create(); + + switch (bplist->data_bytes[offset]) { + case kVALUE_NULL: + value->tag = kVALUE_NULL; + return value; + + case kVALUE_TRUE: + value->tag = kVALUE_TRUE; + return value; + + case kVALUE_FALSE: + value->tag = kVALUE_FALSE; + return value; + } + + // Note: kVALUE_FILLER is treated as invalid, because it, er, is. + bplist_log("Bad binary plist: invalid atom.\n"); + free(value); + return NULL; +} + + +static value_ptr extract_int(bplist_info_ptr bplist, uint64_t offset) +{ + value_ptr value = value_create(); + value->tag = kTAG_INT; + + if (!read_self_sized_int(bplist, offset, &value->uinteger, NULL)) { + bplist_log("Bad binary plist: invalid integer object.\n"); + } + + /* NOTE: originally, I sign-extended here. This was the wrong thing; it + turns out that negative ints are always stored as 64-bit, and smaller + ints are unsigned. + */ + return value; +} + + +static value_ptr extract_real(bplist_info_ptr bplist, uint64_t offset) +{ + value_ptr value = value_create(); + uint32_t size; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + size = 1 << (bplist->data_bytes[offset] & 0x0F); + + // FIXME: what to do if faced with other sizes for float/double? + assert (sizeof (float) == sizeof (uint32_t) && + sizeof (double) == sizeof (uint64_t)); + + if (offset + 1 + size > bplist->length) { + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "floating-point number"); + free(value); + return NULL; + } + + if (size == sizeof (float)) { + // cast is ok because we know size is 4 bytes + uint32_t i = (uint32_t) read_sized_int(bplist, offset + 1, size); + // Note that this handles byte swapping. + value_set_real(value, *(float *)&i); + return value; + } else if (size == sizeof (double)) { + uint64_t i = read_sized_int(bplist, offset + 1, size); + // Note that this handles byte swapping. + value_set_real(value, *(double *)&i); + return value; + } else { + // Can't handle floats of other sizes. + bplist_log("Bad binary plist: can't handle %u-byte float.\n", size); + free(value); + return NULL; + } +} + + +static value_ptr extract_date(bplist_info_ptr bplist, uint64_t offset) +{ + value_ptr value; + assert(bplist->data_bytes != NULL && offset < bplist->length); + + // Data has size code like int and real, but only 3 (meaning 8 bytes) is valid. + if (bplist->data_bytes[offset] != kVALUE_FULLDATETAG) { + bplist_log("Bad binary plist: invalid size for date object.\n"); + return NULL; + } + + if (offset + 1 + sizeof (double) > bplist->length) { + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "date"); + return NULL; + } + + // FIXME: what to do if faced with other sizes for double? + assert (sizeof (double) == sizeof (uint64_t)); + + uint64_t date = read_sized_int(bplist, offset + 1, sizeof(double)); + // Note that this handles byte swapping. + value = value_create(); + value_set_date(value, *(double *)&date); + return value; +} + + +uint64_t bplist_get_a_size(bplist_info_ptr bplist, + uint64_t *offset_ptr, char *msg) +{ + uint64_t size = bplist->data_bytes[*offset_ptr] & 0x0F; + (*offset_ptr)++; + if (size == 0x0F) { + // 0x0F means separate int size follows. + // Smaller values are used for short data. + size_t extra; // the length of the data size we are about to read + if ((bplist->data_bytes[*offset_ptr] & 0xF0) != kTAG_INT) { + // Bad data, mistagged size int + bplist_log("Bad binary plist: %s object size is not tagged as int.\n", + msg); + return UINT64_MAX; // error + } + + // read integer data as size, extra tells how many bytes to skip + if (!read_self_sized_int(bplist, *offset_ptr, &size, &extra)) { + bplist_log("Bad binary plist: invalid %s object size tag.\n", + "data"); + return UINT64_MAX; // error + } + (*offset_ptr) += extra; + } + + if (*offset_ptr + size > bplist->length) { + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "data"); + return UINT64_MAX; // error + } + return size; +} + + +static value_ptr extract_data(bplist_info_ptr bplist, uint64_t offset) +{ + uint64_t size; + value_ptr value; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + if ((size = bplist_get_a_size(bplist, &offset, "data")) == UINT64_MAX) + return NULL; + + value = value_create(); + // cast is ok because we only allow files up to 100MB: + value_set_data(value, bplist->data_bytes + (size_t) offset, (size_t) size); + return value; +} + + +static value_ptr extract_ascii_string(bplist_info_ptr bplist, uint64_t offset) +{ + uint64_t size; + value_ptr value; // return value + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + if ((size = bplist_get_a_size(bplist, &offset, "ascii string")) == + UINT64_MAX) + return NULL; + + value = value_create(); + // cast is ok because we only allow 100MB files + value_set_ascii_string(value, bplist->data_bytes + (size_t) offset, + (size_t) size); + return value; +} + + +static value_ptr extract_unicode_string(bplist_info_ptr bplist, uint64_t offset) +{ + uint64_t size; + value_ptr value; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + if ((size = bplist_get_a_size(bplist, &offset, "unicode string")) == + UINT64_MAX) + return NULL; + + value = value_create(); + // cast is ok because we only allow 100MB files + value_set_unicode_string(value, bplist->data_bytes + (size_t) offset, + (size_t) size); + return value; +} + + +static value_ptr extract_uid(bplist_info_ptr bplist, uint64_t offset) +{ + /* UIDs are used by Cocoa's key-value coder. + When writing other plist formats, they are expanded to dictionaries of + the form <dict><key>CF$UID</key><integer>value</integer></dict>, so we + do the same here on reading. This results in plists identical to what + running plutil -convert xml1 gives us. However, this is not the same + result as [Core]Foundation's plist parser, which extracts them as un- + introspectable CF objects. In fact, it even seems to convert the CF$UID + dictionaries from XML plists on the fly. + */ + + value_ptr value; + uint64_t uid; + + if (!read_self_sized_int(bplist, offset, &uid, NULL)) { + bplist_log("Bad binary plist: invalid UID object.\n"); + return NULL; + } + + // assert(NO); // original code suggests using a string for a key + // but our dictionaries all use big ints for keys, so I don't know + // what to do here + + // In practice, I believe this code is never executed by PortMidi. + // I changed it to do something and not raise compiler warnings, but + // not sure what the code should do. + + value = value_create(); + value_set_uid(value, uid); + // return [NSDictionary dictionaryWithObject: + // [NSNumber numberWithUnsignedLongLong:value] + // forKey:"CF$UID"]; + return value; +} + + +static value_ptr extract_array(bplist_info_ptr bplist, uint64_t offset) +{ + uint64_t i, count; + uint64_t size; + uint64_t elementID; + value_ptr element = NULL; + value_ptr *array = NULL; + value_ptr value = NULL; + BOOL ok = YES; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX) + return NULL; + + if (count > UINT64_MAX / bplist->object_ref_size - offset) { + // Offset overflow. + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "array"); + return NULL; + } + + size = bplist->object_ref_size * count; + if (size + offset > bplist->length) { + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "array"); + return NULL; + } + + // got count, the number of array elements + + value = value_create(); + assert(value); + + if (count == 0) { + // count must be size_t or smaller because max file size is 100MB + value_set_array(value, array, (size_t) count); + return value; + } + + array = allocate(sizeof(value_ptr) * (size_t) count); + + for (i = 0; i != count; ++i) { + bplist_log_verbose("[%u]\n", i); + elementID = read_sized_int(bplist, offset + i * bplist->object_ref_size, + bplist->object_ref_size); + element = extract_object(bplist, elementID); + if (element != NULL) { + array[i] = element; + } else { + ok = NO; + break; + } + } + if (ok) { // count is smaller than size_t max because of 100MB file limit + value_set_array(value, array, (size_t) count); + } + + return value; +} + + +static value_ptr extract_dictionary(bplist_info_ptr bplist, uint64_t offset) +{ + uint64_t i, count; + uint64_t size; + uint64_t elementID; + value_ptr value = NULL; + dict_ptr dict = NULL; + BOOL ok = YES; + + assert(bplist->data_bytes != NULL && offset < bplist->length); + + + if ((count = bplist_get_a_size(bplist, &offset, "array")) == UINT64_MAX) + return NULL; + + if (count > UINT64_MAX / (bplist->object_ref_size * 2) - offset) { + // Offset overflow. + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "dictionary"); + return NULL; + } + + size = bplist->object_ref_size * count * 2; + if (size + offset > bplist->length) { + bplist_log("Bad binary plist: %s object overlaps end of container.\n", + "dictionary"); + return NULL; + } + + value = value_create(); + if (count == 0) { + value_set_dict(value, NULL); + return value; + } + + for (i = 0; i != count; ++i) { + value_ptr key; + value_ptr val; + elementID = read_sized_int(bplist, offset + i * bplist->object_ref_size, + bplist->object_ref_size); + key = extract_object(bplist, elementID); + if (key != NULL) { + bplist_log_verbose("key: %p\n", key); + } else { + ok = NO; + break; + } + + elementID = read_sized_int(bplist, + offset + (i + count) * bplist->object_ref_size, + bplist->object_ref_size); + val = extract_object(bplist, elementID); + if (val != NULL) { + dict_insert(&dict, key, val); + } else { + ok = NO; + break; + } + } + if (ok) { + value_set_dict(value, dict); + } + + return value; +} + +/*************** functions for accessing values ****************/ + + +char *value_get_asciistring(value_ptr v) +{ + if (v->tag != kTAG_ASCIISTRING) return NULL; + return v->string; +} + + +value_ptr value_dict_lookup_using_string(value_ptr v, char *key) +{ + dict_ptr dict; + if (v->tag != kTAG_DICTIONARY) return NULL; // not a dictionary + dict = v->dict; + /* search for key */ + while (dict) { + if (dict->key && dict->key->tag == kTAG_ASCIISTRING && + strcmp(key, dict->key->string) == 0) { // found it + return dict->value; + } + dict = dict->next; + } + return NULL; /* not found */ +} + +value_ptr value_dict_lookup_using_path(value_ptr v, char *path) +{ + char key[MAX_KEY_SIZE]; + while (*path) { /* more to the path */ + int i = 0; + while (i < MAX_KEY_SIZE - 1) { + key[i] = *path++; + if (key[i] == '/') { /* end of entry in path */ + key[i + 1] = 0; + break; + } + if (!key[i]) { + path--; /* back up to end of string char */ + break; /* this will cause outer loop to exit */ + } + i++; + } + if (!v || v->tag != kTAG_DICTIONARY) return NULL; + /* now, look up the key to get next value */ + v = value_dict_lookup_using_string(v, key); + if (v == NULL) return NULL; + } + return v; +} + + +/*************** functions for debugging ***************/ + +void plist_print(value_ptr v) +{ + size_t i; + int comma_needed; + dict_ptr dict; + if (!v) { + printf("NULL"); + return; + } + switch (v->tag & 0xF0) { + case kTAG_SIMPLE: + switch (v->tag) { + case kVALUE_NULL: + printf("NULL@%p", v); break; + case kVALUE_FALSE: + printf("FALSE@%p", v); break; + case kVALUE_TRUE: + printf("TRUE@%p", v); break; + default: + printf("UNKNOWN tag=%x@%p", v->tag, v); break; + } + break; + case kTAG_INT: + printf("%lld@%p", v->integer, v); break; + case kTAG_REAL: + printf("%g@%p", v->real, v); break; + case kTAG_DATE: + printf("date:%g@%p", v->real, v); break; + case kTAG_DATA: + printf("data@%p->%p:[%p:", v, v->data, v->data->data); + for (i = 0; i < v->data->len; i++) { + printf(" %2x", v->data->data[i]); + } + printf("]"); break; + case kTAG_ASCIISTRING: + printf("%p:\"%s\"@%p", v->string, v->string, v); break; + case kTAG_UNICODESTRING: + printf("unicode:%p:\"%s\"@%p", v->string, v->string, v); break; + case kTAG_UID: + printf("UID:%llu@%p", v->uinteger, v); break; + case kTAG_ARRAY: + comma_needed = FALSE; + printf("%p->%p:[%p:", v, v->array, v->array->array); + for (i = 0; i < v->array->length; i++) { + if (comma_needed) printf(", "); + plist_print(v->array->array[i]); + comma_needed = TRUE; + } + printf("]"); break; + case kTAG_DICTIONARY: + comma_needed = FALSE; + printf("%p:[", v); + dict = v->dict; + while (dict) { + if (comma_needed) printf(", "); + printf("%p:", dict); + plist_print(dict->key); + printf("->"); + plist_print(dict->value); + comma_needed = TRUE; + dict = dict->next; + } + printf("]"); break; + default: + printf("UNKNOWN tag=%x", v->tag); + break; + } +} + + diff --git a/pd/portmidi/pm_mac/readbinaryplist.h b/pd/portmidi/pm_mac/readbinaryplist.h new file mode 100644 index 000000000..577865996 --- /dev/null +++ b/pd/portmidi/pm_mac/readbinaryplist.h @@ -0,0 +1,88 @@ +/* readbinaryplist.h -- header to read preference files + + Roger B. Dannenberg, Jun 2008 +*/ + +#include <stdint.h> /* for uint8_t ... */ + +#ifndef TRUE + #define TRUE 1 + #define FALSE 0 +#endif + +#define MAX_KEY_SIZE 256 + +enum +{ + // Object tags (high nybble) + kTAG_SIMPLE = 0x00, // Null, true, false, filler, or invalid + kTAG_INT = 0x10, + kTAG_REAL = 0x20, + kTAG_DATE = 0x30, + kTAG_DATA = 0x40, + kTAG_ASCIISTRING = 0x50, + kTAG_UNICODESTRING = 0x60, + kTAG_UID = 0x80, + kTAG_ARRAY = 0xA0, + kTAG_DICTIONARY = 0xD0, + + // "simple" object values + kVALUE_NULL = 0x00, + kVALUE_FALSE = 0x08, + kVALUE_TRUE = 0x09, + kVALUE_FILLER = 0x0F, + + kVALUE_FULLDATETAG = 0x33 // Dates are tagged with a whole byte. +}; + + +typedef struct pldata_struct { + uint8_t *data; + size_t len; +} pldata_node, *pldata_ptr; + + +typedef struct array_struct { + struct value_struct **array; + uint64_t length; +} array_node, *array_ptr; + + +// a dict_node is a list of <key, value> pairs +typedef struct dict_struct { + struct value_struct *key; + struct value_struct *value; + struct dict_struct *next; +} dict_node, *dict_ptr; + + +// an value_node is a value with a tag telling the type +typedef struct value_struct { + int tag; + union { + int64_t integer; + uint64_t uinteger; + double real; + char *string; + pldata_ptr data; + array_ptr array; + struct dict_struct *dict; + }; +} value_node, *value_ptr; + + +value_ptr bplist_read_file(char *filename); +value_ptr bplist_read_user_pref(char *filename); +value_ptr bplist_read_system_pref(char *filename); +void bplist_free_data(); + +/*************** functions for accessing values ****************/ + +char *value_get_asciistring(value_ptr v); +value_ptr value_dict_lookup_using_string(value_ptr v, char *key); +value_ptr value_dict_lookup_using_path(value_ptr v, char *path); + +/*************** functions for debugging ***************/ + +void plist_print(value_ptr v); + diff --git a/pd/portmidi/pm_mingw/README-MINGW.txt b/pd/portmidi/pm_mingw/README-MINGW.txt new file mode 100644 index 000000000..e01a7fed4 --- /dev/null +++ b/pd/portmidi/pm_mingw/README-MINGW.txt @@ -0,0 +1,11 @@ +README-MINGW.txt -- note on MinGW and PortMidi + +Roger Dannenberg +20 Sep 2010 + +Fabian Rutte writes that CMake can build files for Code::Blocks +under MinGW. + +I would guess that a simple Unix Makefile output from CMake would +also work, but I haven't tested it. + diff --git a/pd/portmidi/pm_mingw/eclipse/README.txt b/pd/portmidi/pm_mingw/eclipse/README.txt new file mode 100644 index 000000000..2b58e13ab --- /dev/null +++ b/pd/portmidi/pm_mingw/eclipse/README.txt @@ -0,0 +1,23 @@ +These files, dot-cproject and dot-project, come from Philip Martin +(posted on Media_api mailing list on September 3, 2008). +He writes: "I do not have a makefile. I used Eclipse + CDT to build +PortMidi using MinGw. ... The two files .project and .cproject I +believe must be in the root of the portmidi tree to work with Eclipse. +... I have only compiled the relevant sources into one .dll here." + +The .project and .cproject files have been renamed to dot-project and +dot-cproject here to make them more visible. To use them, you will +need to rename them to .project and .cproject, and probably move them +to the portmidi tree root. + +At this time, no one is actively maintaining Eclipse or MinGw versions +of PortMidi, so these files may be out-of-date or have other problems. +Feel free to submit updates or discuss the possibility of maintaining +these or some equivalent files for MinGw. + +Update, 20 Sep 2010: CMake supports Code::Blocks in conjunction with +MinGW. + +Roger Dannenberg +18-Oct-2008 + diff --git a/pd/portmidi/pm_mingw/eclipse/dot-cproject b/pd/portmidi/pm_mingw/eclipse/dot-cproject new file mode 100644 index 000000000..d99bff8bc --- /dev/null +++ b/pd/portmidi/pm_mingw/eclipse/dot-cproject @@ -0,0 +1,710 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?> + +<cproject> +<storageModule moduleId="org.eclipse.cdt.core.settings"> +<cconfiguration id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004"> +<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004" moduleId="org.eclipse.cdt.core.settings" name="Debug"> +<externalSettings> +<externalSetting> +<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/PortMidi"/> +<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/PortMidi/Debug"/> +</externalSetting> +</externalSettings> +<extensions> +<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/> +<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +</extensions> +</storageModule> +<storageModule moduleId="cdtBuildSystem" version="4.0.0"> +<configuration artifactExtension="dll" artifactName="PortMidi" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.so.debug"> +<folderInfo id="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004." name="/" resourcePath=""> +<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.so.debug.1545417885" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.so.debug"> +<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.so.debug.415542300" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.so.debug"/> +<builder buildPath="${workspace_loc:/PortMidi/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.592172807" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/> +<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.so.debug.1889129808" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.so.debug"> +<option id="gnu.both.asm.option.flags.1498736889" name="Assembler flags" superClass="gnu.both.asm.option.flags"/> +<option id="gnu.both.asm.option.include.paths.1734867019" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_common}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_win}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/porttime}""/> +</option> +<option id="gnu.both.asm.option.warnings.nowarn.1657300607" name="Suppress warnings (-W)" superClass="gnu.both.asm.option.warnings.nowarn"/> +<option id="gnu.both.asm.option.version.1995252368" name="Announce version (-v)" superClass="gnu.both.asm.option.version"/> +<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1250436110" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1211487028" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/> +<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.debug.81091790" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.debug"> +<option id="gnu.cpp.compiler.mingw.so.debug.option.optimization.level.1750954034" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.so.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/> +<option id="gnu.cpp.compiler.mingw.so.debug.option.debugging.level.1357163228" name="Debug Level" superClass="gnu.cpp.compiler.mingw.so.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug"> +<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.so.debug.option.optimization.level.1361318269" name="Optimization Level" superClass="gnu.c.compiler.mingw.so.debug.option.optimization.level" valueType="enumerated"/> +<option id="gnu.c.compiler.mingw.so.debug.option.debugging.level.798971050" name="Debug Level" superClass="gnu.c.compiler.mingw.so.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> +<option id="gnu.c.compiler.option.preprocessor.nostdinc.635731758" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc"/> +<option id="gnu.c.compiler.option.preprocessor.preprocess.1129104455" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess"/> +<option id="gnu.c.compiler.option.preprocessor.def.symbols.924940285" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"/> +<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1996330931" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" valueType="undefDefinedSymbols"> +<listOptionValue builtIn="false" value="_STDCALL_SUPPORTED"/> +</option> +<option id="gnu.c.compiler.option.include.paths.276080219" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_common}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_win}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/porttime}""/> +</option> +<option id="gnu.c.compiler.option.optimization.flags.1032442929" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags"/> +<option id="gnu.c.compiler.option.debugging.other.509079500" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other"/> +<option id="gnu.c.compiler.option.debugging.gprof.708510440" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof"/> +<option id="gnu.c.compiler.option.debugging.prof.1379528770" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof"/> +<option id="gnu.c.compiler.option.warnings.syntax.76950723" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax"/> +<option id="gnu.c.compiler.option.warnings.pedantic.503180272" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic"/> +<option id="gnu.c.compiler.option.warnings.pedantic.error.332437973" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error"/> +<option id="gnu.c.compiler.option.warnings.nowarn.1830350073" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn"/> +<option id="gnu.c.compiler.option.warnings.allwarn.77655170" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn"/> +<option id="gnu.c.compiler.option.warnings.toerrors.1707691615" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors"/> +<option id="gnu.c.compiler.option.misc.other.1929071594" name="Other flags" superClass="gnu.c.compiler.option.misc.other"/> +<option id="gnu.c.compiler.option.misc.verbose.1368165423" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose"/> +<option id="gnu.c.compiler.option.misc.ansi.1130235771" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi"/> +<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.532732416" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.debug.2093989251" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.debug"> +<option defaultValue="true" id="gnu.c.link.mingw.so.debug.option.shared.210833175" name="Shared (-shared)" superClass="gnu.c.link.mingw.so.debug.option.shared" valueType="boolean"/> +<option id="gnu.c.link.option.nostart.1109377759" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/> +<option id="gnu.c.link.option.nodeflibs.1969639513" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/> +<option id="gnu.c.link.option.nostdlibs.1939458836" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs"/> +<option id="gnu.c.link.option.strip.1926939147" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/> +<option id="gnu.c.link.option.noshared.1390204753" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/> +<option id="gnu.c.link.option.libs.2043660134" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> +<listOptionValue builtIn="false" value="winmm"/> +</option> +<option id="gnu.c.link.option.paths.1702926265" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/> +<option id="gnu.c.link.option.ldflags.1184725311" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-mwindows" valueType="string"/> +<option id="gnu.c.link.option.other.2085141015" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/> +<option id="gnu.c.link.option.userobjs.1490648701" name="Other objects" superClass="gnu.c.link.option.userobjs"/> +<option id="gnu.c.link.option.soname.437120219" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname" value="PortMidi.dll" valueType="string"/> +<option id="gnu.c.link.option.implname.205634723" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname" value="libPortMidi_dll.a" valueType="string"/> +<option id="gnu.c.link.option.defname.571020719" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname" value="PortMidi_dll.def" valueType="string"/> +<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.916986463" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> +<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> +<additionalInput kind="additionalinput" paths="$(LIBS)"/> +</inputType> +</tool> +<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.debug.1822206806" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.debug"> +<option defaultValue="true" id="gnu.cpp.link.mingw.so.debug.option.shared.408251443" name="Shared (-shared)" superClass="gnu.cpp.link.mingw.so.debug.option.shared" valueType="boolean"/> +</tool> +</toolChain> +</folderInfo> +<sourceEntries> +<entry excluding="pm_cl/|pm_linux/|pm_mac/|pm_test/|porttime/ptlinux.c|porttime/ptmacosx_cf.c|porttime/ptmacosx_mach.c" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/> +</sourceEntries> +</configuration> +</storageModule> +<storageModule moduleId="scannerConfiguration"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.release.413200248;cdt.managedbuild.config.gnu.mingw.so.release.413200248.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978;cdt.managedbuild.tool.gnu.c.compiler.input.611335297"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004;cdt.managedbuild.config.gnu.mingw.so.debug.1580321004.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337;cdt.managedbuild.tool.gnu.c.compiler.input.532732416"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +</storageModule> +<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> +<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> +</cconfiguration> +<cconfiguration id="cdt.managedbuild.config.gnu.mingw.so.release.413200248"> +<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.so.release.413200248" moduleId="org.eclipse.cdt.core.settings" name="Release"> +<externalSettings> +<externalSetting> +<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/PortMidi"/> +<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/PortMidi/Release"/> +</externalSetting> +</externalSettings> +<extensions> +<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/> +<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> +</extensions> +</storageModule> +<storageModule moduleId="cdtBuildSystem" version="4.0.0"> +<configuration artifactExtension="dll" artifactName="PortMidi" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.so.release.413200248" name="Release" parent="cdt.managedbuild.config.gnu.mingw.so.release"> +<folderInfo id="cdt.managedbuild.config.gnu.mingw.so.release.413200248." name="/" resourcePath=""> +<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.so.release.965704931" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.so.release"> +<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.so.release.1343771960" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.so.release"/> +<builder buildPath="${workspace_loc:/PortMidi/Release}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1650720234" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/> +<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.so.release.1392864745" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.so.release"> +<option id="gnu.both.asm.option.include.paths.591264871" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_common}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_win}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/porttime}""/> +</option> +<option id="gnu.both.asm.option.flags.1143807089" superClass="gnu.both.asm.option.flags"/> +<option id="gnu.both.asm.option.warnings.nowarn.1142377463" superClass="gnu.both.asm.option.warnings.nowarn"/> +<option id="gnu.both.asm.option.version.1007025248" superClass="gnu.both.asm.option.version"/> +<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754592443" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.503109969" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/> +<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release.1693369280" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release"> +<option id="gnu.cpp.compiler.mingw.so.release.option.optimization.level.1169326010" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.so.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/> +<option id="gnu.cpp.compiler.mingw.so.release.option.debugging.level.1197288488" name="Debug Level" superClass="gnu.cpp.compiler.mingw.so.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release"> +<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.so.release.option.optimization.level.79718900" name="Optimization Level" superClass="gnu.c.compiler.mingw.so.release.option.optimization.level" valueType="enumerated"/> +<option id="gnu.c.compiler.mingw.so.release.option.debugging.level.778378875" name="Debug Level" superClass="gnu.c.compiler.mingw.so.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/> +<option id="gnu.c.compiler.option.include.paths.140256948" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_common}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/pm_win}""/> +<listOptionValue builtIn="false" value=""${workspace_loc:/PortMidi/porttime}""/> +</option> +<option id="gnu.c.compiler.option.preprocessor.def.symbols.960115196" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols"/> +<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1891593123" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" valueType="undefDefinedSymbols"> +<listOptionValue builtIn="false" value="_STDCALL_SUPPORTED"/> +</option> +<option id="gnu.c.compiler.option.preprocessor.nostdinc.824573539" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc"/> +<option id="gnu.c.compiler.option.preprocessor.preprocess.2045908914" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess"/> +<option id="gnu.c.compiler.option.optimization.flags.1668114371" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags"/> +<option id="gnu.c.compiler.option.debugging.other.26702882" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other"/> +<option id="gnu.c.compiler.option.debugging.gprof.1849481872" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof"/> +<option id="gnu.c.compiler.option.debugging.prof.370891777" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof"/> +<option id="gnu.c.compiler.option.warnings.syntax.814238128" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax"/> +<option id="gnu.c.compiler.option.warnings.pedantic.1130364543" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic"/> +<option id="gnu.c.compiler.option.warnings.pedantic.error.1833423377" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error"/> +<option id="gnu.c.compiler.option.warnings.nowarn.842847161" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn"/> +<option id="gnu.c.compiler.option.warnings.allwarn.1245259653" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn"/> +<option id="gnu.c.compiler.option.warnings.toerrors.329299856" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors"/> +<option id="gnu.c.compiler.option.misc.other.1436833008" name="Other flags" superClass="gnu.c.compiler.option.misc.other"/> +<option id="gnu.c.compiler.option.misc.verbose.1418051288" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose"/> +<option id="gnu.c.compiler.option.misc.ansi.592723919" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi"/> +<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.611335297" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> +</tool> +<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release.556134685" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release"> +<option defaultValue="true" id="gnu.c.link.mingw.so.release.option.shared.1619560956" name="Shared (-shared)" superClass="gnu.c.link.mingw.so.release.option.shared" valueType="boolean"/> +<option id="gnu.c.link.option.ldflags.1804407715" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-mwindows" valueType="string"/> +<option id="gnu.c.link.option.soname.621315524" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname" value="PortMidi.dll" valueType="string"/> +<option id="gnu.c.link.option.implname.236027258" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname" value="libPortMidi_dll.a" valueType="string"/> +<option id="gnu.c.link.option.defname.1144978768" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname" value="PortMidi_dll.def" valueType="string"/> +<option id="gnu.c.link.option.nostart.623404099" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/> +<option id="gnu.c.link.option.nodeflibs.51119036" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/> +<option id="gnu.c.link.option.nostdlibs.2099774502" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs"/> +<option id="gnu.c.link.option.strip.1270839234" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/> +<option id="gnu.c.link.option.noshared.715377715" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/> +<option id="gnu.c.link.option.libs.246748928" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"> +<listOptionValue builtIn="false" value="winmm"/> +</option> +<option id="gnu.c.link.option.paths.1166408208" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/> +<option id="gnu.c.link.option.other.1932058041" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/> +<option id="gnu.c.link.option.userobjs.1397357824" name="Other objects" superClass="gnu.c.link.option.userobjs"/> +<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.363448189" superClass="cdt.managedbuild.tool.gnu.c.linker.input"> +<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> +<additionalInput kind="additionalinput" paths="$(LIBS)"/> +</inputType> +</tool> +<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release.1088983873" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release"> +<option defaultValue="true" id="gnu.cpp.link.mingw.so.release.option.shared.2023092585" name="Shared (-shared)" superClass="gnu.cpp.link.mingw.so.release.option.shared" valueType="boolean"/> +</tool> +</toolChain> +</folderInfo> +<sourceEntries> +<entry excluding="pm_cl/|pm_linux/|pm_mac/|pm_test/|porttime/ptlinux.c|porttime/ptmacosx_cf.c|porttime/ptmacosx_mach.c" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/> +</sourceEntries> +</configuration> +</storageModule> +<storageModule moduleId="scannerConfiguration"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.release.413200248;cdt.managedbuild.config.gnu.mingw.so.release.413200248.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.343495978;cdt.managedbuild.tool.gnu.c.compiler.input.611335297"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.so.debug.1580321004;cdt.managedbuild.config.gnu.mingw.so.debug.1580321004.;cdt.managedbuild.tool.gnu.c.compiler.mingw.so.debug.428547337;cdt.managedbuild.tool.gnu.c.compiler.input.532732416"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +</scannerConfigBuildInfo> +</storageModule> +<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> +<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/> +</cconfiguration> +</storageModule> +<storageModule moduleId="cdtBuildSystem" version="4.0.0"> +<project id="PortMidi.cdt.managedbuild.target.gnu.mingw.so.812075522" name="Shared Library" projectType="cdt.managedbuild.target.gnu.mingw.so"/> +</storageModule> +</cproject> diff --git a/pd/portmidi/pm_mingw/eclipse/dot-project b/pd/portmidi/pm_mingw/eclipse/dot-project new file mode 100644 index 000000000..6a3994f6f --- /dev/null +++ b/pd/portmidi/pm_mingw/eclipse/dot-project @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>PortMidi</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + <dictionary> + <key>org.eclipse.cdt.make.core.contents</key> + <value>org.eclipse.cdt.make.core.activeConfigSettings</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildLocation</key> + <value>${workspace_loc:/PortMidi/Debug}</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>?name?</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildArguments</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildCommand</key> + <value>make</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.core.cnature</nature> + </natures> +</projectDescription> diff --git a/pd/portmidi/pm_mingw/msys/README-MSYS.txt b/pd/portmidi/pm_mingw/msys/README-MSYS.txt new file mode 100644 index 000000000..6f3cd69da --- /dev/null +++ b/pd/portmidi/pm_mingw/msys/README-MSYS.txt @@ -0,0 +1,8 @@ +Old code was removed from this directory because CMake provides an +up-to-date way to use MinGW. See portmidi/pm_mingw/README-MINGW.txt. + +Roger Dannenberg +20-Sep-2010 + + + diff --git a/pd/portmidi/pm_python/README_PYTHON.txt b/pd/portmidi/pm_python/README_PYTHON.txt new file mode 100644 index 000000000..3030dd2d6 --- /dev/null +++ b/pd/portmidi/pm_python/README_PYTHON.txt @@ -0,0 +1,34 @@ +PyPortMidi v0.03 03/15/05 +Python wrappings for PortMidi +John Harrison +harrison@media.mit.edu + +Modified by Roger B. Dannenberg, Nov 2009 + +PyPortMidi +---------- + +PyPortMidi is a Python wrapper for PortMidi. PortMidi is a cross-platform +C library for realtime MIDI control. Using PyPortMidi, you can send and +receive MIDI data in realtime from Python. + +Besides using PyPortMidi to communicate to synthesizers and the +like, it is possible to use PyPortMidi as a way to send MIDI messages +between software packages on the same computer. For example, Using +PyPortMidi and MIDI-YOKE on a Windows machine, it is possible to send +realtime MIDI messages between programs on the same computer using +loopback virtual MIDI ports. (At this time, MIDI-YOKE does not appear +to run on Windows Vista.) + +PyPortMidi is cross-platform, but it will require some small +changes in the setup.py file for it to install correctly on Linux +machines. The changes should be pretty straightforward, and I am +anxious to work with a Linux user on the port. + +PyPortMidi works with Python 2.6 and Python 3.1, although the ports +are mostly separate because of various language incompatibilities. + +Please see README26.txt for information about the Python 2.6 version. + +See README31.txt for information about the Python 3.1 version. + diff --git a/pd/portmidi/pm_python/pyportmidi/__init__.py b/pd/portmidi/pm_python/pyportmidi/__init__.py new file mode 100644 index 000000000..0f3fc4b44 --- /dev/null +++ b/pd/portmidi/pm_python/pyportmidi/__init__.py @@ -0,0 +1,3 @@ + +from .midi import * + diff --git a/pd/portmidi/pm_python/pyportmidi/_pyportmidi.c b/pd/portmidi/pm_python/pyportmidi/_pyportmidi.c new file mode 100644 index 000000000..7d700349e --- /dev/null +++ b/pd/portmidi/pm_python/pyportmidi/_pyportmidi.c @@ -0,0 +1,5663 @@ +/* Generated by Cython 0.12.1 on Sun Sep 26 13:30:09 2010 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#include "structmember.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#else + +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#if PY_VERSION_HEX < 0x02040000 + #define METH_COEXIST 0 + #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) + #define PyDict_Contains(d,o) PySequence_Contains(d,o) +#endif + +#if PY_VERSION_HEX < 0x02050000 + typedef int Py_ssize_t; + #define PY_SSIZE_T_MAX INT_MAX + #define PY_SSIZE_T_MIN INT_MIN + #define PY_FORMAT_SIZE_T "" + #define PyInt_FromSsize_t(z) PyInt_FromLong(z) + #define PyInt_AsSsize_t(o) PyInt_AsLong(o) + #define PyNumber_Index(o) PyNumber_Int(o) + #define PyIndex_Check(o) PyNumber_Check(o) + #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) +#endif + +#if PY_VERSION_HEX < 0x02060000 + #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) + #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) + #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + #define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + #define PyType_Modified(t) + + typedef struct { + void *buf; + PyObject *obj; + Py_ssize_t len; + Py_ssize_t itemsize; + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; + } Py_buffer; + + #define PyBUF_SIMPLE 0 + #define PyBUF_WRITABLE 0x0001 + #define PyBUF_FORMAT 0x0004 + #define PyBUF_ND 0x0008 + #define PyBUF_STRIDES (0x0010 | PyBUF_ND) + #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) + #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) + #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) + #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#endif + +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#endif + +#if PY_MAJOR_VERSION >= 3 + #define Py_TPFLAGS_CHECKTYPES 0 + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif + +#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyString_Type PyUnicode_Type + #define PyString_CheckExact PyUnicode_CheckExact +#else + #define PyBytes_Type PyString_Type + #define PyBytes_CheckExact PyString_CheckExact +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) + +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func) +#endif + +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#else + #define _USE_MATH_DEFINES +#endif + +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) +#else + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) +#endif + +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_NAMESTR(n) ((char *)(n)) + #define __Pyx_DOCSTR(n) ((char *)(n)) +#else + #define __Pyx_NAMESTR(n) (n) + #define __Pyx_DOCSTR(n) (n) +#endif +#ifdef __cplusplus +#define __PYX_EXTERN_C extern "C" +#else +#define __PYX_EXTERN_C extern +#endif +#include <math.h> +#define __PYX_HAVE_API___pyportmidi +#include "portmidi.h" +#include "porttime.h" + +#ifndef CYTHON_INLINE + #if defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #else + #define CYTHON_INLINE + #endif +#endif + +typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ + + +/* Type Conversion Predeclarations */ + +#if PY_MAJOR_VERSION < 3 +#define __Pyx_PyBytes_FromString PyString_FromString +#define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize +#define __Pyx_PyBytes_AsString PyString_AsString +#else +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +#define __Pyx_PyBytes_AsString PyBytes_AsString +#endif + +#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s) +#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) __Pyx_PyBytes_AsString(s)) + +#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); + +#if !defined(T_PYSSIZET) +#if PY_VERSION_HEX < 0x02050000 +#define T_PYSSIZET T_INT +#elif !defined(T_LONGLONG) +#define T_PYSSIZET \ + ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ + ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1)) +#else +#define T_PYSSIZET \ + ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ + ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : \ + ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1))) +#endif +#endif + + +#if !defined(T_ULONGLONG) +#define __Pyx_T_UNSIGNED_INT(x) \ + ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \ + ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \ + ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1)))) +#else +#define __Pyx_T_UNSIGNED_INT(x) \ + ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \ + ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \ + ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \ + ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1))))) +#endif +#if !defined(T_LONGLONG) +#define __Pyx_T_SIGNED_INT(x) \ + ((sizeof(x) == sizeof(char)) ? T_BYTE : \ + ((sizeof(x) == sizeof(short)) ? T_SHORT : \ + ((sizeof(x) == sizeof(int)) ? T_INT : \ + ((sizeof(x) == sizeof(long)) ? T_LONG : -1)))) +#else +#define __Pyx_T_SIGNED_INT(x) \ + ((sizeof(x) == sizeof(char)) ? T_BYTE : \ + ((sizeof(x) == sizeof(short)) ? T_SHORT : \ + ((sizeof(x) == sizeof(int)) ? T_INT : \ + ((sizeof(x) == sizeof(long)) ? T_LONG : \ + ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1))))) +#endif + +#define __Pyx_T_FLOATING(x) \ + ((sizeof(x) == sizeof(float)) ? T_FLOAT : \ + ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1)) + +#if !defined(T_SIZET) +#if !defined(T_ULONGLONG) +#define T_SIZET \ + ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1)) +#else +#define T_SIZET \ + ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : \ + ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1))) +#endif +#endif + +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); + +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + + +#ifdef __GNUC__ +/* Test for GCC > 2.95 */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else /* __GNUC__ > 2 ... */ +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ > 2 ... */ +#else /* __GNUC__ */ +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; +static const char **__pyx_f; + + +/* Type declarations */ + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":394 + * + * + * cdef class Input: # <<<<<<<<<<<<<< + * """ + * class Input: + */ + +struct __pyx_obj_11_pyportmidi_Input { + PyObject_HEAD + PmStream *midi; + int debug; + int i; +}; + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":201 + * return Pm_Channel(chan-1) + * + * cdef class Output: # <<<<<<<<<<<<<< + * """ + * class Output: + */ + +struct __pyx_obj_11_pyportmidi_Output { + PyObject_HEAD + int i; + PmStream *midi; + int debug; + int _aborted; +}; + +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif + +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); + end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; + } + #define __Pyx_RefNannySetupContext(name) void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) + #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0) +#else + #define __Pyx_RefNannySetupContext(name) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) +#endif /* CYTHON_REFNANNY */ +#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0) +#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0) + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, PyObject* kw_name); /*proto*/ + +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ + + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} + + +#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); +} + +#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); +} + + +#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + PyObject *r; + if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) { + r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + } + else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + } + else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) { + r = PySequence_GetItem(o, i); + } + else { + r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); + } + return r; +} + +static CYTHON_INLINE PyObject* __Pyx_PyObject_Append(PyObject* L, PyObject* x) { + if (likely(PyList_CheckExact(L))) { + if (PyList_Append(L, x) < 0) return NULL; + Py_INCREF(Py_None); + return Py_None; /* this is just to have an accurate signature */ + } + else { + PyObject *r, *m; + m = __Pyx_GetAttrString(L, "append"); + if (!m) return NULL; + r = PyObject_CallFunctionObjArgs(m, x, NULL); + Py_DECREF(m); + return r; + } +} + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmDeviceID(PmDeviceID); + +static CYTHON_INLINE PmDeviceID __Pyx_PyInt_from_py_PmDeviceID(PyObject *); + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PtTimestamp(PtTimestamp); + +static int __Pyx_Print(PyObject *, int); /*proto*/ +#if PY_MAJOR_VERSION >= 3 +static PyObject* __pyx_print = 0; +static PyObject* __pyx_print_kwargs = 0; +#endif + +static int __Pyx_PrintOne(PyObject *o); /*proto*/ + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmMessage(PmMessage); + +static CYTHON_INLINE PmMessage __Pyx_PyInt_from_py_PmMessage(PyObject *); + +static CYTHON_INLINE PmTimestamp __Pyx_PyInt_from_py_PmTimestamp(PyObject *); + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmTimestamp(PmTimestamp); + +static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); + +static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); + +static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); + +static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); + +static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); + +static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); + +static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); + +static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); + +static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); + +static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); + +static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); + +static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); + +static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); + +static void __Pyx_AddTraceback(const char *funcname); /*proto*/ + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ +/* Module declarations from _pyportmidi */ + +static PyTypeObject *__pyx_ptype_11_pyportmidi_Output = 0; +static PyTypeObject *__pyx_ptype_11_pyportmidi_Input = 0; +#define __Pyx_MODULE_NAME "_pyportmidi" +int __pyx_module_is_main__pyportmidi = 0; + +/* Implementation of _pyportmidi */ +static PyObject *__pyx_builtin_Exception; +static PyObject *__pyx_builtin_IndexError; +static PyObject *__pyx_builtin_range; +static char __pyx_k_1[] = "Opening Midi Output"; +static char __pyx_k_2[] = "Unable to open Midi OutputDevice="; +static char __pyx_k_3[] = " err="; +static char __pyx_k_4[] = "Closing MIDI output stream and destroying instance"; +static char __pyx_k_5[] = "midi Output not open."; +static char __pyx_k_6[] = "midi Output aborted. Need to call Close after Abort."; +static char __pyx_k_7[] = "maximum list length is 1024"; +static char __pyx_k_8[] = " arguments in event list"; +static char __pyx_k_9[] = " : "; +static char __pyx_k_10[] = "writing to midi buffer"; +static char __pyx_k_11[] = "Writing to MIDI buffer"; +static char __pyx_k_12[] = "MIDI input opened."; +static char __pyx_k_13[] = "Closing MIDI input stream and destroying instance"; +static char __pyx_k_14[] = "midi Input not open."; +static char __pyx_k_15[] = "maximum buffer length is 1024"; +static char __pyx_k_16[] = "minimum buffer length is 1"; +static char __pyx_k_17[] = "0.07"; +static char __pyx_k_18[] = "FILT_CHANNEL_AFTERTOUCH"; +static char __pyx_k_19[] = "FILT_POLY_AFTERTOUCH"; +static char __pyx_k_20[] = "Initialize (line 132)"; +static char __pyx_k_21[] = "Terminate (line 139)"; +static char __pyx_k_22[] = "GetDeviceInfo (line 156)"; +static char __pyx_k_23[] = "Time (line 173)"; +static char __pyx_k_24[] = "GetErrorText (line 180)"; +static char __pyx_k_25[] = "Channel (line 187)"; +static char __pyx_k_26[] = "Output._check_open (line 248)"; +static char __pyx_k_27[] = "Output.Close (line 258)"; +static char __pyx_k_28[] = "Output.Abort (line 274)"; +static char __pyx_k_29[] = "Output.Write (line 293)"; +static char __pyx_k_30[] = "Output.WriteShort (line 333)"; +static char __pyx_k_31[] = "Output.WriteSysEx (line 356)"; +static char __pyx_k_32[] = "Input._check_open (line 422)"; +static char __pyx_k_33[] = "Input.Close (line 430)"; +static char __pyx_k_34[] = "Input.SetFilter (line 447)"; +static char __pyx_k_35[] = "Input.SetChannelMask (line 481)"; +static char __pyx_k_36[] = "Input.Poll (line 502)"; +static char __pyx_k_37[] = "Input.Read (line 514)"; +static char __pyx_k__B[] = "B"; +static char __pyx_k__i[] = "i"; +static char __pyx_k__msg[] = "msg"; +static char __pyx_k__Poll[] = "Poll"; +static char __pyx_k__Read[] = "Read"; +static char __pyx_k__TRUE[] = "TRUE"; +static char __pyx_k__Time[] = "Time"; +static char __pyx_k__midi[] = "midi"; +static char __pyx_k__name[] = "name"; +static char __pyx_k__when[] = "when"; +static char __pyx_k__Abort[] = "Abort"; +static char __pyx_k__Close[] = "Close"; +static char __pyx_k__FALSE[] = "FALSE"; +static char __pyx_k__Input[] = "Input"; +static char __pyx_k__Write[] = "Write"; +static char __pyx_k__array[] = "array"; +static char __pyx_k__data1[] = "data1"; +static char __pyx_k__data2[] = "data2"; +static char __pyx_k__debug[] = "debug"; +static char __pyx_k__input[] = "input"; +static char __pyx_k__range[] = "range"; +static char __pyx_k__Output[] = "Output"; +static char __pyx_k__interf[] = "interf"; +static char __pyx_k__opened[] = "opened"; +static char __pyx_k__output[] = "output"; +static char __pyx_k__status[] = "status"; +static char __pyx_k__Channel[] = "Channel"; +static char __pyx_k__FILT_F9[] = "FILT_F9"; +static char __pyx_k__FILT_FD[] = "FILT_FD"; +static char __pyx_k__latency[] = "latency"; +static char __pyx_k__message[] = "message"; +static char __pyx_k__FILT_MTC[] = "FILT_MTC"; +static char __pyx_k____main__[] = "__main__"; +static char __pyx_k____test__[] = "__test__"; +static char __pyx_k___aborted[] = "_aborted"; +static char __pyx_k__tostring[] = "tostring"; +static char __pyx_k__Exception[] = "Exception"; +static char __pyx_k__FILT_NOTE[] = "FILT_NOTE"; +static char __pyx_k__FILT_PLAY[] = "FILT_PLAY"; +static char __pyx_k__FILT_TICK[] = "FILT_TICK"; +static char __pyx_k__FILT_TUNE[] = "FILT_TUNE"; +static char __pyx_k__SetFilter[] = "SetFilter"; +static char __pyx_k__Terminate[] = "Terminate"; +static char __pyx_k__timestamp[] = "timestamp"; +static char __pyx_k__FILT_CLOCK[] = "FILT_CLOCK"; +static char __pyx_k__FILT_RESET[] = "FILT_RESET"; +static char __pyx_k__FILT_SYSEX[] = "FILT_SYSEX"; +static char __pyx_k__IndexError[] = "IndexError"; +static char __pyx_k__Initialize[] = "Initialize"; +static char __pyx_k__WriteShort[] = "WriteShort"; +static char __pyx_k__WriteSysEx[] = "WriteSysEx"; +static char __pyx_k__buffersize[] = "buffersize"; +static char __pyx_k__FILT_ACTIVE[] = "FILT_ACTIVE"; +static char __pyx_k__InputDevice[] = "InputDevice"; +static char __pyx_k____version__[] = "__version__"; +static char __pyx_k___check_open[] = "_check_open"; +static char __pyx_k__FILT_CONTROL[] = "FILT_CONTROL"; +static char __pyx_k__FILT_PROGRAM[] = "FILT_PROGRAM"; +static char __pyx_k__GetErrorText[] = "GetErrorText"; +static char __pyx_k__OutputDevice[] = "OutputDevice"; +static char __pyx_k__FILT_REALTIME[] = "FILT_REALTIME"; +static char __pyx_k__GetDeviceInfo[] = "GetDeviceInfo"; +static char __pyx_k__FILT_PITCHBEND[] = "FILT_PITCHBEND"; +static char __pyx_k__FILT_UNDEFINED[] = "FILT_UNDEFINED"; +static char __pyx_k__SetChannelMask[] = "SetChannelMask"; +static char __pyx_k__FILT_AFTERTOUCH[] = "FILT_AFTERTOUCH"; +static char __pyx_k__FILT_SONG_SELECT[] = "FILT_SONG_SELECT"; +static char __pyx_k__FILT_SONG_POSITION[] = "FILT_SONG_POSITION"; +static PyObject *__pyx_kp_s_1; +static PyObject *__pyx_kp_s_10; +static PyObject *__pyx_kp_s_11; +static PyObject *__pyx_kp_s_12; +static PyObject *__pyx_kp_s_13; +static PyObject *__pyx_kp_s_14; +static PyObject *__pyx_kp_s_15; +static PyObject *__pyx_kp_s_16; +static PyObject *__pyx_kp_s_17; +static PyObject *__pyx_n_s_18; +static PyObject *__pyx_n_s_19; +static PyObject *__pyx_kp_s_2; +static PyObject *__pyx_kp_u_20; +static PyObject *__pyx_kp_u_21; +static PyObject *__pyx_kp_u_22; +static PyObject *__pyx_kp_u_23; +static PyObject *__pyx_kp_u_24; +static PyObject *__pyx_kp_u_25; +static PyObject *__pyx_kp_u_26; +static PyObject *__pyx_kp_u_27; +static PyObject *__pyx_kp_u_28; +static PyObject *__pyx_kp_u_29; +static PyObject *__pyx_kp_s_3; +static PyObject *__pyx_kp_u_30; +static PyObject *__pyx_kp_u_31; +static PyObject *__pyx_kp_u_32; +static PyObject *__pyx_kp_u_33; +static PyObject *__pyx_kp_u_34; +static PyObject *__pyx_kp_u_35; +static PyObject *__pyx_kp_u_36; +static PyObject *__pyx_kp_u_37; +static PyObject *__pyx_kp_s_4; +static PyObject *__pyx_kp_s_5; +static PyObject *__pyx_kp_s_6; +static PyObject *__pyx_kp_s_7; +static PyObject *__pyx_kp_s_8; +static PyObject *__pyx_kp_s_9; +static PyObject *__pyx_n_s__Abort; +static PyObject *__pyx_n_s__B; +static PyObject *__pyx_n_s__Channel; +static PyObject *__pyx_n_s__Close; +static PyObject *__pyx_n_s__Exception; +static PyObject *__pyx_n_s__FALSE; +static PyObject *__pyx_n_s__FILT_ACTIVE; +static PyObject *__pyx_n_s__FILT_AFTERTOUCH; +static PyObject *__pyx_n_s__FILT_CLOCK; +static PyObject *__pyx_n_s__FILT_CONTROL; +static PyObject *__pyx_n_s__FILT_F9; +static PyObject *__pyx_n_s__FILT_FD; +static PyObject *__pyx_n_s__FILT_MTC; +static PyObject *__pyx_n_s__FILT_NOTE; +static PyObject *__pyx_n_s__FILT_PITCHBEND; +static PyObject *__pyx_n_s__FILT_PLAY; +static PyObject *__pyx_n_s__FILT_PROGRAM; +static PyObject *__pyx_n_s__FILT_REALTIME; +static PyObject *__pyx_n_s__FILT_RESET; +static PyObject *__pyx_n_s__FILT_SONG_POSITION; +static PyObject *__pyx_n_s__FILT_SONG_SELECT; +static PyObject *__pyx_n_s__FILT_SYSEX; +static PyObject *__pyx_n_s__FILT_TICK; +static PyObject *__pyx_n_s__FILT_TUNE; +static PyObject *__pyx_n_s__FILT_UNDEFINED; +static PyObject *__pyx_n_s__GetDeviceInfo; +static PyObject *__pyx_n_s__GetErrorText; +static PyObject *__pyx_n_s__IndexError; +static PyObject *__pyx_n_s__Initialize; +static PyObject *__pyx_n_s__Input; +static PyObject *__pyx_n_s__InputDevice; +static PyObject *__pyx_n_s__Output; +static PyObject *__pyx_n_s__OutputDevice; +static PyObject *__pyx_n_s__Poll; +static PyObject *__pyx_n_s__Read; +static PyObject *__pyx_n_s__SetChannelMask; +static PyObject *__pyx_n_s__SetFilter; +static PyObject *__pyx_n_s__TRUE; +static PyObject *__pyx_n_s__Terminate; +static PyObject *__pyx_n_s__Time; +static PyObject *__pyx_n_s__Write; +static PyObject *__pyx_n_s__WriteShort; +static PyObject *__pyx_n_s__WriteSysEx; +static PyObject *__pyx_n_s____main__; +static PyObject *__pyx_n_s____test__; +static PyObject *__pyx_n_s____version__; +static PyObject *__pyx_n_s___aborted; +static PyObject *__pyx_n_s___check_open; +static PyObject *__pyx_n_s__array; +static PyObject *__pyx_n_s__buffersize; +static PyObject *__pyx_n_s__data1; +static PyObject *__pyx_n_s__data2; +static PyObject *__pyx_n_s__debug; +static PyObject *__pyx_n_s__i; +static PyObject *__pyx_n_s__input; +static PyObject *__pyx_n_s__interf; +static PyObject *__pyx_n_s__latency; +static PyObject *__pyx_n_s__message; +static PyObject *__pyx_n_s__midi; +static PyObject *__pyx_n_s__msg; +static PyObject *__pyx_n_s__name; +static PyObject *__pyx_n_s__opened; +static PyObject *__pyx_n_s__output; +static PyObject *__pyx_n_s__range; +static PyObject *__pyx_n_s__status; +static PyObject *__pyx_n_s__timestamp; +static PyObject *__pyx_n_s__tostring; +static PyObject *__pyx_n_s__when; +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_8; +static PyObject *__pyx_int_16; +static PyObject *__pyx_int_0x1; +static PyObject *__pyx_int_0x2; +static PyObject *__pyx_int_0x4; +static PyObject *__pyx_int_0x8; +static PyObject *__pyx_int_0x10; +static PyObject *__pyx_int_0x20; +static PyObject *__pyx_int_0x30; +static PyObject *__pyx_int_0x40; +static PyObject *__pyx_int_0x7F; +static PyObject *__pyx_int_0x80; +static PyObject *__pyx_int_0xFF; +static PyObject *__pyx_int_1024; +static PyObject *__pyx_int_4096; +static PyObject *__pyx_int_0x100; +static PyObject *__pyx_int_0x200; +static PyObject *__pyx_int_0x300; +static PyObject *__pyx_int_0x400; +static PyObject *__pyx_int_0x800; +static PyObject *__pyx_int_0x1000; +static PyObject *__pyx_int_0x2000; +static PyObject *__pyx_int_0x4000; +static PyObject *__pyx_int_0x8000; +static PyObject *__pyx_int_0xFF00; +static PyObject *__pyx_int_0x10000; +static PyObject *__pyx_int_0xFF0000; + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":132 + * TRUE=1 + * + * def Initialize(): # <<<<<<<<<<<<<< + * """ + * Initialize: call this first + */ + +static PyObject *__pyx_pf_11_pyportmidi_Initialize(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_Initialize[] = "\nInitialize: call this first\n "; +static PyObject *__pyx_pf_11_pyportmidi_Initialize(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannySetupContext("Initialize"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":136 + * Initialize: call this first + * """ + * Pm_Initialize() # <<<<<<<<<<<<<< + * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ + * + */ + Pm_Initialize(); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":137 + * """ + * Pm_Initialize() + * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ # <<<<<<<<<<<<<< + * + * def Terminate(): + */ + Pt_Start(1, NULL, NULL); + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":139 + * Pt_Start(1, NULL, NULL) # /[inserted by cython to avoid comment start]* equiv to TIME_START: start timer w/ ms accuracy *[inserted by cython to avoid comment closer]/ + * + * def Terminate(): # <<<<<<<<<<<<<< + * """ + * Terminate: call this to clean up Midi streams when done. + */ + +static PyObject *__pyx_pf_11_pyportmidi_Terminate(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_Terminate[] = "\nTerminate: call this to clean up Midi streams when done.\nIf you do not call this on Windows machines when you are\ndone with MIDI, your system may crash.\n "; +static PyObject *__pyx_pf_11_pyportmidi_Terminate(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannySetupContext("Terminate"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":145 + * done with MIDI, your system may crash. + * """ + * Pm_Terminate() # <<<<<<<<<<<<<< + * + * def GetDefaultInputDeviceID(): + */ + Pm_Terminate(); + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":147 + * Pm_Terminate() + * + * def GetDefaultInputDeviceID(): # <<<<<<<<<<<<<< + * return Pm_GetDefaultInputDeviceID() + * + */ + +static PyObject *__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("GetDefaultInputDeviceID"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":148 + * + * def GetDefaultInputDeviceID(): + * return Pm_GetDefaultInputDeviceID() # <<<<<<<<<<<<<< + * + * def GetDefaultOutputDeviceID(): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_to_py_PmDeviceID(Pm_GetDefaultInputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.GetDefaultInputDeviceID"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":150 + * return Pm_GetDefaultInputDeviceID() + * + * def GetDefaultOutputDeviceID(): # <<<<<<<<<<<<<< + * return Pm_GetDefaultOutputDeviceID() + * + */ + +static PyObject *__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("GetDefaultOutputDeviceID"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":151 + * + * def GetDefaultOutputDeviceID(): + * return Pm_GetDefaultOutputDeviceID() # <<<<<<<<<<<<<< + * + * def CountDevices(): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_to_py_PmDeviceID(Pm_GetDefaultOutputDeviceID()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.GetDefaultOutputDeviceID"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":153 + * return Pm_GetDefaultOutputDeviceID() + * + * def CountDevices(): # <<<<<<<<<<<<<< + * return Pm_CountDevices() + * + */ + +static PyObject *__pyx_pf_11_pyportmidi_CountDevices(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_11_pyportmidi_CountDevices(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("CountDevices"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":154 + * + * def CountDevices(): + * return Pm_CountDevices() # <<<<<<<<<<<<<< + * + * def GetDeviceInfo(i): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromLong(Pm_CountDevices()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.CountDevices"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":156 + * return Pm_CountDevices() + * + * def GetDeviceInfo(i): # <<<<<<<<<<<<<< + * """ + * GetDeviceInfo(<device number>): returns 5 parameters + */ + +static PyObject *__pyx_pf_11_pyportmidi_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i); /*proto*/ +static char __pyx_doc_11_pyportmidi_GetDeviceInfo[] = "\nGetDeviceInfo(<device number>): returns 5 parameters\n - underlying MIDI API\n - device name\n - TRUE iff input is available\n - TRUE iff output is available\n - TRUE iff device stream is already open\n "; +static PyObject *__pyx_pf_11_pyportmidi_GetDeviceInfo(PyObject *__pyx_self, PyObject *__pyx_v_i) { + PmDeviceInfo *__pyx_v_info; + PyObject *__pyx_r = NULL; + PmDeviceID __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + __Pyx_RefNannySetupContext("GetDeviceInfo"); + __pyx_self = __pyx_self; + __Pyx_INCREF(__pyx_v_i); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":168 + * + * # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const. + * info = <PmDeviceInfo *>Pm_GetDeviceInfo(i) # <<<<<<<<<<<<<< + * + * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened + */ + __pyx_t_1 = __Pyx_PyInt_from_py_PmDeviceID(__pyx_v_i); if (unlikely((__pyx_t_1 == (PmDeviceID)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_info = ((PmDeviceInfo *)Pm_GetDeviceInfo(__pyx_t_1)); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":170 + * info = <PmDeviceInfo *>Pm_GetDeviceInfo(i) + * + * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened # <<<<<<<<<<<<<< + * else: return + * + */ + __pyx_t_2 = (__pyx_v_info != NULL); + if (__pyx_t_2) { + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_info->interf); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_3)); + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_info->name); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_4)); + __pyx_t_5 = PyInt_FromLong(__pyx_v_info->input); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyInt_FromLong(__pyx_v_info->output); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyInt_FromLong(__pyx_v_info->opened); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = PyTuple_New(5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_t_3)); + __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); + PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_t_4)); + __Pyx_GIVEREF(((PyObject *)__pyx_t_4)); + PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L0; + goto __pyx_L5; + } + /*else*/ { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":171 + * + * if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened + * else: return # <<<<<<<<<<<<<< + * + * def Time(): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + } + __pyx_L5:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_pyportmidi.GetDeviceInfo"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_i); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":173 + * else: return + * + * def Time(): # <<<<<<<<<<<<<< + * """ + * Time() returns the current time in ms + */ + +static PyObject *__pyx_pf_11_pyportmidi_Time(PyObject *__pyx_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_Time[] = "\nTime() returns the current time in ms\nof the PortMidi timer\n "; +static PyObject *__pyx_pf_11_pyportmidi_Time(PyObject *__pyx_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("Time"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":178 + * of the PortMidi timer + * """ + * return Pt_Time() # <<<<<<<<<<<<<< + * + * def GetErrorText(err): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_to_py_PtTimestamp(Pt_Time()); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.Time"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":180 + * return Pt_Time() + * + * def GetErrorText(err): # <<<<<<<<<<<<<< + * """ + * GetErrorText(<err num>) returns human-readable error + */ + +static PyObject *__pyx_pf_11_pyportmidi_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err); /*proto*/ +static char __pyx_doc_11_pyportmidi_GetErrorText[] = "\nGetErrorText(<err num>) returns human-readable error\nmessages translated from error numbers\n "; +static PyObject *__pyx_pf_11_pyportmidi_GetErrorText(PyObject *__pyx_self, PyObject *__pyx_v_err) { + PyObject *__pyx_r = NULL; + PmError __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("GetErrorText"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":185 + * messages translated from error numbers + * """ + * return Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * def Channel(chan): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __pyx_r = ((PyObject *)__pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.GetErrorText"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":187 + * return Pm_GetErrorText(err) + * + * def Channel(chan): # <<<<<<<<<<<<<< + * """ + * Channel(<chan>) is used with ChannelMask on input MIDI streams. + */ + +static PyObject *__pyx_pf_11_pyportmidi_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan); /*proto*/ +static char __pyx_doc_11_pyportmidi_Channel[] = "\nChannel(<chan>) is used with ChannelMask on input MIDI streams.\nExample: to receive input on channels 1 and 10 on a MIDI\n stream called MidiIn:\nMidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10))\n\nnote: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n "; +static PyObject *__pyx_pf_11_pyportmidi_Channel(PyObject *__pyx_self, PyObject *__pyx_v_chan) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + __Pyx_RefNannySetupContext("Channel"); + __pyx_self = __pyx_self; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":199 + * all numbered from 0 to 15 instead of 1 to 16. + * """ + * return Pm_Channel(chan-1) # <<<<<<<<<<<<<< + * + * cdef class Output: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyNumber_Subtract(__pyx_v_chan, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyInt_FromLong(Pm_Channel(__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.Channel"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":214 + * cdef int _aborted + * + * def __init__(self, OutputDevice, latency=0): # <<<<<<<<<<<<<< + * + * cdef PmError err + */ + +static int __pyx_pf_11_pyportmidi_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pf_11_pyportmidi_6Output___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_OutputDevice = 0; + PyObject *__pyx_v_latency = 0; + PmError __pyx_v_err; + PmTimeProcPtr __pyx_v_PmPtr; + PyObject *__pyx_v_s; + int __pyx_r; + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + long __pyx_t_4; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__OutputDevice,&__pyx_n_s__latency,0}; + __Pyx_RefNannySetupContext("__init__"); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); + PyObject* values[2] = {0,0}; + values[1] = ((PyObject *)__pyx_int_0); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 0: + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__OutputDevice); + if (likely(values[0])) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 1) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__latency); + if (unlikely(value)) { values[1] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + __pyx_v_OutputDevice = values[0]; + __pyx_v_latency = values[1]; + } else { + __pyx_v_latency = ((PyObject *)__pyx_int_0); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: __pyx_v_latency = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: __pyx_v_OutputDevice = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_pyportmidi.Output.__init__"); + return -1; + __pyx_L4_argument_unpacking_done:; + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_OutputDevice); + __Pyx_INCREF(__pyx_v_latency); + __pyx_v_s = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":220 + * cdef PmTimeProcPtr PmPtr + * + * self.i = OutputDevice # <<<<<<<<<<<<<< + * self.debug = 0 + * self._aborted = 0 + */ + __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_OutputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->i = __pyx_t_1; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":221 + * + * self.i = OutputDevice + * self.debug = 0 # <<<<<<<<<<<<<< + * self._aborted = 0 + * + */ + ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":222 + * self.i = OutputDevice + * self.debug = 0 + * self._aborted = 0 # <<<<<<<<<<<<<< + * + * if latency == 0: + */ + ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":224 + * self._aborted = 0 + * + * if latency == 0: # <<<<<<<<<<<<<< + * PmPtr = NULL + * else: + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_latency, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":225 + * + * if latency == 0: + * PmPtr = NULL # <<<<<<<<<<<<<< + * else: + * PmPtr = <PmTimeProcPtr>&Pt_Time + */ + __pyx_v_PmPtr = NULL; + goto __pyx_L6; + } + /*else*/ { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":227 + * PmPtr = NULL + * else: + * PmPtr = <PmTimeProcPtr>&Pt_Time # <<<<<<<<<<<<<< + * if self.debug: print "Opening Midi Output" + * # Why is bufferSize 0 here? + */ + __pyx_v_PmPtr = ((PmTimestamp (*)(void *))(&Pt_Time)); + } + __pyx_L6:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":228 + * else: + * PmPtr = <PmTimeProcPtr>&Pt_Time + * if self.debug: print "Opening Midi Output" # <<<<<<<<<<<<<< + * # Why is bufferSize 0 here? + * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) + */ + __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug; + if (__pyx_t_1) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":230 + * if self.debug: print "Opening Midi Output" + * # Why is bufferSize 0 here? + * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) # <<<<<<<<<<<<<< + * if err < 0: + * s = Pm_GetErrorText(err) + */ + __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_latency); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_OpenOutput((&((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi), ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->i, NULL, 0, __pyx_v_PmPtr, NULL, __pyx_t_4); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":231 + * # Why is bufferSize 0 here? + * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) + * if err < 0: # <<<<<<<<<<<<<< + * s = Pm_GetErrorText(err) + * # Something's amiss here - if we try to throw an Exception + */ + __pyx_t_3 = (__pyx_v_err < 0); + if (__pyx_t_3) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":232 + * err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) + * if err < 0: + * s = Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * # Something's amiss here - if we try to throw an Exception + * # here, we crash. + */ + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_DECREF(__pyx_v_s); + __pyx_v_s = ((PyObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":235 + * # Something's amiss here - if we try to throw an Exception + * # here, we crash. + * if not err == -10000: # <<<<<<<<<<<<<< + * raise Exception,s + * else: + */ + __pyx_t_3 = (!(__pyx_v_err == -10000)); + if (__pyx_t_3) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":236 + * # here, we crash. + * if not err == -10000: + * raise Exception,s # <<<<<<<<<<<<<< + * else: + * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s + */ + __Pyx_Raise(__pyx_builtin_Exception, __pyx_v_s, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L9; + } + /*else*/ { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":238 + * raise Exception,s + * else: + * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_kp_s_2)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_2)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_2)); + __Pyx_INCREF(__pyx_v_OutputDevice); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_OutputDevice); + __Pyx_GIVEREF(__pyx_v_OutputDevice); + __Pyx_INCREF(((PyObject *)__pyx_kp_s_3)); + PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_kp_s_3)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_3)); + __Pyx_INCREF(__pyx_v_s); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_s); + __Pyx_GIVEREF(__pyx_v_s); + if (__Pyx_Print(__pyx_t_2, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } + __pyx_L9:; + goto __pyx_L8; + } + __pyx_L8:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.Output.__init__"); + __pyx_r = -1; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_s); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_OutputDevice); + __Pyx_DECREF(__pyx_v_latency); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":240 + * print "Unable to open Midi OutputDevice=",OutputDevice," err=",s + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * if self.debug: print "Closing MIDI output stream and destroying instance" + * #err = Pm_Abort(self.midi) + */ + +static void __pyx_pf_11_pyportmidi_6Output___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pf_11_pyportmidi_6Output___dealloc__(PyObject *__pyx_v_self) { + PyObject *__pyx_v_err; + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PmError __pyx_t_4; + __Pyx_RefNannySetupContext("__dealloc__"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":241 + * + * def __dealloc__(self): + * if self.debug: print "Closing MIDI output stream and destroying instance" # <<<<<<<<<<<<<< + * #err = Pm_Abort(self.midi) + * #if err < 0: raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug; + if (__pyx_t_1) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":244 + * #err = Pm_Abort(self.midi) + * #if err < 0: raise Exception, Pm_GetErrorText(err) + * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_t_2 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_v_err); + __pyx_v_err = __pyx_t_2; + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":245 + * #if err < 0: raise Exception, Pm_GetErrorText(err) + * err = Pm_Close(self.midi) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + __pyx_t_4 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.Output.__dealloc__"); + __pyx_L0:; + __Pyx_DECREF(__pyx_v_err); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":248 + * + * + * def _check_open(self): # <<<<<<<<<<<<<< + * """ checks to see if the midi is open, and if not, raises an error. + * """ + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output__check_open(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("_check_open"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":252 + * """ + * + * if self.midi == NULL: # <<<<<<<<<<<<<< + * raise Exception, "midi Output not open." + * + */ + __pyx_t_1 = (((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi == NULL); + if (__pyx_t_1) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":253 + * + * if self.midi == NULL: + * raise Exception, "midi Output not open." # <<<<<<<<<<<<<< + * + * if self._aborted: + */ + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_5), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":255 + * raise Exception, "midi Output not open." + * + * if self._aborted: # <<<<<<<<<<<<<< + * raise Exception, "midi Output aborted. Need to call Close after Abort." + * + */ + __pyx_t_2 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted; + if (__pyx_t_2) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":256 + * + * if self._aborted: + * raise Exception, "midi Output aborted. Need to call Close after Abort." # <<<<<<<<<<<<<< + * + * def Close(self): + */ + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_6), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pyportmidi.Output._check_open"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":258 + * raise Exception, "midi Output aborted. Need to call Close after Abort." + * + * def Close(self): # <<<<<<<<<<<<<< + * """ + * Close() + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output_Close(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PmError __pyx_t_3; + __Pyx_RefNannySetupContext("Close"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":268 + * # return + * + * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< + * if err < 0: + * raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_v_err); + __pyx_v_err = __pyx_t_1; + __pyx_t_1 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":269 + * + * err = Pm_Close(self.midi) + * if err < 0: # <<<<<<<<<<<<<< + * raise Exception, Pm_GetErrorText(err) + * #self.midi = NULL + */ + __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":270 + * err = Pm_Close(self.midi) + * if err < 0: + * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * #self.midi = NULL + * + */ + __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.Output.Close"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_err); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":274 + * + * + * def Abort(self): # <<<<<<<<<<<<<< + * """ + * Abort() terminates outgoing messages immediately + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output_Abort[] = "\nAbort() terminates outgoing messages immediately\n The caller should immediately close the output port;\n this call may result in transmission of a partial midi message.\n There is no abort for Midi input because the user can simply\n ignore messages in the buffer and close an input device at\n any time.\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output_Abort(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PmError __pyx_t_3; + __Pyx_RefNannySetupContext("Abort"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":286 + * # return + * + * err = Pm_Abort(self.midi) # <<<<<<<<<<<<<< + * if err < 0: + * raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_1 = PyInt_FromLong(Pm_Abort(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_v_err); + __pyx_v_err = __pyx_t_1; + __pyx_t_1 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":287 + * + * err = Pm_Abort(self.midi) + * if err < 0: # <<<<<<<<<<<<<< + * raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":288 + * err = Pm_Abort(self.midi) + * if err < 0: + * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * self._aborted = 1 + */ + __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":290 + * raise Exception, Pm_GetErrorText(err) + * + * self._aborted = 1 # <<<<<<<<<<<<<< + * + * + */ + ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->_aborted = 1; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.Output.Abort"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_err); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":293 + * + * + * def Write(self, data): # <<<<<<<<<<<<<< + * """ + * Write(data) + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output_Write[] = "\nWrite(data)\n output a series of MIDI information in the form of a list:\n Write([[[status <,data1><,data2><,data3>],timestamp],\n [[status <,data1><,data2><,data3>],timestamp],...])\n <data> fields are optional\n example: choose program change 1 at time 20000 and\n send note 65 with velocity 100 500 ms later.\n Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]])\n notes:\n 1. timestamps will be ignored if latency = 0.\n 2. To get a note to play immediately, send MIDI info with\n timestamp read from function Time.\n 3. understanding optional data fields:\n Write([[[0xc0,0,0],20000]]) is equivalent to\n Write([[[0xc0],20000]])\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output_Write(PyObject *__pyx_v_self, PyObject *__pyx_v_data) { + PmEvent __pyx_v_buffer[1024]; + PmError __pyx_v_err; + int __pyx_v_i; + PyObject *__pyx_v_loop1; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + Py_ssize_t __pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PmMessage __pyx_t_11; + PmTimestamp __pyx_t_12; + __Pyx_RefNannySetupContext("Write"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_data); + __pyx_v_loop1 = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":315 + * cdef int i + * + * self._check_open() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":318 + * + * + * if len(data) > 1024: raise IndexError, 'maximum list length is 1024' # <<<<<<<<<<<<<< + * else: + * for loop1 in range(len(data)): + */ + __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = (__pyx_t_3 > 1024); + if (__pyx_t_4) { + __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_7), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + /*else*/ { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":320 + * if len(data) > 1024: raise IndexError, 'maximum list length is 1024' + * else: + * for loop1 in range(len(data)): # <<<<<<<<<<<<<< + * if ((len(data[loop1][0]) > 4) | + * (len(data[loop1][0]) < 1)): + */ + __pyx_t_5 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) { + __pyx_t_3 = 0; __pyx_t_1 = __pyx_t_2; __Pyx_INCREF(__pyx_t_1); + } else { + __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + for (;;) { + if (likely(PyList_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break; + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; + } else if (likely(PyTuple_CheckExact(__pyx_t_1))) { + if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++; + } else { + __pyx_t_2 = PyIter_Next(__pyx_t_1); + if (!__pyx_t_2) { + if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + break; + } + __Pyx_GOTREF(__pyx_t_2); + } + __Pyx_DECREF(__pyx_v_loop1); + __pyx_v_loop1 = __pyx_t_2; + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":321 + * else: + * for loop1 in range(len(data)): + * if ((len(data[loop1][0]) > 4) | # <<<<<<<<<<<<<< + * (len(data[loop1][0]) < 1)): + * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' + */ + __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":322 + * for loop1 in range(len(data)): + * if ((len(data[loop1][0]) > 4) | + * (len(data[loop1][0]) < 1)): # <<<<<<<<<<<<<< + * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' + * buffer[loop1].message = 0 + */ + __pyx_t_6 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_4 = ((__pyx_t_5 > 4) | (__pyx_t_7 < 1)); + if (__pyx_t_4) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":323 + * if ((len(data[loop1][0]) > 4) | + * (len(data[loop1][0]) < 1)): + * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' # <<<<<<<<<<<<<< + * buffer[loop1].message = 0 + * for i in range(len(data[loop1][0])): + */ + __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = PyObject_Call(((PyObject *)((PyObject*)&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_t_6, ((PyObject *)__pyx_kp_s_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_builtin_IndexError, __pyx_t_2, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L8; + } + __pyx_L8:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":324 + * (len(data[loop1][0]) < 1)): + * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' + * buffer[loop1].message = 0 # <<<<<<<<<<<<<< + * for i in range(len(data[loop1][0])): + * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) + */ + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_buffer[__pyx_t_7]).message = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":325 + * raise IndexError, str(len(data[loop1][0]))+' arguments in event list' + * buffer[loop1].message = 0 + * for i in range(len(data[loop1][0])): # <<<<<<<<<<<<<< + * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) + * buffer[loop1].timestamp = data[loop1][1] + */ + __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_7 = PyObject_Length(__pyx_t_6); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) { + __pyx_v_i = __pyx_t_8; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":326 + * buffer[loop1].message = 0 + * for i in range(len(data[loop1][0])): + * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) # <<<<<<<<<<<<<< + * buffer[loop1].timestamp = data[loop1][1] + * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp + */ + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = __Pyx_PyInt_to_py_PmMessage((__pyx_v_buffer[__pyx_t_5]).message); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_9, __pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_9 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyInt_FromLong((8 * __pyx_v_i)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_10 = PyNumber_Lshift(__pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Add(__pyx_t_6, __pyx_t_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_11 = __Pyx_PyInt_from_py_PmMessage(__pyx_t_2); if (unlikely((__pyx_t_11 == (PmMessage)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_buffer[__pyx_t_5]).message = __pyx_t_11; + } + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":327 + * for i in range(len(data[loop1][0])): + * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) + * buffer[loop1].timestamp = data[loop1][1] # <<<<<<<<<<<<<< + * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp + * if self.debug: print "writing to midi buffer" + */ + __pyx_t_2 = PyObject_GetItem(__pyx_v_data, __pyx_v_loop1); if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_2, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_12 = __Pyx_PyInt_from_py_PmTimestamp(__pyx_t_10); if (unlikely((__pyx_t_12 == (PmTimestamp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + (__pyx_v_buffer[__pyx_t_5]).timestamp = __pyx_t_12; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":328 + * buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) + * buffer[loop1].timestamp = data[loop1][1] + * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp # <<<<<<<<<<<<<< + * if self.debug: print "writing to midi buffer" + * err= Pm_Write(self.midi, buffer, len(data)) + */ + __pyx_t_8 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug; + if (__pyx_t_8) { + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_10 = __Pyx_PyInt_to_py_PmMessage((__pyx_v_buffer[__pyx_t_5]).message); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop1); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyInt_to_py_PmTimestamp((__pyx_v_buffer[__pyx_t_5]).timestamp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = PyTuple_New(5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v_loop1); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_loop1); + __Pyx_GIVEREF(__pyx_v_loop1); + __Pyx_INCREF(((PyObject *)__pyx_kp_s_9)); + PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_kp_s_9)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_9)); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_10); + __Pyx_INCREF(((PyObject *)__pyx_kp_s_9)); + PyTuple_SET_ITEM(__pyx_t_6, 3, ((PyObject *)__pyx_kp_s_9)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_9)); + PyTuple_SET_ITEM(__pyx_t_6, 4, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_10 = 0; + __pyx_t_2 = 0; + if (__Pyx_Print(__pyx_t_6, 1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L11; + } + __pyx_L11:; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":329 + * buffer[loop1].timestamp = data[loop1][1] + * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp + * if self.debug: print "writing to midi buffer" # <<<<<<<<<<<<<< + * err= Pm_Write(self.midi, buffer, len(data)) + * if err < 0: raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_8 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug; + if (__pyx_t_8) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_10)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L12; + } + __pyx_L12:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":330 + * if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp + * if self.debug: print "writing to midi buffer" + * err= Pm_Write(self.midi, buffer, len(data)) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_t_3 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_Write(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_3); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":331 + * if self.debug: print "writing to midi buffer" + * err= Pm_Write(self.midi, buffer, len(data)) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * def WriteShort(self, status, data1 = 0, data2 = 0): + */ + __pyx_t_4 = (__pyx_v_err < 0); + if (__pyx_t_4) { + __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L13; + } + __pyx_L13:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("_pyportmidi.Output.Write"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_loop1); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_data); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":333 + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + * def WriteShort(self, status, data1 = 0, data2 = 0): # <<<<<<<<<<<<<< + * """ + * WriteShort(status <, data1><, data2>) + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output_WriteShort[] = "\nWriteShort(status <, data1><, data2>)\n output MIDI information of 3 bytes or less.\n data fields are optional\n status byte could be:\n 0xc0 = program change\n 0x90 = note on\n etc.\n data bytes are optional and assumed 0 if omitted\n example: note 65 on with velocity 100\n WriteShort(0x90,65,100)\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteShort(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_status = 0; + PyObject *__pyx_v_data1 = 0; + PyObject *__pyx_v_data2 = 0; + PmEvent __pyx_v_buffer[1]; + PmError __pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PmMessage __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__status,&__pyx_n_s__data1,&__pyx_n_s__data2,0}; + __Pyx_RefNannySetupContext("WriteShort"); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); + PyObject* values[3] = {0,0,0}; + values[1] = ((PyObject *)__pyx_int_0); + values[2] = ((PyObject *)__pyx_int_0); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 0: + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__status); + if (likely(values[0])) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 1) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__data1); + if (unlikely(value)) { values[1] = value; kw_args--; } + } + case 2: + if (kw_args > 1) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__data2); + if (unlikely(value)) { values[2] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteShort") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + __pyx_v_status = values[0]; + __pyx_v_data1 = values[1]; + __pyx_v_data2 = values[2]; + } else { + __pyx_v_data1 = ((PyObject *)__pyx_int_0); + __pyx_v_data2 = ((PyObject *)__pyx_int_0); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 3: __pyx_v_data2 = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: __pyx_v_data1 = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: __pyx_v_status = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("WriteShort", 0, 1, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_pyportmidi.Output.WriteShort"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_status); + __Pyx_INCREF(__pyx_v_data1); + __Pyx_INCREF(__pyx_v_data2); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":348 + * cdef PmEvent buffer[1] + * cdef PmError err + * self._check_open() # <<<<<<<<<<<<<< + * + * buffer[0].timestamp = Pt_Time() + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":350 + * self._check_open() + * + * buffer[0].timestamp = Pt_Time() # <<<<<<<<<<<<<< + * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) + * if self.debug: print "Writing to MIDI buffer" + */ + (__pyx_v_buffer[0]).timestamp = Pt_Time(); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":351 + * + * buffer[0].timestamp = Pt_Time() + * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) # <<<<<<<<<<<<<< + * if self.debug: print "Writing to MIDI buffer" + * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length + */ + __pyx_t_2 = PyNumber_Lshift(__pyx_v_data2, __pyx_int_16); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF0000); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Lshift(__pyx_v_data1, __pyx_int_8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyNumber_And(__pyx_t_2, __pyx_int_0xFF00); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Or(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyNumber_And(__pyx_v_status, __pyx_int_0xFF); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = PyNumber_Or(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_4 = __Pyx_PyInt_from_py_PmMessage(__pyx_t_1); if (unlikely((__pyx_t_4 == (PmMessage)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + (__pyx_v_buffer[0]).message = __pyx_t_4; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":352 + * buffer[0].timestamp = Pt_Time() + * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) + * if self.debug: print "Writing to MIDI buffer" # <<<<<<<<<<<<<< + * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length + * if err < 0 : raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_5 = ((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->debug; + if (__pyx_t_5) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_11)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":353 + * buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) + * if self.debug: print "Writing to MIDI buffer" + * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length # <<<<<<<<<<<<<< + * if err < 0 : raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_v_err = Pm_Write(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_v_buffer, 1); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":354 + * if self.debug: print "Writing to MIDI buffer" + * err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length + * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * def WriteSysEx(self, when, msg): + */ + __pyx_t_6 = (__pyx_v_err < 0); + if (__pyx_t_6) { + __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pyportmidi.Output.WriteShort"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_status); + __Pyx_DECREF(__pyx_v_data1); + __Pyx_DECREF(__pyx_v_data2); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":356 + * if err < 0 : raise Exception, Pm_GetErrorText(err) + * + * def WriteSysEx(self, when, msg): # <<<<<<<<<<<<<< + * """ + * WriteSysEx(<timestamp>,<msg>) + */ + +static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_11_pyportmidi_6Output_WriteSysEx[] = "\n WriteSysEx(<timestamp>,<msg>)\n writes a timestamped system-exclusive midi message.\n <msg> can be a *list* or a *string*\n example:\n (assuming y is an input MIDI stream)\n y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7')\n is equivalent to\n y.WriteSysEx(pypm.Time,\n [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7])\n "; +static PyObject *__pyx_pf_11_pyportmidi_6Output_WriteSysEx(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_when = 0; + PyObject *__pyx_v_msg = 0; + PmError __pyx_v_err; + char *__pyx_v_cmsg; + PtTimestamp __pyx_v_CurTime; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + PmTimestamp __pyx_t_6; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__when,&__pyx_n_s__msg,0}; + __Pyx_RefNannySetupContext("WriteSysEx"); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); + PyObject* values[2] = {0,0}; + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 0: + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__when); + if (likely(values[0])) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__msg); + if (likely(values[1])) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "WriteSysEx") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + __pyx_v_when = values[0]; + __pyx_v_msg = values[1]; + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + __pyx_v_when = PyTuple_GET_ITEM(__pyx_args, 0); + __pyx_v_msg = PyTuple_GET_ITEM(__pyx_args, 1); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("WriteSysEx", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_pyportmidi.Output.WriteSysEx"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_when); + __Pyx_INCREF(__pyx_v_msg); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":372 + * cdef PtTimestamp CurTime + * + * self._check_open() # <<<<<<<<<<<<<< + * + * if type(msg) is list: + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":374 + * self._check_open() + * + * if type(msg) is list: # <<<<<<<<<<<<<< + * msg = array.array('B',msg).tostring() # Markus Pfaff contribution + * cmsg = msg + */ + __pyx_t_3 = (((PyObject *)Py_TYPE(__pyx_v_msg)) == ((PyObject *)((PyObject*)&PyList_Type))); + if (__pyx_t_3) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":375 + * + * if type(msg) is list: + * msg = array.array('B',msg).tostring() # Markus Pfaff contribution # <<<<<<<<<<<<<< + * cmsg = msg + * + */ + __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__array); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__array); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_n_s__B)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s__B)); + __Pyx_GIVEREF(((PyObject *)__pyx_n_s__B)); + __Pyx_INCREF(__pyx_v_msg); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_msg); + __Pyx_GIVEREF(__pyx_v_msg); + __pyx_t_4 = PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__tostring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_v_msg); + __pyx_v_msg = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L6; + } + __pyx_L6:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":376 + * if type(msg) is list: + * msg = array.array('B',msg).tostring() # Markus Pfaff contribution + * cmsg = msg # <<<<<<<<<<<<<< + * + * CurTime = Pt_Time() + */ + __pyx_t_5 = __Pyx_PyBytes_AsString(__pyx_v_msg); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_cmsg = __pyx_t_5; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":378 + * cmsg = msg + * + * CurTime = Pt_Time() # <<<<<<<<<<<<<< + * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) + * if err < 0 : raise Exception, Pm_GetErrorText(err) + */ + __pyx_v_CurTime = Pt_Time(); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":379 + * + * CurTime = Pt_Time() + * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) # <<<<<<<<<<<<<< + * if err < 0 : raise Exception, Pm_GetErrorText(err) + * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my + */ + __pyx_t_6 = __Pyx_PyInt_from_py_PmTimestamp(__pyx_v_when); if (unlikely((__pyx_t_6 == (PmTimestamp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_WriteSysEx(((struct __pyx_obj_11_pyportmidi_Output *)__pyx_v_self)->midi, __pyx_t_6, ((unsigned char *)__pyx_v_cmsg)); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":380 + * CurTime = Pt_Time() + * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) + * if err < 0 : raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my + * pass # win32 machine crashes w/ multiple SysEx + */ + __pyx_t_3 = (__pyx_v_err < 0); + if (__pyx_t_3) { + __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_4)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":381 + * err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) + * if err < 0 : raise Exception, Pm_GetErrorText(err) + * while Pt_Time() == CurTime: # wait for SysEx to go thru or...my # <<<<<<<<<<<<<< + * pass # win32 machine crashes w/ multiple SysEx + * + */ + while (1) { + __pyx_t_3 = (Pt_Time() == __pyx_v_CurTime); + if (!__pyx_t_3) break; + } + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pyportmidi.Output.WriteSysEx"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_when); + __Pyx_DECREF(__pyx_v_msg); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":404 + * cdef int i + * + * def __init__(self, InputDevice, buffersize=4096): # <<<<<<<<<<<<<< + * cdef PmError err + * self.i = InputDevice + */ + +static int __pyx_pf_11_pyportmidi_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pf_11_pyportmidi_5Input___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_InputDevice = 0; + PyObject *__pyx_v_buffersize = 0; + PmError __pyx_v_err; + int __pyx_r; + int __pyx_t_1; + long __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__InputDevice,&__pyx_n_s__buffersize,0}; + __Pyx_RefNannySetupContext("__init__"); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); + PyObject* values[2] = {0,0}; + values[1] = ((PyObject *)__pyx_int_4096); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 0: + values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__InputDevice); + if (likely(values[0])) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 1) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__buffersize); + if (unlikely(value)) { values[1] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + __pyx_v_InputDevice = values[0]; + __pyx_v_buffersize = values[1]; + } else { + __pyx_v_buffersize = ((PyObject *)__pyx_int_4096); + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: __pyx_v_buffersize = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: __pyx_v_InputDevice = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_pyportmidi.Input.__init__"); + return -1; + __pyx_L4_argument_unpacking_done:; + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_InputDevice); + __Pyx_INCREF(__pyx_v_buffersize); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":406 + * def __init__(self, InputDevice, buffersize=4096): + * cdef PmError err + * self.i = InputDevice # <<<<<<<<<<<<<< + * self.debug = 0 + * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) + */ + __pyx_t_1 = __Pyx_PyInt_AsInt(__pyx_v_InputDevice); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->i = __pyx_t_1; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":407 + * cdef PmError err + * self.i = InputDevice + * self.debug = 0 # <<<<<<<<<<<<<< + * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) + * if err < 0: raise Exception, Pm_GetErrorText(err) + */ + ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":408 + * self.i = InputDevice + * self.debug = 0 + * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * if self.debug: print "MIDI input opened." + */ + __pyx_t_2 = __Pyx_PyInt_AsLong(__pyx_v_buffersize); if (unlikely((__pyx_t_2 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_OpenInput((&((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi), ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->i, NULL, __pyx_t_2, (&Pt_Time), NULL); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":409 + * self.debug = 0 + * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * if self.debug: print "MIDI input opened." + * + */ + __pyx_t_3 = (__pyx_v_err < 0); + if (__pyx_t_3) { + __pyx_t_4 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_4)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_4), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":410 + * err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) + * if err < 0: raise Exception, Pm_GetErrorText(err) + * if self.debug: print "MIDI input opened." # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug; + if (__pyx_t_1) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_12)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_pyportmidi.Input.__init__"); + __pyx_r = -1; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_InputDevice); + __Pyx_DECREF(__pyx_v_buffersize); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":412 + * if self.debug: print "MIDI input opened." + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * cdef PmError err + * if self.debug: print "Closing MIDI input stream and destroying instance" + */ + +static void __pyx_pf_11_pyportmidi_5Input___dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pf_11_pyportmidi_5Input___dealloc__(PyObject *__pyx_v_self) { + PmError __pyx_v_err; + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + __Pyx_RefNannySetupContext("__dealloc__"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":414 + * def __dealloc__(self): + * cdef PmError err + * if self.debug: print "Closing MIDI input stream and destroying instance" # <<<<<<<<<<<<<< + * + * err = Pm_Close(self.midi) + */ + __pyx_t_1 = ((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->debug; + if (__pyx_t_1) { + if (__Pyx_PrintOne(((PyObject *)__pyx_kp_s_13)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":416 + * if self.debug: print "Closing MIDI input stream and destroying instance" + * + * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< + * if err < 0: + * raise Exception, Pm_GetErrorText(err) + */ + __pyx_v_err = Pm_Close(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":417 + * + * err = Pm_Close(self.midi) + * if err < 0: # <<<<<<<<<<<<<< + * raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_t_2 = (__pyx_v_err < 0); + if (__pyx_t_2) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":418 + * err = Pm_Close(self.midi) + * if err < 0: + * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_3 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_3)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_3), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_pyportmidi.Input.__dealloc__"); + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":422 + * + * + * def _check_open(self): # <<<<<<<<<<<<<< + * """ checks to see if the midi is open, and if not, raises an error. + * """ + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input__check_open[] = " checks to see if the midi is open, and if not, raises an error.\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input__check_open(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + int __pyx_t_1; + __Pyx_RefNannySetupContext("_check_open"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":426 + * """ + * + * if self.midi == NULL: # <<<<<<<<<<<<<< + * raise Exception, "midi Input not open." + * + */ + __pyx_t_1 = (((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi == NULL); + if (__pyx_t_1) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":427 + * + * if self.midi == NULL: + * raise Exception, "midi Input not open." # <<<<<<<<<<<<<< + * + * + */ + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_kp_s_14), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("_pyportmidi.Input._check_open"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":430 + * + * + * def Close(self): # <<<<<<<<<<<<<< + * """ + * Close() + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input_Close(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input_Close[] = "\nClose()\n closes a midi stream, flushing any pending buffers.\n (PortMidi attempts to close open streams when the application\n exits -- this is particularly difficult under Windows.)\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input_Close(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PmError __pyx_t_3; + __Pyx_RefNannySetupContext("Close"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __pyx_v_err = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":440 + * # return + * + * err = Pm_Close(self.midi) # <<<<<<<<<<<<<< + * if err < 0: + * raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_1 = PyInt_FromLong(Pm_Close(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_v_err); + __pyx_v_err = __pyx_t_1; + __pyx_t_1 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":441 + * + * err = Pm_Close(self.midi) + * if err < 0: # <<<<<<<<<<<<<< + * raise Exception, Pm_GetErrorText(err) + * #self.midi = NULL + */ + __pyx_t_1 = PyObject_RichCompare(__pyx_v_err, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":442 + * err = Pm_Close(self.midi) + * if err < 0: + * raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * #self.midi = NULL + * + */ + __pyx_t_3 = ((PmError)PyInt_AsLong(__pyx_v_err)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_1), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_pyportmidi.Input.Close"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_err); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":447 + * + * + * def SetFilter(self, filters): # <<<<<<<<<<<<<< + * """ + * SetFilter(<filters>) sets filters on an open input stream + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input_SetFilter[] = "\n SetFilter(<filters>) sets filters on an open input stream\n to drop selected input types. By default, only active sensing\n messages are filtered. To prohibit, say, active sensing and\n sysex messages, call\n SetFilter(stream, FILT_ACTIVE | FILT_SYSEX);\n\n Filtering is useful when midi routing or midi thru functionality\n is being provided by the user application.\n For example, you may want to exclude timing messages\n (clock, MTC, start/stop/continue), while allowing note-related\n messages to pass. Or you may be using a sequencer or drum-machine\n for MIDI clock information but want to exclude any notes\n it may play.\n\n Note: SetFilter empties the buffer after setting the filter,\n just in case anything got through.\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input_SetFilter(PyObject *__pyx_v_self, PyObject *__pyx_v_filters) { + PmEvent __pyx_v_buffer[1]; + PmError __pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + long __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("SetFilter"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_filters); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":469 + * cdef PmError err + * + * self._check_open() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":472 + * + * + * err = Pm_SetFilter(self.midi, filters) # <<<<<<<<<<<<<< + * + * if err < 0: raise Exception, Pm_GetErrorText(err) + */ + __pyx_t_3 = __Pyx_PyInt_AsLong(__pyx_v_filters); if (unlikely((__pyx_t_3 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_SetFilter(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_t_3); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":474 + * err = Pm_SetFilter(self.midi, filters) + * + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * while(Pm_Poll(self.midi) != pmNoError): + */ + __pyx_t_4 = (__pyx_v_err < 0); + if (__pyx_t_4) { + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":476 + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + * while(Pm_Poll(self.midi) != pmNoError): # <<<<<<<<<<<<<< + * + * err = Pm_Read(self.midi,buffer,1) + */ + while (1) { + __pyx_t_4 = (Pm_Poll(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi) != pmNoError); + if (!__pyx_t_4) break; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":478 + * while(Pm_Poll(self.midi) != pmNoError): + * + * err = Pm_Read(self.midi,buffer,1) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_v_err = Pm_Read(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_v_buffer, 1); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":479 + * + * err = Pm_Read(self.midi,buffer,1) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * def SetChannelMask(self, mask): + */ + __pyx_t_4 = (__pyx_v_err < 0); + if (__pyx_t_4) { + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L8; + } + __pyx_L8:; + } + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.Input.SetFilter"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_filters); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":481 + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + * def SetChannelMask(self, mask): # <<<<<<<<<<<<<< + * """ + * SetChannelMask(<mask>) filters incoming messages based on channel. + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input_SetChannelMask[] = "\n SetChannelMask(<mask>) filters incoming messages based on channel.\n The mask is a 16-bit bitfield corresponding to appropriate channels\n Channel(<channel>) can assist in calling this function.\n i.e. to set receive only input on channel 1, call with\n SetChannelMask(Channel(1))\n Multiple channels should be OR'd together, like\n SetChannelMask(Channel(10) | Channel(11))\n note: PyPortMidi Channel function has been altered from\n the original PortMidi c call to correct for what\n seems to be a bug --- i.e. channel filters were\n all numbered from 0 to 15 instead of 1 to 16.\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input_SetChannelMask(PyObject *__pyx_v_self, PyObject *__pyx_v_mask) { + PmError __pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + __Pyx_RefNannySetupContext("SetChannelMask"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_mask); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":497 + * cdef PmError err + * + * self._check_open() # <<<<<<<<<<<<<< + * + * err = Pm_SetChannelMask(self.midi,mask) + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":499 + * self._check_open() + * + * err = Pm_SetChannelMask(self.midi,mask) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + */ + __pyx_t_3 = __Pyx_PyInt_AsInt(__pyx_v_mask); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_err = Pm_SetChannelMask(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_t_3); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":500 + * + * err = Pm_SetChannelMask(self.midi,mask) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * + * def Poll(self): + */ + __pyx_t_4 = (__pyx_v_err < 0); + if (__pyx_t_4) { + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.Input.SetChannelMask"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_mask); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":502 + * if err < 0: raise Exception, Pm_GetErrorText(err) + * + * def Poll(self): # <<<<<<<<<<<<<< + * """ + * Poll tests whether input is available, + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input_Poll[] = "\n Poll tests whether input is available,\n returning TRUE, FALSE, or an error value.\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input_Poll(PyObject *__pyx_v_self, PyObject *unused) { + PmError __pyx_v_err; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + __Pyx_RefNannySetupContext("Poll"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":508 + * """ + * cdef PmError err + * self._check_open() # <<<<<<<<<<<<<< + * + * err = Pm_Poll(self.midi) + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":510 + * self._check_open() + * + * err = Pm_Poll(self.midi) # <<<<<<<<<<<<<< + * if err < 0: raise Exception, Pm_GetErrorText(err) + * return err + */ + __pyx_v_err = Pm_Poll(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":511 + * + * err = Pm_Poll(self.midi) + * if err < 0: raise Exception, Pm_GetErrorText(err) # <<<<<<<<<<<<<< + * return err + * + */ + __pyx_t_3 = (__pyx_v_err < 0); + if (__pyx_t_3) { + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_v_err)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":512 + * err = Pm_Poll(self.midi) + * if err < 0: raise Exception, Pm_GetErrorText(err) + * return err # <<<<<<<<<<<<<< + * + * def Read(self,length): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyInt_FromLong(__pyx_v_err); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_pyportmidi.Input.Poll"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":514 + * return err + * + * def Read(self,length): # <<<<<<<<<<<<<< + * """ + * Read(length): returns up to <length> midi events stored in + */ + +static PyObject *__pyx_pf_11_pyportmidi_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length); /*proto*/ +static char __pyx_doc_11_pyportmidi_5Input_Read[] = "\nRead(length): returns up to <length> midi events stored in\nthe buffer and returns them as a list:\n[[[status,data1,data2,data3],timestamp],\n [[status,data1,data2,data3],timestamp],...]\nexample: Read(50) returns all the events in the buffer,\n up to 50 events.\n "; +static PyObject *__pyx_pf_11_pyportmidi_5Input_Read(PyObject *__pyx_v_self, PyObject *__pyx_v_length) { + PmEvent __pyx_v_buffer[1024]; + PyObject *__pyx_v_x; + PyObject *__pyx_v_NumEvents; + PyObject *__pyx_v_loop; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + long __pyx_t_4; + PmError __pyx_t_5; + Py_ssize_t __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + __Pyx_RefNannySetupContext("Read"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + __Pyx_INCREF(__pyx_v_length); + __pyx_v_x = Py_None; __Pyx_INCREF(Py_None); + __pyx_v_NumEvents = Py_None; __Pyx_INCREF(Py_None); + __pyx_v_loop = Py_None; __Pyx_INCREF(Py_None); + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":525 + * cdef PmEvent buffer[1024] + * + * self._check_open() # <<<<<<<<<<<<<< + * + * x = [] + */ + __pyx_t_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s___check_open); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":527 + * self._check_open() + * + * x = [] # <<<<<<<<<<<<<< + * + * if length > 1024: raise IndexError, 'maximum buffer length is 1024' + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_DECREF(__pyx_v_x); + __pyx_v_x = ((PyObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":529 + * x = [] + * + * if length > 1024: raise IndexError, 'maximum buffer length is 1024' # <<<<<<<<<<<<<< + * if length < 1: raise IndexError, 'minimum buffer length is 1' + * NumEvents = Pm_Read(self.midi,buffer,length) + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1024, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_15), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":530 + * + * if length > 1024: raise IndexError, 'maximum buffer length is 1024' + * if length < 1: raise IndexError, 'minimum buffer length is 1' # <<<<<<<<<<<<<< + * NumEvents = Pm_Read(self.midi,buffer,length) + * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_length, __pyx_int_1, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + __Pyx_Raise(__pyx_builtin_IndexError, ((PyObject *)__pyx_kp_s_16), 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":531 + * if length > 1024: raise IndexError, 'maximum buffer length is 1024' + * if length < 1: raise IndexError, 'minimum buffer length is 1' + * NumEvents = Pm_Read(self.midi,buffer,length) # <<<<<<<<<<<<<< + * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) + * x=[] + */ + __pyx_t_4 = __Pyx_PyInt_AsLong(__pyx_v_length); if (unlikely((__pyx_t_4 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = PyInt_FromLong(Pm_Read(((struct __pyx_obj_11_pyportmidi_Input *)__pyx_v_self)->midi, __pyx_v_buffer, __pyx_t_4)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_v_NumEvents); + __pyx_v_NumEvents = __pyx_t_2; + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":532 + * if length < 1: raise IndexError, 'minimum buffer length is 1' + * NumEvents = Pm_Read(self.midi,buffer,length) + * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) # <<<<<<<<<<<<<< + * x=[] + * if NumEvents >= 1: + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_0, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + __pyx_t_5 = ((PmError)PyInt_AsLong(__pyx_v_NumEvents)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __Pyx_PyBytes_FromString(Pm_GetErrorText(__pyx_t_5)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_Raise(__pyx_builtin_Exception, ((PyObject *)__pyx_t_2), 0); + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":533 + * NumEvents = Pm_Read(self.midi,buffer,length) + * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) + * x=[] # <<<<<<<<<<<<<< + * if NumEvents >= 1: + * for loop in range(NumEvents): + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __Pyx_DECREF(__pyx_v_x); + __pyx_v_x = ((PyObject *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":534 + * if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) + * x=[] + * if NumEvents >= 1: # <<<<<<<<<<<<<< + * for loop in range(NumEvents): + * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) + */ + __pyx_t_2 = PyObject_RichCompare(__pyx_v_NumEvents, __pyx_int_1, Py_GE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 534; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_3) { + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":535 + * x=[] + * if NumEvents >= 1: + * for loop in range(NumEvents): # <<<<<<<<<<<<<< + * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) + * return x + */ + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_NumEvents); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_NumEvents); + __Pyx_GIVEREF(__pyx_v_NumEvents); + __pyx_t_1 = PyObject_Call(__pyx_builtin_range, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) { + __pyx_t_6 = 0; __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); + } else { + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (likely(PyList_CheckExact(__pyx_t_2))) { + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break; + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; + } else if (likely(PyTuple_CheckExact(__pyx_t_2))) { + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_1); __pyx_t_6++; + } else { + __pyx_t_1 = PyIter_Next(__pyx_t_2); + if (!__pyx_t_1) { + if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_DECREF(__pyx_v_loop); + __pyx_v_loop = __pyx_t_1; + __pyx_t_1 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":536 + * if NumEvents >= 1: + * for loop in range(NumEvents): + * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) # <<<<<<<<<<<<<< + * return x + */ + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = __Pyx_PyInt_to_py_PmMessage(((__pyx_v_buffer[__pyx_t_7]).message & 0xff)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 8) & 0xFF)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_9 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 16) & 0xFF)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_10 = __Pyx_PyInt_to_py_PmMessage((((__pyx_v_buffer[__pyx_t_7]).message >> 24) & 0xFF)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = PyList_New(4); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_11)); + PyList_SET_ITEM(__pyx_t_11, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyList_SET_ITEM(__pyx_t_11, 1, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_8); + PyList_SET_ITEM(__pyx_t_11, 2, __pyx_t_9); + __Pyx_GIVEREF(__pyx_t_9); + PyList_SET_ITEM(__pyx_t_11, 3, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_10); + __pyx_t_1 = 0; + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_t_10 = 0; + __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_loop); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_10 = __Pyx_PyInt_to_py_PmTimestamp((__pyx_v_buffer[__pyx_t_7]).timestamp); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_9)); + PyList_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_t_11)); + __Pyx_GIVEREF(((PyObject *)__pyx_t_11)); + PyList_SET_ITEM(__pyx_t_9, 1, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_10); + __pyx_t_11 = 0; + __pyx_t_10 = 0; + __pyx_t_10 = __Pyx_PyObject_Append(__pyx_v_x, ((PyObject *)__pyx_t_9)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L8; + } + __pyx_L8:; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":537 + * for loop in range(NumEvents): + * x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) + * return x # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_x); + __pyx_r = __pyx_v_x; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_pyportmidi.Input.Read"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF(__pyx_v_x); + __Pyx_DECREF(__pyx_v_NumEvents); + __Pyx_DECREF(__pyx_v_loop); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_v_length); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_tp_new_11_pyportmidi_Output(PyTypeObject *t, PyObject *a, PyObject *k) { + PyObject *o = (*t->tp_alloc)(t, 0); + if (!o) return 0; + return o; +} + +static void __pyx_tp_dealloc_11_pyportmidi_Output(PyObject *o) { + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pf_11_pyportmidi_6Output___dealloc__(o); + if (PyErr_Occurred()) PyErr_WriteUnraisable(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + (*Py_TYPE(o)->tp_free)(o); +} + +static struct PyMethodDef __pyx_methods_11_pyportmidi_Output[] = { + {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output__check_open)}, + {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Close)}, + {__Pyx_NAMESTR("Abort"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Abort, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Abort)}, + {__Pyx_NAMESTR("Write"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_Write, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_Write)}, + {__Pyx_NAMESTR("WriteShort"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_WriteShort, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_WriteShort)}, + {__Pyx_NAMESTR("WriteSysEx"), (PyCFunction)__pyx_pf_11_pyportmidi_6Output_WriteSysEx, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_6Output_WriteSysEx)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Output = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Output = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Output = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Output = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_11_pyportmidi_Output = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("_pyportmidi.Output"), /*tp_name*/ + sizeof(struct __pyx_obj_11_pyportmidi_Output), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_11_pyportmidi_Output, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Output, /*tp_as_number*/ + &__pyx_tp_as_sequence_Output, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Output, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Output, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("\nclass Output:\n define an output MIDI stream. Takes the form:\n x = pypm.Output(MidiOutputDevice, latency)\n latency is in ms.\n If latency = 0 then timestamps for output are ignored.\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_11_pyportmidi_Output, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pf_11_pyportmidi_6Output___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_11_pyportmidi_Output, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; + +static PyObject *__pyx_tp_new_11_pyportmidi_Input(PyTypeObject *t, PyObject *a, PyObject *k) { + PyObject *o = (*t->tp_alloc)(t, 0); + if (!o) return 0; + return o; +} + +static void __pyx_tp_dealloc_11_pyportmidi_Input(PyObject *o) { + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pf_11_pyportmidi_5Input___dealloc__(o); + if (PyErr_Occurred()) PyErr_WriteUnraisable(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + (*Py_TYPE(o)->tp_free)(o); +} + +static struct PyMethodDef __pyx_methods_11_pyportmidi_Input[] = { + {__Pyx_NAMESTR("_check_open"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input__check_open, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input__check_open)}, + {__Pyx_NAMESTR("Close"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Close, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Close)}, + {__Pyx_NAMESTR("SetFilter"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_SetFilter, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_SetFilter)}, + {__Pyx_NAMESTR("SetChannelMask"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_SetChannelMask, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_SetChannelMask)}, + {__Pyx_NAMESTR("Poll"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Poll, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Poll)}, + {__Pyx_NAMESTR("Read"), (PyCFunction)__pyx_pf_11_pyportmidi_5Input_Read, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_5Input_Read)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Input = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Input = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Input = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Input = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_11_pyportmidi_Input = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("_pyportmidi.Input"), /*tp_name*/ + sizeof(struct __pyx_obj_11_pyportmidi_Input), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_11_pyportmidi_Input, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Input, /*tp_as_number*/ + &__pyx_tp_as_sequence_Input, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Input, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Input, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("\nclass Input:\n define an input MIDI stream. Takes the form:\n x = pypm.Input(MidiInputDevice)\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_11_pyportmidi_Input, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pf_11_pyportmidi_5Input___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_11_pyportmidi_Input, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; + +static struct PyMethodDef __pyx_methods[] = { + {__Pyx_NAMESTR("Initialize"), (PyCFunction)__pyx_pf_11_pyportmidi_Initialize, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Initialize)}, + {__Pyx_NAMESTR("Terminate"), (PyCFunction)__pyx_pf_11_pyportmidi_Terminate, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Terminate)}, + {__Pyx_NAMESTR("GetDefaultInputDeviceID"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDefaultInputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("GetDefaultOutputDeviceID"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDefaultOutputDeviceID, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("CountDevices"), (PyCFunction)__pyx_pf_11_pyportmidi_CountDevices, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("GetDeviceInfo"), (PyCFunction)__pyx_pf_11_pyportmidi_GetDeviceInfo, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_GetDeviceInfo)}, + {__Pyx_NAMESTR("Time"), (PyCFunction)__pyx_pf_11_pyportmidi_Time, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Time)}, + {__Pyx_NAMESTR("GetErrorText"), (PyCFunction)__pyx_pf_11_pyportmidi_GetErrorText, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_GetErrorText)}, + {__Pyx_NAMESTR("Channel"), (PyCFunction)__pyx_pf_11_pyportmidi_Channel, METH_O, __Pyx_DOCSTR(__pyx_doc_11_pyportmidi_Channel)}, + {0, 0, 0, 0} +}; + +static void __pyx_init_filenames(void); /*proto*/ + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + __Pyx_NAMESTR("_pyportmidi"), + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, + {&__pyx_kp_s_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 0, 1, 0}, + {&__pyx_kp_s_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 0, 1, 0}, + {&__pyx_kp_s_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 0, 1, 0}, + {&__pyx_kp_s_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 0, 1, 0}, + {&__pyx_kp_s_14, __pyx_k_14, sizeof(__pyx_k_14), 0, 0, 1, 0}, + {&__pyx_kp_s_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 0, 1, 0}, + {&__pyx_kp_s_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 0, 1, 0}, + {&__pyx_kp_s_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 1, 0}, + {&__pyx_n_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 1}, + {&__pyx_n_s_19, __pyx_k_19, sizeof(__pyx_k_19), 0, 0, 1, 1}, + {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0}, + {&__pyx_kp_u_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 1, 0, 0}, + {&__pyx_kp_u_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 1, 0, 0}, + {&__pyx_kp_u_22, __pyx_k_22, sizeof(__pyx_k_22), 0, 1, 0, 0}, + {&__pyx_kp_u_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 1, 0, 0}, + {&__pyx_kp_u_24, __pyx_k_24, sizeof(__pyx_k_24), 0, 1, 0, 0}, + {&__pyx_kp_u_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 1, 0, 0}, + {&__pyx_kp_u_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 1, 0, 0}, + {&__pyx_kp_u_27, __pyx_k_27, sizeof(__pyx_k_27), 0, 1, 0, 0}, + {&__pyx_kp_u_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 1, 0, 0}, + {&__pyx_kp_u_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 1, 0, 0}, + {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0}, + {&__pyx_kp_u_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 1, 0, 0}, + {&__pyx_kp_u_31, __pyx_k_31, sizeof(__pyx_k_31), 0, 1, 0, 0}, + {&__pyx_kp_u_32, __pyx_k_32, sizeof(__pyx_k_32), 0, 1, 0, 0}, + {&__pyx_kp_u_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 1, 0, 0}, + {&__pyx_kp_u_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 1, 0, 0}, + {&__pyx_kp_u_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 1, 0, 0}, + {&__pyx_kp_u_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 1, 0, 0}, + {&__pyx_kp_u_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 1, 0, 0}, + {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0}, + {&__pyx_kp_s_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 1, 0}, + {&__pyx_kp_s_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 0, 1, 0}, + {&__pyx_kp_s_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 0, 1, 0}, + {&__pyx_kp_s_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 0, 1, 0}, + {&__pyx_kp_s_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 0, 1, 0}, + {&__pyx_n_s__Abort, __pyx_k__Abort, sizeof(__pyx_k__Abort), 0, 0, 1, 1}, + {&__pyx_n_s__B, __pyx_k__B, sizeof(__pyx_k__B), 0, 0, 1, 1}, + {&__pyx_n_s__Channel, __pyx_k__Channel, sizeof(__pyx_k__Channel), 0, 0, 1, 1}, + {&__pyx_n_s__Close, __pyx_k__Close, sizeof(__pyx_k__Close), 0, 0, 1, 1}, + {&__pyx_n_s__Exception, __pyx_k__Exception, sizeof(__pyx_k__Exception), 0, 0, 1, 1}, + {&__pyx_n_s__FALSE, __pyx_k__FALSE, sizeof(__pyx_k__FALSE), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_ACTIVE, __pyx_k__FILT_ACTIVE, sizeof(__pyx_k__FILT_ACTIVE), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_AFTERTOUCH, __pyx_k__FILT_AFTERTOUCH, sizeof(__pyx_k__FILT_AFTERTOUCH), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_CLOCK, __pyx_k__FILT_CLOCK, sizeof(__pyx_k__FILT_CLOCK), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_CONTROL, __pyx_k__FILT_CONTROL, sizeof(__pyx_k__FILT_CONTROL), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_F9, __pyx_k__FILT_F9, sizeof(__pyx_k__FILT_F9), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_FD, __pyx_k__FILT_FD, sizeof(__pyx_k__FILT_FD), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_MTC, __pyx_k__FILT_MTC, sizeof(__pyx_k__FILT_MTC), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_NOTE, __pyx_k__FILT_NOTE, sizeof(__pyx_k__FILT_NOTE), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_PITCHBEND, __pyx_k__FILT_PITCHBEND, sizeof(__pyx_k__FILT_PITCHBEND), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_PLAY, __pyx_k__FILT_PLAY, sizeof(__pyx_k__FILT_PLAY), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_PROGRAM, __pyx_k__FILT_PROGRAM, sizeof(__pyx_k__FILT_PROGRAM), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_REALTIME, __pyx_k__FILT_REALTIME, sizeof(__pyx_k__FILT_REALTIME), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_RESET, __pyx_k__FILT_RESET, sizeof(__pyx_k__FILT_RESET), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_SONG_POSITION, __pyx_k__FILT_SONG_POSITION, sizeof(__pyx_k__FILT_SONG_POSITION), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_SONG_SELECT, __pyx_k__FILT_SONG_SELECT, sizeof(__pyx_k__FILT_SONG_SELECT), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_SYSEX, __pyx_k__FILT_SYSEX, sizeof(__pyx_k__FILT_SYSEX), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_TICK, __pyx_k__FILT_TICK, sizeof(__pyx_k__FILT_TICK), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_TUNE, __pyx_k__FILT_TUNE, sizeof(__pyx_k__FILT_TUNE), 0, 0, 1, 1}, + {&__pyx_n_s__FILT_UNDEFINED, __pyx_k__FILT_UNDEFINED, sizeof(__pyx_k__FILT_UNDEFINED), 0, 0, 1, 1}, + {&__pyx_n_s__GetDeviceInfo, __pyx_k__GetDeviceInfo, sizeof(__pyx_k__GetDeviceInfo), 0, 0, 1, 1}, + {&__pyx_n_s__GetErrorText, __pyx_k__GetErrorText, sizeof(__pyx_k__GetErrorText), 0, 0, 1, 1}, + {&__pyx_n_s__IndexError, __pyx_k__IndexError, sizeof(__pyx_k__IndexError), 0, 0, 1, 1}, + {&__pyx_n_s__Initialize, __pyx_k__Initialize, sizeof(__pyx_k__Initialize), 0, 0, 1, 1}, + {&__pyx_n_s__Input, __pyx_k__Input, sizeof(__pyx_k__Input), 0, 0, 1, 1}, + {&__pyx_n_s__InputDevice, __pyx_k__InputDevice, sizeof(__pyx_k__InputDevice), 0, 0, 1, 1}, + {&__pyx_n_s__Output, __pyx_k__Output, sizeof(__pyx_k__Output), 0, 0, 1, 1}, + {&__pyx_n_s__OutputDevice, __pyx_k__OutputDevice, sizeof(__pyx_k__OutputDevice), 0, 0, 1, 1}, + {&__pyx_n_s__Poll, __pyx_k__Poll, sizeof(__pyx_k__Poll), 0, 0, 1, 1}, + {&__pyx_n_s__Read, __pyx_k__Read, sizeof(__pyx_k__Read), 0, 0, 1, 1}, + {&__pyx_n_s__SetChannelMask, __pyx_k__SetChannelMask, sizeof(__pyx_k__SetChannelMask), 0, 0, 1, 1}, + {&__pyx_n_s__SetFilter, __pyx_k__SetFilter, sizeof(__pyx_k__SetFilter), 0, 0, 1, 1}, + {&__pyx_n_s__TRUE, __pyx_k__TRUE, sizeof(__pyx_k__TRUE), 0, 0, 1, 1}, + {&__pyx_n_s__Terminate, __pyx_k__Terminate, sizeof(__pyx_k__Terminate), 0, 0, 1, 1}, + {&__pyx_n_s__Time, __pyx_k__Time, sizeof(__pyx_k__Time), 0, 0, 1, 1}, + {&__pyx_n_s__Write, __pyx_k__Write, sizeof(__pyx_k__Write), 0, 0, 1, 1}, + {&__pyx_n_s__WriteShort, __pyx_k__WriteShort, sizeof(__pyx_k__WriteShort), 0, 0, 1, 1}, + {&__pyx_n_s__WriteSysEx, __pyx_k__WriteSysEx, sizeof(__pyx_k__WriteSysEx), 0, 0, 1, 1}, + {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, + {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, + {&__pyx_n_s____version__, __pyx_k____version__, sizeof(__pyx_k____version__), 0, 0, 1, 1}, + {&__pyx_n_s___aborted, __pyx_k___aborted, sizeof(__pyx_k___aborted), 0, 0, 1, 1}, + {&__pyx_n_s___check_open, __pyx_k___check_open, sizeof(__pyx_k___check_open), 0, 0, 1, 1}, + {&__pyx_n_s__array, __pyx_k__array, sizeof(__pyx_k__array), 0, 0, 1, 1}, + {&__pyx_n_s__buffersize, __pyx_k__buffersize, sizeof(__pyx_k__buffersize), 0, 0, 1, 1}, + {&__pyx_n_s__data1, __pyx_k__data1, sizeof(__pyx_k__data1), 0, 0, 1, 1}, + {&__pyx_n_s__data2, __pyx_k__data2, sizeof(__pyx_k__data2), 0, 0, 1, 1}, + {&__pyx_n_s__debug, __pyx_k__debug, sizeof(__pyx_k__debug), 0, 0, 1, 1}, + {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, + {&__pyx_n_s__input, __pyx_k__input, sizeof(__pyx_k__input), 0, 0, 1, 1}, + {&__pyx_n_s__interf, __pyx_k__interf, sizeof(__pyx_k__interf), 0, 0, 1, 1}, + {&__pyx_n_s__latency, __pyx_k__latency, sizeof(__pyx_k__latency), 0, 0, 1, 1}, + {&__pyx_n_s__message, __pyx_k__message, sizeof(__pyx_k__message), 0, 0, 1, 1}, + {&__pyx_n_s__midi, __pyx_k__midi, sizeof(__pyx_k__midi), 0, 0, 1, 1}, + {&__pyx_n_s__msg, __pyx_k__msg, sizeof(__pyx_k__msg), 0, 0, 1, 1}, + {&__pyx_n_s__name, __pyx_k__name, sizeof(__pyx_k__name), 0, 0, 1, 1}, + {&__pyx_n_s__opened, __pyx_k__opened, sizeof(__pyx_k__opened), 0, 0, 1, 1}, + {&__pyx_n_s__output, __pyx_k__output, sizeof(__pyx_k__output), 0, 0, 1, 1}, + {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, + {&__pyx_n_s__status, __pyx_k__status, sizeof(__pyx_k__status), 0, 0, 1, 1}, + {&__pyx_n_s__timestamp, __pyx_k__timestamp, sizeof(__pyx_k__timestamp), 0, 0, 1, 1}, + {&__pyx_n_s__tostring, __pyx_k__tostring, sizeof(__pyx_k__tostring), 0, 0, 1, 1}, + {&__pyx_n_s__when, __pyx_k__when, sizeof(__pyx_k__when), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_Exception = __Pyx_GetName(__pyx_b, __pyx_n_s__Exception); if (!__pyx_builtin_Exception) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_IndexError = __Pyx_GetName(__pyx_b, __pyx_n_s__IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_8 = PyInt_FromLong(8); if (unlikely(!__pyx_int_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_16 = PyInt_FromLong(16); if (unlikely(!__pyx_int_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x1 = PyInt_FromLong(0x1); if (unlikely(!__pyx_int_0x1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x2 = PyInt_FromLong(0x2); if (unlikely(!__pyx_int_0x2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x4 = PyInt_FromLong(0x4); if (unlikely(!__pyx_int_0x4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x8 = PyInt_FromLong(0x8); if (unlikely(!__pyx_int_0x8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x10 = PyInt_FromLong(0x10); if (unlikely(!__pyx_int_0x10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x20 = PyInt_FromLong(0x20); if (unlikely(!__pyx_int_0x20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x30 = PyInt_FromLong(0x30); if (unlikely(!__pyx_int_0x30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x40 = PyInt_FromLong(0x40); if (unlikely(!__pyx_int_0x40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x7F = PyInt_FromLong(0x7F); if (unlikely(!__pyx_int_0x7F)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x80 = PyInt_FromLong(0x80); if (unlikely(!__pyx_int_0x80)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0xFF = PyInt_FromLong(0xFF); if (unlikely(!__pyx_int_0xFF)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_1024 = PyInt_FromLong(1024); if (unlikely(!__pyx_int_1024)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_4096 = PyInt_FromLong(4096); if (unlikely(!__pyx_int_4096)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x100 = PyInt_FromLong(0x100); if (unlikely(!__pyx_int_0x100)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x200 = PyInt_FromLong(0x200); if (unlikely(!__pyx_int_0x200)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x300 = PyInt_FromLong(0x300); if (unlikely(!__pyx_int_0x300)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x400 = PyInt_FromLong(0x400); if (unlikely(!__pyx_int_0x400)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x800 = PyInt_FromLong(0x800); if (unlikely(!__pyx_int_0x800)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x1000 = PyInt_FromLong(0x1000); if (unlikely(!__pyx_int_0x1000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x2000 = PyInt_FromLong(0x2000); if (unlikely(!__pyx_int_0x2000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x4000 = PyInt_FromLong(0x4000); if (unlikely(!__pyx_int_0x4000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x8000 = PyInt_FromLong(0x8000); if (unlikely(!__pyx_int_0x8000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0xFF00 = PyInt_FromLong(0xFF00); if (unlikely(!__pyx_int_0xFF00)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0x10000 = PyInt_FromLong(0x10000); if (unlikely(!__pyx_int_0x10000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0xFF0000 = PyInt_FromLong(0xFF0000); if (unlikely(!__pyx_int_0xFF0000)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC init_pyportmidi(void); /*proto*/ +PyMODINIT_FUNC init_pyportmidi(void) +#else +PyMODINIT_FUNC PyInit__pyportmidi(void); /*proto*/ +PyMODINIT_FUNC PyInit__pyportmidi(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + #if CYTHON_REFNANNY + void* __pyx_refnanny = NULL; + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit__pyportmidi(void)", __LINE__, __FILE__); + #endif + __pyx_init_filenames(); + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if PY_MAJOR_VERSION < 3 + __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_pyportmidi"), __pyx_methods, 0, 0, PYTHON_API_VERSION); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + #if PY_MAJOR_VERSION < 3 + Py_INCREF(__pyx_m); + #endif + __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); + if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_module_is_main__pyportmidi) { + if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + } + /*--- Builtin init code ---*/ + if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_11_pyportmidi_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Output", (PyObject *)&__pyx_type_11_pyportmidi_Output) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_11_pyportmidi_Output = &__pyx_type_11_pyportmidi_Output; + if (PyType_Ready(&__pyx_type_11_pyportmidi_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Input", (PyObject *)&__pyx_type_11_pyportmidi_Input) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_11_pyportmidi_Input = &__pyx_type_11_pyportmidi_Input; + /*--- Type import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":7 + * # harrison@media.mit.edu + * # written in Pyrex + * __version__="0.07" # <<<<<<<<<<<<<< + * + * import array + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s____version__, ((PyObject *)__pyx_kp_s_17)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":9 + * __version__="0.07" + * + * import array # <<<<<<<<<<<<<< + * + * # CHANGES: + */ + __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__array), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__array, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":108 + * PtTimestamp Pt_Time() + * + * FILT_ACTIVE=0x1 # <<<<<<<<<<<<<< + * FILT_SYSEX=0x2 + * FILT_CLOCK=0x4 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_ACTIVE, __pyx_int_0x1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":109 + * + * FILT_ACTIVE=0x1 + * FILT_SYSEX=0x2 # <<<<<<<<<<<<<< + * FILT_CLOCK=0x4 + * FILT_PLAY=0x8 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SYSEX, __pyx_int_0x2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":110 + * FILT_ACTIVE=0x1 + * FILT_SYSEX=0x2 + * FILT_CLOCK=0x4 # <<<<<<<<<<<<<< + * FILT_PLAY=0x8 + * FILT_F9=0x10 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_CLOCK, __pyx_int_0x4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":111 + * FILT_SYSEX=0x2 + * FILT_CLOCK=0x4 + * FILT_PLAY=0x8 # <<<<<<<<<<<<<< + * FILT_F9=0x10 + * FILT_TICK=0x10 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PLAY, __pyx_int_0x8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":112 + * FILT_CLOCK=0x4 + * FILT_PLAY=0x8 + * FILT_F9=0x10 # <<<<<<<<<<<<<< + * FILT_TICK=0x10 + * FILT_FD=0x20 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_F9, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":113 + * FILT_PLAY=0x8 + * FILT_F9=0x10 + * FILT_TICK=0x10 # <<<<<<<<<<<<<< + * FILT_FD=0x20 + * FILT_UNDEFINED=0x30 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_TICK, __pyx_int_0x10) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":114 + * FILT_F9=0x10 + * FILT_TICK=0x10 + * FILT_FD=0x20 # <<<<<<<<<<<<<< + * FILT_UNDEFINED=0x30 + * FILT_RESET=0x40 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_FD, __pyx_int_0x20) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":115 + * FILT_TICK=0x10 + * FILT_FD=0x20 + * FILT_UNDEFINED=0x30 # <<<<<<<<<<<<<< + * FILT_RESET=0x40 + * FILT_REALTIME=0x7F + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_UNDEFINED, __pyx_int_0x30) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":116 + * FILT_FD=0x20 + * FILT_UNDEFINED=0x30 + * FILT_RESET=0x40 # <<<<<<<<<<<<<< + * FILT_REALTIME=0x7F + * FILT_NOTE=0x80 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_RESET, __pyx_int_0x40) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":117 + * FILT_UNDEFINED=0x30 + * FILT_RESET=0x40 + * FILT_REALTIME=0x7F # <<<<<<<<<<<<<< + * FILT_NOTE=0x80 + * FILT_CHANNEL_AFTERTOUCH=0x100 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_REALTIME, __pyx_int_0x7F) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":118 + * FILT_RESET=0x40 + * FILT_REALTIME=0x7F + * FILT_NOTE=0x80 # <<<<<<<<<<<<<< + * FILT_CHANNEL_AFTERTOUCH=0x100 + * FILT_POLY_AFTERTOUCH=0x200 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_NOTE, __pyx_int_0x80) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":119 + * FILT_REALTIME=0x7F + * FILT_NOTE=0x80 + * FILT_CHANNEL_AFTERTOUCH=0x100 # <<<<<<<<<<<<<< + * FILT_POLY_AFTERTOUCH=0x200 + * FILT_AFTERTOUCH=0x300 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_18, __pyx_int_0x100) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":120 + * FILT_NOTE=0x80 + * FILT_CHANNEL_AFTERTOUCH=0x100 + * FILT_POLY_AFTERTOUCH=0x200 # <<<<<<<<<<<<<< + * FILT_AFTERTOUCH=0x300 + * FILT_PROGRAM=0x400 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_19, __pyx_int_0x200) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":121 + * FILT_CHANNEL_AFTERTOUCH=0x100 + * FILT_POLY_AFTERTOUCH=0x200 + * FILT_AFTERTOUCH=0x300 # <<<<<<<<<<<<<< + * FILT_PROGRAM=0x400 + * FILT_CONTROL=0x800 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_AFTERTOUCH, __pyx_int_0x300) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":122 + * FILT_POLY_AFTERTOUCH=0x200 + * FILT_AFTERTOUCH=0x300 + * FILT_PROGRAM=0x400 # <<<<<<<<<<<<<< + * FILT_CONTROL=0x800 + * FILT_PITCHBEND=0x1000 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PROGRAM, __pyx_int_0x400) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":123 + * FILT_AFTERTOUCH=0x300 + * FILT_PROGRAM=0x400 + * FILT_CONTROL=0x800 # <<<<<<<<<<<<<< + * FILT_PITCHBEND=0x1000 + * FILT_MTC=0x2000 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_CONTROL, __pyx_int_0x800) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":124 + * FILT_PROGRAM=0x400 + * FILT_CONTROL=0x800 + * FILT_PITCHBEND=0x1000 # <<<<<<<<<<<<<< + * FILT_MTC=0x2000 + * FILT_SONG_POSITION=0x4000 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_PITCHBEND, __pyx_int_0x1000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":125 + * FILT_CONTROL=0x800 + * FILT_PITCHBEND=0x1000 + * FILT_MTC=0x2000 # <<<<<<<<<<<<<< + * FILT_SONG_POSITION=0x4000 + * FILT_SONG_SELECT=0x8000 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_MTC, __pyx_int_0x2000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":126 + * FILT_PITCHBEND=0x1000 + * FILT_MTC=0x2000 + * FILT_SONG_POSITION=0x4000 # <<<<<<<<<<<<<< + * FILT_SONG_SELECT=0x8000 + * FILT_TUNE=0x10000 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SONG_POSITION, __pyx_int_0x4000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":127 + * FILT_MTC=0x2000 + * FILT_SONG_POSITION=0x4000 + * FILT_SONG_SELECT=0x8000 # <<<<<<<<<<<<<< + * FILT_TUNE=0x10000 + * FALSE=0 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_SONG_SELECT, __pyx_int_0x8000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":128 + * FILT_SONG_POSITION=0x4000 + * FILT_SONG_SELECT=0x8000 + * FILT_TUNE=0x10000 # <<<<<<<<<<<<<< + * FALSE=0 + * TRUE=1 + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FILT_TUNE, __pyx_int_0x10000) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":129 + * FILT_SONG_SELECT=0x8000 + * FILT_TUNE=0x10000 + * FALSE=0 # <<<<<<<<<<<<<< + * TRUE=1 + * + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FALSE, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":130 + * FILT_TUNE=0x10000 + * FALSE=0 + * TRUE=1 # <<<<<<<<<<<<<< + * + * def Initialize(): + */ + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__TRUE, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "/Users/rene/dev/portmedia/portmedia/portmidi/trunk/pm_python/pyportmidi/_pyportmidi.pyx":1 + * # pyPortMidi # <<<<<<<<<<<<<< + * # Python bindings for PortMidi + * # John Harrison + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Initialize); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__"); + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_20), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Terminate); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_21), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GetDeviceInfo); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__"); + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_22), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_23), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__GetErrorText); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__"); + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_24), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Channel); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_25), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s___check_open); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_26), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Close); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_27), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Abort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_28), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Write); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_29), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__WriteShort); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_30), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Output); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__WriteSysEx); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_31), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s___check_open); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_32), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Close); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_33), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__SetFilter); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_34), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__SetChannelMask); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_35), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Poll); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_36), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__Input); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__Read); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_37), __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + if (__pyx_m) { + __Pyx_AddTraceback("init _pyportmidi"); + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init _pyportmidi"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +static const char *__pyx_filenames[] = { + "_pyportmidi.pyx", +}; + +/* Runtime support code */ + +static void __pyx_init_filenames(void) { + __pyx_f = __pyx_filenames; +} + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AS_STRING(kw_name)); + #endif +} + +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *number, *more_or_less; + + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + number = (num_expected == 1) ? "" : "s"; + PyErr_Format(PyExc_TypeError, + #if PY_VERSION_HEX < 0x02050000 + "%s() takes %s %d positional argument%s (%d given)", + #else + "%s() takes %s %zd positional argument%s (%zd given)", + #endif + func_name, more_or_less, num_expected, number, num_found); +} + +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + } else { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) { + #else + if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) { + #endif + goto invalid_keyword_type; + } else { + for (name = first_kw_arg; *name; name++) { + #if PY_MAJOR_VERSION >= 3 + if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && + PyUnicode_Compare(**name, key) == 0) break; + #else + if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && + _PyString_Eq(**name, key)) break; + #endif + } + if (*name) { + values[name-argnames] = value; + } else { + /* unexpected keyword found */ + for (name=argnames; name != first_kw_arg; name++) { + if (**name == key) goto arg_passed_twice; + #if PY_MAJOR_VERSION >= 3 + if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && + PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice; + #else + if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && + _PyString_Eq(**name, key)) goto arg_passed_twice; + #endif + } + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + } + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, **name); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%s() got an unexpected keyword argument '%s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { + PyObject *__import__ = 0; + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + __import__ = __Pyx_GetAttrString(__pyx_b, "__import__"); + if (!__import__) + goto bad; + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + module = PyObject_CallFunctionObjArgs(__import__, + name, global_dict, empty_dict, list, NULL); +bad: + Py_XDECREF(empty_list); + Py_XDECREF(__import__); + Py_XDECREF(empty_dict); + return module; +} + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmDeviceID(PmDeviceID val) { + const PmDeviceID neg_one = (PmDeviceID)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmDeviceID) < sizeof(long)) { + return PyInt_FromLong((long)val); + } else if (sizeof(PmDeviceID) == sizeof(long)) { + if (is_unsigned) + return PyLong_FromUnsignedLong((unsigned long)val); + else + return PyInt_FromLong((long)val); + } else { /* (sizeof(PmDeviceID) > sizeof(long)) */ + if (is_unsigned) + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val); + else + return PyLong_FromLongLong((PY_LONG_LONG)val); + } +} + +static CYTHON_INLINE PmDeviceID __Pyx_PyInt_from_py_PmDeviceID(PyObject* x) { + const PmDeviceID neg_one = (PmDeviceID)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmDeviceID) == sizeof(char)) { + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedChar(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedChar(x); + } else if (sizeof(PmDeviceID) == sizeof(short)) { + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedShort(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedShort(x); + } else if (sizeof(PmDeviceID) == sizeof(int)) { + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedInt(x); + } else if (sizeof(PmDeviceID) == sizeof(long)) { + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedLong(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedLong(x); + } else if (sizeof(PmDeviceID) == sizeof(PY_LONG_LONG)) { + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedLongLong(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedLongLong(x); +#if 0 + } else if (sizeof(PmDeviceID) > sizeof(short) && + sizeof(PmDeviceID) < sizeof(int)) { /* __int32 ILP64 ? */ + if (is_unsigned) + return (PmDeviceID)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmDeviceID)__Pyx_PyInt_AsSignedInt(x); +#endif + } + PyErr_SetString(PyExc_TypeError, "PmDeviceID"); + return (PmDeviceID)-1; +} + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PtTimestamp(PtTimestamp val) { + const PtTimestamp neg_one = (PtTimestamp)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PtTimestamp) < sizeof(long)) { + return PyInt_FromLong((long)val); + } else if (sizeof(PtTimestamp) == sizeof(long)) { + if (is_unsigned) + return PyLong_FromUnsignedLong((unsigned long)val); + else + return PyInt_FromLong((long)val); + } else { /* (sizeof(PtTimestamp) > sizeof(long)) */ + if (is_unsigned) + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val); + else + return PyLong_FromLongLong((PY_LONG_LONG)val); + } +} + +#if PY_MAJOR_VERSION < 3 +static PyObject *__Pyx_GetStdout(void) { + PyObject *f = PySys_GetObject((char *)"stdout"); + if (!f) { + PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + } + return f; +} + +static int __Pyx_Print(PyObject *arg_tuple, int newline) { + PyObject *f; + PyObject* v; + int i; + + if (!(f = __Pyx_GetStdout())) + return -1; + for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { + if (PyFile_SoftSpace(f, 1)) { + if (PyFile_WriteString(" ", f) < 0) + return -1; + } + v = PyTuple_GET_ITEM(arg_tuple, i); + if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) + return -1; + if (PyString_Check(v)) { + char *s = PyString_AsString(v); + Py_ssize_t len = PyString_Size(v); + if (len > 0 && + isspace(Py_CHARMASK(s[len-1])) && + s[len-1] != ' ') + PyFile_SoftSpace(f, 0); + } + } + if (newline) { + if (PyFile_WriteString("\n", f) < 0) + return -1; + PyFile_SoftSpace(f, 0); + } + return 0; +} + +#else /* Python 3 has a print function */ + +static int __Pyx_Print(PyObject *arg_tuple, int newline) { + PyObject* kwargs = 0; + PyObject* result = 0; + PyObject* end_string; + if (!__pyx_print) { + __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); + if (!__pyx_print) + return -1; + } + if (!newline) { + if (!__pyx_print_kwargs) { + __pyx_print_kwargs = PyDict_New(); + if (!__pyx_print_kwargs) + return -1; + end_string = PyUnicode_FromStringAndSize(" ", 1); + if (!end_string) + return -1; + if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) { + Py_DECREF(end_string); + return -1; + } + Py_DECREF(end_string); + } + kwargs = __pyx_print_kwargs; + } + result = PyObject_Call(__pyx_print, arg_tuple, kwargs); + if (!result) + return -1; + Py_DECREF(result); + return 0; +} + +#endif + +#if PY_MAJOR_VERSION < 3 + +static int __Pyx_PrintOne(PyObject *o) { + PyObject *f; + if (!(f = __Pyx_GetStdout())) + return -1; + if (PyFile_SoftSpace(f, 0)) { + if (PyFile_WriteString(" ", f) < 0) + return -1; + } + if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) + return -1; + if (PyFile_WriteString("\n", f) < 0) + return -1; + return 0; + /* the line below is just to avoid compiler + * compiler warnings about unused functions */ + return __Pyx_Print(NULL, 0); +} + +#else /* Python 3 has a print function */ + +static int __Pyx_PrintOne(PyObject *o) { + int res; + PyObject* arg_tuple = PyTuple_New(1); + if (unlikely(!arg_tuple)) + return -1; + Py_INCREF(o); + PyTuple_SET_ITEM(arg_tuple, 0, o); + res = __Pyx_Print(arg_tuple, 1); + Py_DECREF(arg_tuple); + return res; +} + +#endif + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { + PyObject *result; + result = PyObject_GetAttr(dict, name); + if (!result) + PyErr_SetObject(PyExc_NameError, name); + return result; +} + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} + +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} + + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(tb); + /* First, check the traceback argument, replacing None with NULL. */ + if (tb == Py_None) { + Py_DECREF(tb); + tb = 0; + } + else if (tb != NULL && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + /* Next, replace a missing value with None */ + if (value == NULL) { + value = Py_None; + Py_INCREF(value); + } + #if PY_VERSION_HEX < 0x02050000 + if (!PyClass_Check(type)) + #else + if (!PyType_Check(type)) + #endif + { + /* Raising an instance. The value should be a dummy. */ + if (value != Py_None) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + /* Normalize to raise <class>, <instance> */ + Py_DECREF(value); + value = type; + #if PY_VERSION_HEX < 0x02050000 + if (PyInstance_Check(type)) { + type = (PyObject*) ((PyInstanceObject*)type)->in_class; + Py_INCREF(type); + } + else { + type = 0; + PyErr_SetString(PyExc_TypeError, + "raise: exception must be an old-style class or instance"); + goto raise_error; + } + #else + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + #endif + } + + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} + +#else /* Python 3+ */ + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (!PyExceptionClass_Check(type)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + + PyErr_SetObject(type, value); + + if (tb) { + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } + } + +bad: + return; +} +#endif + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmMessage(PmMessage val) { + const PmMessage neg_one = (PmMessage)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmMessage) < sizeof(long)) { + return PyInt_FromLong((long)val); + } else if (sizeof(PmMessage) == sizeof(long)) { + if (is_unsigned) + return PyLong_FromUnsignedLong((unsigned long)val); + else + return PyInt_FromLong((long)val); + } else { /* (sizeof(PmMessage) > sizeof(long)) */ + if (is_unsigned) + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val); + else + return PyLong_FromLongLong((PY_LONG_LONG)val); + } +} + +static CYTHON_INLINE PmMessage __Pyx_PyInt_from_py_PmMessage(PyObject* x) { + const PmMessage neg_one = (PmMessage)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmMessage) == sizeof(char)) { + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedChar(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedChar(x); + } else if (sizeof(PmMessage) == sizeof(short)) { + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedShort(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedShort(x); + } else if (sizeof(PmMessage) == sizeof(int)) { + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedInt(x); + } else if (sizeof(PmMessage) == sizeof(long)) { + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedLong(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedLong(x); + } else if (sizeof(PmMessage) == sizeof(PY_LONG_LONG)) { + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedLongLong(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedLongLong(x); +#if 0 + } else if (sizeof(PmMessage) > sizeof(short) && + sizeof(PmMessage) < sizeof(int)) { /* __int32 ILP64 ? */ + if (is_unsigned) + return (PmMessage)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmMessage)__Pyx_PyInt_AsSignedInt(x); +#endif + } + PyErr_SetString(PyExc_TypeError, "PmMessage"); + return (PmMessage)-1; +} + +static CYTHON_INLINE PmTimestamp __Pyx_PyInt_from_py_PmTimestamp(PyObject* x) { + const PmTimestamp neg_one = (PmTimestamp)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmTimestamp) == sizeof(char)) { + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedChar(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedChar(x); + } else if (sizeof(PmTimestamp) == sizeof(short)) { + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedShort(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedShort(x); + } else if (sizeof(PmTimestamp) == sizeof(int)) { + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedInt(x); + } else if (sizeof(PmTimestamp) == sizeof(long)) { + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedLong(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedLong(x); + } else if (sizeof(PmTimestamp) == sizeof(PY_LONG_LONG)) { + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedLongLong(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedLongLong(x); +#if 0 + } else if (sizeof(PmTimestamp) > sizeof(short) && + sizeof(PmTimestamp) < sizeof(int)) { /* __int32 ILP64 ? */ + if (is_unsigned) + return (PmTimestamp)__Pyx_PyInt_AsUnsignedInt(x); + else + return (PmTimestamp)__Pyx_PyInt_AsSignedInt(x); +#endif + } + PyErr_SetString(PyExc_TypeError, "PmTimestamp"); + return (PmTimestamp)-1; +} + +static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_PmTimestamp(PmTimestamp val) { + const PmTimestamp neg_one = (PmTimestamp)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(PmTimestamp) < sizeof(long)) { + return PyInt_FromLong((long)val); + } else if (sizeof(PmTimestamp) == sizeof(long)) { + if (is_unsigned) + return PyLong_FromUnsignedLong((unsigned long)val); + else + return PyInt_FromLong((long)val); + } else { /* (sizeof(PmTimestamp) > sizeof(long)) */ + if (is_unsigned) + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val); + else + return PyLong_FromLongLong((PY_LONG_LONG)val); + } +} + +static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { + const unsigned char neg_one = (unsigned char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned char" : + "value too large to convert to unsigned char"); + } + return (unsigned char)-1; + } + return (unsigned char)val; + } + return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { + const unsigned short neg_one = (unsigned short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned short" : + "value too large to convert to unsigned short"); + } + return (unsigned short)-1; + } + return (unsigned short)val; + } + return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { + const unsigned int neg_one = (unsigned int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned int" : + "value too large to convert to unsigned int"); + } + return (unsigned int)-1; + } + return (unsigned int)val; + } + return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { + const char neg_one = (char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to char" : + "value too large to convert to char"); + } + return (char)-1; + } + return (char)val; + } + return (char)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { + const short neg_one = (short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to short" : + "value too large to convert to short"); + } + return (short)-1; + } + return (short)val; + } + return (short)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { + const int neg_one = (int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to int" : + "value too large to convert to int"); + } + return (int)-1; + } + return (int)val; + } + return (int)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { + const signed char neg_one = (signed char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed char" : + "value too large to convert to signed char"); + } + return (signed char)-1; + } + return (signed char)val; + } + return (signed char)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { + const signed short neg_one = (signed short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed short" : + "value too large to convert to signed short"); + } + return (signed short)-1; + } + return (signed short)val; + } + return (signed short)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { + const signed int neg_one = (signed int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed int" : + "value too large to convert to signed int"); + } + return (signed int)-1; + } + return (signed int)val; + } + return (signed int)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { + const unsigned long neg_one = (unsigned long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned long"); + return (unsigned long)-1; + } + return (unsigned long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned long"); + return (unsigned long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + unsigned long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (unsigned long)-1; + val = __Pyx_PyInt_AsUnsignedLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { + const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG)-1; + } + return (unsigned PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + unsigned PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (unsigned PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsUnsignedLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { + const long neg_one = (long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long)-1; + } + return (long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (long)-1; + val = __Pyx_PyInt_AsLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { + const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to PY_LONG_LONG"); + return (PY_LONG_LONG)-1; + } + return (PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to PY_LONG_LONG"); + return (PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { + const signed long neg_one = (signed long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed long"); + return (signed long)-1; + } + return (signed long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed long"); + return (signed long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + signed long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (signed long)-1; + val = __Pyx_PyInt_AsSignedLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { + const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed PY_LONG_LONG"); + return (signed PY_LONG_LONG)-1; + } + return (signed PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed PY_LONG_LONG"); + return (signed PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + signed PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (signed PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsSignedLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" + +static void __Pyx_AddTraceback(const char *funcname) { + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + PyObject *py_globals = 0; + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(__pyx_filename); + #else + py_srcfile = PyUnicode_FromString(__pyx_filename); + #endif + if (!py_srcfile) goto bad; + if (__pyx_clineno) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_globals = PyModule_GetDict(__pyx_m); + if (!py_globals) goto bad; + py_code = PyCode_New( + 0, /*int argcount,*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*int kwonlyargcount,*/ + #endif + 0, /*int nlocals,*/ + 0, /*int stacksize,*/ + 0, /*int flags,*/ + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + __pyx_lineno, /*int firstlineno,*/ + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + if (!py_code) goto bad; + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + py_globals, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + py_frame->f_lineno = __pyx_lineno; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else /* Python 3+ has unicode identifiers */ + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +/* Type Conversion Functions */ + +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + if (x == Py_True) return 1; + else if ((x == Py_False) | (x == Py_None)) return 0; + else return PyObject_IsTrue(x); +} + +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { + PyNumberMethods *m; + const char *name = NULL; + PyObject *res = NULL; +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return Py_INCREF(x), x; + m = Py_TYPE(x)->tp_as_number; +#if PY_VERSION_HEX < 0x03000000 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } +#else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } +#endif + if (res) { +#if PY_VERSION_HEX < 0x03000000 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%s__ returned non-%s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} + +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject* x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} + +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { +#if PY_VERSION_HEX < 0x02050000 + if (ival <= LONG_MAX) + return PyInt_FromLong((long)ival); + else { + unsigned char *bytes = (unsigned char *) &ival; + int one = 1; int little = (int)*(unsigned char*)&one; + return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); + } +#else + return PyInt_FromSize_t(ival); +#endif +} + +static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { + unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); + if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { + return (size_t)-1; + } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t)-1; + } + return (size_t)val; +} + + +#endif /* Py_PYTHON_H */ diff --git a/pd/portmidi/pm_python/pyportmidi/_pyportmidi.pyx b/pd/portmidi/pm_python/pyportmidi/_pyportmidi.pyx new file mode 100644 index 000000000..e43bd2b28 --- /dev/null +++ b/pd/portmidi/pm_python/pyportmidi/_pyportmidi.pyx @@ -0,0 +1,537 @@ +# pyPortMidi +# Python bindings for PortMidi +# John Harrison +# http://sound.media.mit.edu/~harrison +# harrison@media.mit.edu +# written in Pyrex +__version__="0.07" + +import array + +# CHANGES: + +# 0.0.5: (June 1st, 2009) +# Output no longer calls abort when it deallocates. +# Added abort and close methods. +# Need to call Abort() explicityly if you want that to happen. + + +# +# 0.0.3: (March 15, 2005) +# changed everything from tuples to lists +# return 4 values for PmRead instead of 3 (for SysEx) +# minor fixes for flexibility and error checking +# flushed out DistUtils package and added Mac and Linux compile support +# Markus Pfaff: added ability for WriteSysEx to accept lists as well +# as strings + +# 0.0.2: +# fixed pointer to function calls to avoid necessity of pyport library + +# 0.0.1: +# initial release + +cdef extern from "portmidi.h": + ctypedef enum PmError: + pmNoError = 0, + pmHostError = -10000, + pmInvalidDeviceId, #/* out of range or output device when input is requested or vice versa */ + pmInsufficientMemory, + pmBufferTooSmall, + pmBufferOverflow, + pmBadPtr, + pmBadData, #/* illegal midi data, e.g. missing EOX */ + pmInternalError, + pmBufferMaxSize, #/* buffer is already as large as it can be */ + PmError Pm_Initialize() + PmError Pm_Terminate() + ctypedef void PortMidiStream + ctypedef PortMidiStream PmStream # CHECK THIS! + ctypedef int PmDeviceID + int Pm_HasHostError( PortMidiStream * stream ) + char *Pm_GetErrorText( PmError errnum ) + Pm_GetHostErrorText(char * msg, unsigned int len) + ctypedef struct PmDeviceInfo: + int structVersion + char *interf #/* underlying MIDI API, e.g. MMSystem or DirectX */ + char *name #/* device name, e.g. USB MidiSport 1x1 */ + int input #/* true iff input is available */ + int output #/* true iff output is available */ + int opened #/* used by generic PortMidi code to do error checking on arguments */ + int Pm_CountDevices() + PmDeviceID Pm_GetDefaultInputDeviceID() + PmDeviceID Pm_GetDefaultOutputDeviceID() + ctypedef long PmTimestamp + ctypedef PmTimestamp (*PmTimeProcPtr)(void *time_info) + #PmBefore is not defined... + PmDeviceInfo* Pm_GetDeviceInfo( PmDeviceID id ) + PmError Pm_OpenInput( PortMidiStream** stream, + PmDeviceID inputDevice, + void *inputDriverInfo, + long bufferSize, + long (*PmPtr) (), # long = PtTimestamp + void *time_info ) + PmError Pm_OpenOutput( PortMidiStream** stream, + PmDeviceID outputDevice, + void *outputDriverInfo, + long bufferSize, + #long (*PmPtr) (), # long = PtTimestamp + PmTimeProcPtr time_proc, # long = PtTimestamp + void *time_info, + long latency ) + PmError Pm_SetFilter( PortMidiStream* stream, long filters ) + PmError Pm_Abort( PortMidiStream* stream ) + PmError Pm_Close( PortMidiStream* stream ) + ctypedef long PmMessage + ctypedef struct PmEvent: + PmMessage message + PmTimestamp timestamp + PmError Pm_Read( PortMidiStream *stream, PmEvent *buffer, long length ) + PmError Pm_Poll( PortMidiStream *stream) + int Pm_Channel(int channel) + PmError Pm_SetChannelMask(PortMidiStream *stream, int mask) + PmError Pm_Write( PortMidiStream *stream, PmEvent *buffer, long length ) + PmError Pm_WriteSysEx( PortMidiStream *stream, PmTimestamp when, unsigned char *msg) + +cdef extern from "porttime.h": + ctypedef enum PtError: + ptNoError = 0, + ptHostError = -10000, + ptAlreadyStarted, + ptAlreadyStopped, + ptInsufficientMemory + ctypedef long PtTimestamp + ctypedef void (* PtCallback)( PtTimestamp timestamp, void *userData ) + PtError Pt_Start(int resolution, PtCallback *callback, void *userData) + PtTimestamp Pt_Time() + +FILT_ACTIVE=0x1 +FILT_SYSEX=0x2 +FILT_CLOCK=0x4 +FILT_PLAY=0x8 +FILT_F9=0x10 +FILT_TICK=0x10 +FILT_FD=0x20 +FILT_UNDEFINED=0x30 +FILT_RESET=0x40 +FILT_REALTIME=0x7F +FILT_NOTE=0x80 +FILT_CHANNEL_AFTERTOUCH=0x100 +FILT_POLY_AFTERTOUCH=0x200 +FILT_AFTERTOUCH=0x300 +FILT_PROGRAM=0x400 +FILT_CONTROL=0x800 +FILT_PITCHBEND=0x1000 +FILT_MTC=0x2000 +FILT_SONG_POSITION=0x4000 +FILT_SONG_SELECT=0x8000 +FILT_TUNE=0x10000 +FALSE=0 +TRUE=1 + +def Initialize(): + """ +Initialize: call this first + """ + Pm_Initialize() + Pt_Start(1, NULL, NULL) # /* equiv to TIME_START: start timer w/ ms accuracy */ + +def Terminate(): + """ +Terminate: call this to clean up Midi streams when done. +If you do not call this on Windows machines when you are +done with MIDI, your system may crash. + """ + Pm_Terminate() + +def GetDefaultInputDeviceID(): + return Pm_GetDefaultInputDeviceID() + +def GetDefaultOutputDeviceID(): + return Pm_GetDefaultOutputDeviceID() + +def CountDevices(): + return Pm_CountDevices() + +def GetDeviceInfo(i): + """ +GetDeviceInfo(<device number>): returns 5 parameters + - underlying MIDI API + - device name + - TRUE iff input is available + - TRUE iff output is available + - TRUE iff device stream is already open + """ + cdef PmDeviceInfo *info + + # disregarding the constness from Pm_GetDeviceInfo, since pyrex doesn't do const. + info = <PmDeviceInfo *>Pm_GetDeviceInfo(i) + + if info <> NULL: return info.interf, info.name, info.input, info.output, info.opened + else: return + +def Time(): + """ +Time() returns the current time in ms +of the PortMidi timer + """ + return Pt_Time() + +def GetErrorText(err): + """ +GetErrorText(<err num>) returns human-readable error +messages translated from error numbers + """ + return Pm_GetErrorText(err) + +def Channel(chan): + """ +Channel(<chan>) is used with ChannelMask on input MIDI streams. +Example: to receive input on channels 1 and 10 on a MIDI + stream called MidiIn: +MidiIn.SetChannelMask(pypm.Channel(1) | pypm.Channel(10)) + +note: PyPortMidi Channel function has been altered from + the original PortMidi c call to correct for what + seems to be a bug --- i.e. channel filters were + all numbered from 0 to 15 instead of 1 to 16. + """ + return Pm_Channel(chan-1) + +cdef class Output: + """ +class Output: + define an output MIDI stream. Takes the form: + x = pypm.Output(MidiOutputDevice, latency) + latency is in ms. + If latency = 0 then timestamps for output are ignored. + """ + cdef int i + cdef PmStream *midi + cdef int debug + cdef int _aborted + + def __init__(self, OutputDevice, latency=0): + + cdef PmError err + #cdef PtTimestamp (*PmPtr) () + cdef PmTimeProcPtr PmPtr + + self.i = OutputDevice + self.debug = 0 + self._aborted = 0 + + if latency == 0: + PmPtr = NULL + else: + PmPtr = <PmTimeProcPtr>&Pt_Time + if self.debug: print "Opening Midi Output" + # Why is bufferSize 0 here? + err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency) + if err < 0: + s = Pm_GetErrorText(err) + # Something's amiss here - if we try to throw an Exception + # here, we crash. + if not err == -10000: + raise Exception,s + else: + print "Unable to open Midi OutputDevice=",OutputDevice," err=",s + + def __dealloc__(self): + if self.debug: print "Closing MIDI output stream and destroying instance" + #err = Pm_Abort(self.midi) + #if err < 0: raise Exception, Pm_GetErrorText(err) + err = Pm_Close(self.midi) + if err < 0: raise Exception, Pm_GetErrorText(err) + + + def _check_open(self): + """ checks to see if the midi is open, and if not, raises an error. + """ + + if self.midi == NULL: + raise Exception, "midi Output not open." + + if self._aborted: + raise Exception, "midi Output aborted. Need to call Close after Abort." + + def Close(self): + """ +Close() + closes a midi stream, flushing any pending buffers. + (PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows.) + """ + #if not self.midi: + # return + + err = Pm_Close(self.midi) + if err < 0: + raise Exception, Pm_GetErrorText(err) + #self.midi = NULL + + + def Abort(self): + """ +Abort() terminates outgoing messages immediately + The caller should immediately close the output port; + this call may result in transmission of a partial midi message. + There is no abort for Midi input because the user can simply + ignore messages in the buffer and close an input device at + any time. + """ + #if not self.midi: + # return + + err = Pm_Abort(self.midi) + if err < 0: + raise Exception, Pm_GetErrorText(err) + + self._aborted = 1 + + + def Write(self, data): + """ +Write(data) + output a series of MIDI information in the form of a list: + Write([[[status <,data1><,data2><,data3>],timestamp], + [[status <,data1><,data2><,data3>],timestamp],...]) + <data> fields are optional + example: choose program change 1 at time 20000 and + send note 65 with velocity 100 500 ms later. + Write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) + notes: + 1. timestamps will be ignored if latency = 0. + 2. To get a note to play immediately, send MIDI info with + timestamp read from function Time. + 3. understanding optional data fields: + Write([[[0xc0,0,0],20000]]) is equivalent to + Write([[[0xc0],20000]]) + """ + cdef PmEvent buffer[1024] + cdef PmError err + cdef int i + + self._check_open() + + + if len(data) > 1024: raise IndexError, 'maximum list length is 1024' + else: + for loop1 in range(len(data)): + if ((len(data[loop1][0]) > 4) | + (len(data[loop1][0]) < 1)): + raise IndexError, str(len(data[loop1][0]))+' arguments in event list' + buffer[loop1].message = 0 + for i in range(len(data[loop1][0])): + buffer[loop1].message = buffer[loop1].message + ((data[loop1][0][i]&0xFF) << (8*i)) + buffer[loop1].timestamp = data[loop1][1] + if self.debug: print loop1," : ",buffer[loop1].message," : ",buffer[loop1].timestamp + if self.debug: print "writing to midi buffer" + err= Pm_Write(self.midi, buffer, len(data)) + if err < 0: raise Exception, Pm_GetErrorText(err) + + def WriteShort(self, status, data1 = 0, data2 = 0): + """ +WriteShort(status <, data1><, data2>) + output MIDI information of 3 bytes or less. + data fields are optional + status byte could be: + 0xc0 = program change + 0x90 = note on + etc. + data bytes are optional and assumed 0 if omitted + example: note 65 on with velocity 100 + WriteShort(0x90,65,100) + """ + cdef PmEvent buffer[1] + cdef PmError err + self._check_open() + + buffer[0].timestamp = Pt_Time() + buffer[0].message = ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF)) + if self.debug: print "Writing to MIDI buffer" + err = Pm_Write(self.midi, buffer, 1) # stream, buffer, length + if err < 0 : raise Exception, Pm_GetErrorText(err) + + def WriteSysEx(self, when, msg): + """ + WriteSysEx(<timestamp>,<msg>) + writes a timestamped system-exclusive midi message. + <msg> can be a *list* or a *string* + example: + (assuming y is an input MIDI stream) + y.WriteSysEx(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7') + is equivalent to + y.WriteSysEx(pypm.Time, + [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7]) + """ + cdef PmError err + cdef char *cmsg + cdef PtTimestamp CurTime + + self._check_open() + + if type(msg) is list: + msg = array.array('B',msg).tostring() # Markus Pfaff contribution + cmsg = msg + + CurTime = Pt_Time() + err = Pm_WriteSysEx(self.midi, when, <unsigned char *> cmsg) + if err < 0 : raise Exception, Pm_GetErrorText(err) + while Pt_Time() == CurTime: # wait for SysEx to go thru or...my + pass # win32 machine crashes w/ multiple SysEx + + + + + + + + + + + +cdef class Input: + """ +class Input: + define an input MIDI stream. Takes the form: + x = pypm.Input(MidiInputDevice) + """ + cdef PmStream *midi + cdef int debug + cdef int i + + def __init__(self, InputDevice, buffersize=4096): + cdef PmError err + self.i = InputDevice + self.debug = 0 + err= Pm_OpenInput(&(self.midi),self.i,NULL,buffersize,&Pt_Time,NULL) + if err < 0: raise Exception, Pm_GetErrorText(err) + if self.debug: print "MIDI input opened." + + def __dealloc__(self): + cdef PmError err + if self.debug: print "Closing MIDI input stream and destroying instance" + + err = Pm_Close(self.midi) + if err < 0: + raise Exception, Pm_GetErrorText(err) + + + + def _check_open(self): + """ checks to see if the midi is open, and if not, raises an error. + """ + + if self.midi == NULL: + raise Exception, "midi Input not open." + + + def Close(self): + """ +Close() + closes a midi stream, flushing any pending buffers. + (PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows.) + """ + #if not self.midi: + # return + + err = Pm_Close(self.midi) + if err < 0: + raise Exception, Pm_GetErrorText(err) + #self.midi = NULL + + + + def SetFilter(self, filters): + """ + SetFilter(<filters>) sets filters on an open input stream + to drop selected input types. By default, only active sensing + messages are filtered. To prohibit, say, active sensing and + sysex messages, call + SetFilter(stream, FILT_ACTIVE | FILT_SYSEX); + + Filtering is useful when midi routing or midi thru functionality + is being provided by the user application. + For example, you may want to exclude timing messages + (clock, MTC, start/stop/continue), while allowing note-related + messages to pass. Or you may be using a sequencer or drum-machine + for MIDI clock information but want to exclude any notes + it may play. + + Note: SetFilter empties the buffer after setting the filter, + just in case anything got through. + """ + cdef PmEvent buffer[1] + cdef PmError err + + self._check_open() + + + err = Pm_SetFilter(self.midi, filters) + + if err < 0: raise Exception, Pm_GetErrorText(err) + + while(Pm_Poll(self.midi) != pmNoError): + + err = Pm_Read(self.midi,buffer,1) + if err < 0: raise Exception, Pm_GetErrorText(err) + + def SetChannelMask(self, mask): + """ + SetChannelMask(<mask>) filters incoming messages based on channel. + The mask is a 16-bit bitfield corresponding to appropriate channels + Channel(<channel>) can assist in calling this function. + i.e. to set receive only input on channel 1, call with + SetChannelMask(Channel(1)) + Multiple channels should be OR'd together, like + SetChannelMask(Channel(10) | Channel(11)) + note: PyPortMidi Channel function has been altered from + the original PortMidi c call to correct for what + seems to be a bug --- i.e. channel filters were + all numbered from 0 to 15 instead of 1 to 16. + """ + cdef PmError err + + self._check_open() + + err = Pm_SetChannelMask(self.midi,mask) + if err < 0: raise Exception, Pm_GetErrorText(err) + + def Poll(self): + """ + Poll tests whether input is available, + returning TRUE, FALSE, or an error value. + """ + cdef PmError err + self._check_open() + + err = Pm_Poll(self.midi) + if err < 0: raise Exception, Pm_GetErrorText(err) + return err + + def Read(self,length): + """ +Read(length): returns up to <length> midi events stored in +the buffer and returns them as a list: +[[[status,data1,data2,data3],timestamp], + [[status,data1,data2,data3],timestamp],...] +example: Read(50) returns all the events in the buffer, + up to 50 events. + """ + cdef PmEvent buffer[1024] + + self._check_open() + + x = [] + + if length > 1024: raise IndexError, 'maximum buffer length is 1024' + if length < 1: raise IndexError, 'minimum buffer length is 1' + NumEvents = Pm_Read(self.midi,buffer,length) + if NumEvents < 0: raise Exception, Pm_GetErrorText(NumEvents) + x=[] + if NumEvents >= 1: + for loop in range(NumEvents): + x.append([[buffer[loop].message & 0xff, (buffer[loop].message >> 8) & 0xFF, (buffer[loop].message >> 16) & 0xFF, (buffer[loop].message >> 24) & 0xFF], buffer[loop].timestamp]) + return x diff --git a/pd/portmidi/pm_python/pyportmidi/midi.py b/pd/portmidi/pm_python/pyportmidi/midi.py new file mode 100644 index 000000000..71e4f2b4b --- /dev/null +++ b/pd/portmidi/pm_python/pyportmidi/midi.py @@ -0,0 +1,566 @@ +""" +Module for interacting with midi input and output. + +The midi module can send output to midi devices, and get input +from midi devices. It can also list midi devices on the system. + +Including real midi devices, and virtual ones. + +It uses the portmidi library. Is portable to which ever platforms +portmidi supports (currently windows, OSX, and linux). +""" + +import atexit + + + +_init = False +_pypm = None + + +__all__ = [ "Input", + "MidiException", + "Output", + "get_count", + "get_default_input_id", + "get_default_output_id", + "get_device_info", + "init", + "quit", + "time", + ] + +__theclasses__ = ["Input", "Output"] + + +def init(): + """initialize the midi module + pyportmidi.init(): return None + + Call the initialisation function before using the midi module. + + It is safe to call this more than once. + """ + global _init, _pypm + if not _init: + import pyportmidi._pyportmidi + _pypm = pyportmidi._pyportmidi + + _pypm.Initialize() + _init = True + atexit.register(quit) + + +def quit(): + """uninitialize the midi module + pyportmidi.quit(): return None + + + Called automatically atexit if you don't call it. + + It is safe to call this function more than once. + """ + global _init, _pypm + if _init: + # TODO: find all Input and Output classes and close them first? + _pypm.Terminate() + _init = False + del _pypm + +def _check_init(): + if not _init: + raise RuntimeError("pyportmidi not initialised.") + +def get_count(): + """gets the number of devices. + pyportmidi.get_count(): return num_devices + + + Device ids range from 0 to get_count() -1 + """ + _check_init() + return _pypm.CountDevices() + + + + +def get_default_input_id(): + """gets default input device number + pyportmidi.get_default_input_id(): return default_id + + + Return the default device ID or -1 if there are no devices. + The result can be passed to the Input()/Ouput() class. + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PM_RECOMMENDED_INPUT_DEVICE=1 + + The user should first determine the available device ID by using + the supplied application "testin" or "testout". + + In general, the registry is a better place for this kind of info, + and with USB devices that can come and go, using integers is not + very reliable for device identification. Under Windows, if + PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is + *NOT* found in the environment, then the default device is obtained + by looking for a string in the registry under: + HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device + and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device + for a string. The number of the first device with a substring that + matches the string exactly is returned. For example, if the string + in the registry is "USB", and device 1 is named + "In USB MidiSport 1x1", then that will be the default + input because it contains the string "USB". + + In addition to the name, get_device_info() returns "interf", which + is the interface name. (The "interface" is the underlying software + system or API used by PortMidi to access devices. Examples are + MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) + At present, the only Win32 interface is "MMSystem", the only Linux + interface is "ALSA", and the only Max OS X interface is "CoreMIDI". + To specify both the interface and the device name in the registry, + separate the two with a comma and a space, e.g.: + MMSystem, In USB MidiSport 1x1 + In this case, the string before the comma must be a substring of + the "interf" string, and the string after the space must be a + substring of the "name" name string in order to match the device. + + Note: in the current release, the default is simply the first device + (the input or output device with the lowest PmDeviceID). + """ + return _pypm.GetDefaultInputDeviceID() + + + + +def get_default_output_id(): + """gets default output device number + pyportmidi.get_default_output_id(): return default_id + + + Return the default device ID or -1 if there are no devices. + The result can be passed to the Input()/Ouput() class. + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PM_RECOMMENDED_OUTPUT_DEVICE=1 + + The user should first determine the available device ID by using + the supplied application "testin" or "testout". + + In general, the registry is a better place for this kind of info, + and with USB devices that can come and go, using integers is not + very reliable for device identification. Under Windows, if + PM_RECOMMENDED_OUTPUT_DEVICE (or PM_RECOMMENDED_INPUT_DEVICE) is + *NOT* found in the environment, then the default device is obtained + by looking for a string in the registry under: + HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device + and HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device + for a string. The number of the first device with a substring that + matches the string exactly is returned. For example, if the string + in the registry is "USB", and device 1 is named + "In USB MidiSport 1x1", then that will be the default + input because it contains the string "USB". + + In addition to the name, get_device_info() returns "interf", which + is the interface name. (The "interface" is the underlying software + system or API used by PortMidi to access devices. Examples are + MMSystem, DirectX (not implemented), ALSA, OSS (not implemented), etc.) + At present, the only Win32 interface is "MMSystem", the only Linux + interface is "ALSA", and the only Max OS X interface is "CoreMIDI". + To specify both the interface and the device name in the registry, + separate the two with a comma and a space, e.g.: + MMSystem, In USB MidiSport 1x1 + In this case, the string before the comma must be a substring of + the "interf" string, and the string after the space must be a + substring of the "name" name string in order to match the device. + + Note: in the current release, the default is simply the first device + (the input or output device with the lowest PmDeviceID). + """ + _check_init() + return _pypm.GetDefaultOutputDeviceID() + + +def get_device_info(an_id): + """ returns information about a midi device + pyportmidi.get_device_info(an_id): return (interf, name, input, output, opened) + + interf - a text string describing the device interface, eg 'ALSA'. + name - a text string for the name of the device, eg 'Midi Through Port-0' + input - 0, or 1 if the device is an input device. + output - 0, or 1 if the device is an output device. + opened - 0, or 1 if the device is opened. + + If the id is out of range, the function returns None. + """ + _check_init() + return _pypm.GetDeviceInfo(an_id) + + +class Input(object): + """Input is used to get midi input from midi devices. + Input(device_id) + Input(device_id, buffer_size) + + buffer_size -the number of input events to be buffered waiting to + be read using Input.read() + """ + + def __init__(self, device_id, buffer_size=4096): + """ + The buffer_size specifies the number of input events to be buffered + waiting to be read using Input.read(). + """ + _check_init() + + if device_id == -1: + raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") + + try: + r = get_device_info(device_id) + except TypeError: + raise TypeError("an integer is required") + except OverflowError: + raise OverflowError("long int too large to convert to int") + + # and now some nasty looking error checking, to provide nice error + # messages to the kind, lovely, midi using people of whereever. + if r: + interf, name, input, output, opened = r + if input: + try: + self._input = _pypm.Input(device_id, buffer_size) + except TypeError: + raise TypeError("an integer is required") + self.device_id = device_id + + elif output: + raise MidiException("Device id given is not a valid input id, it is an output id.") + else: + raise MidiException("Device id given is not a valid input id.") + else: + raise MidiException("Device id invalid, out of range.") + + + + + def _check_open(self): + if self._input is None: + raise MidiException("midi not open.") + + + + def close(self): + """ closes a midi stream, flushing any pending buffers. + Input.close(): return None + + PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows. + """ + _check_init() + if not (self._input is None): + self._input.Close() + self._input = None + + + + def read(self, num_events): + """reads num_events midi events from the buffer. + Input.read(num_events): return midi_event_list + + Reads from the Input buffer and gives back midi events. + [[[status,data1,data2,data3],timestamp], + [[status,data1,data2,data3],timestamp],...] + """ + _check_init() + self._check_open() + return self._input.Read(num_events) + + + def poll(self): + """returns true if there's data, or false if not. + Input.poll(): return Bool + + raises a MidiException on error. + """ + _check_init() + self._check_open() + + r = self._input.Poll() + if r == _pypm.TRUE: + return True + elif r == _pypm.FALSE: + return False + else: + err_text = GetErrorText(r) + raise MidiException( (r, err_text) ) + + + + +class Output(object): + """Output is used to send midi to an output device + Output(device_id) + Output(device_id, latency = 0) + Output(device_id, buffer_size = 4096) + Output(device_id, latency, buffer_size) + + The buffer_size specifies the number of output events to be + buffered waiting for output. (In some cases -- see below -- + PortMidi does not buffer output at all and merely passes data + to a lower-level API, in which case buffersize is ignored.) + + latency is the delay in milliseconds applied to timestamps to determine + when the output should actually occur. (If latency is < 0, 0 is + assumed.) + + If latency is zero, timestamps are ignored and all output is delivered + immediately. If latency is greater than zero, output is delayed until + the message timestamp plus the latency. (NOTE: time is measured + relative to the time source indicated by time_proc. Timestamps are + absolute, not relative delays or offsets.) In some cases, PortMidi + can obtain better timing than your application by passing timestamps + along to the device driver or hardware. Latency may also help you + to synchronize midi data to audio data by matching midi latency to + the audio buffer latency. + + """ + + def __init__(self, device_id, latency = 0, buffer_size = 4096): + """Output(device_id) + Output(device_id, latency = 0) + Output(device_id, buffer_size = 4096) + Output(device_id, latency, buffer_size) + + The buffer_size specifies the number of output events to be + buffered waiting for output. (In some cases -- see below -- + PortMidi does not buffer output at all and merely passes data + to a lower-level API, in which case buffersize is ignored.) + + latency is the delay in milliseconds applied to timestamps to determine + when the output should actually occur. (If latency is < 0, 0 is + assumed.) + + If latency is zero, timestamps are ignored and all output is delivered + immediately. If latency is greater than zero, output is delayed until + the message timestamp plus the latency. (NOTE: time is measured + relative to the time source indicated by time_proc. Timestamps are + absolute, not relative delays or offsets.) In some cases, PortMidi + can obtain better timing than your application by passing timestamps + along to the device driver or hardware. Latency may also help you + to synchronize midi data to audio data by matching midi latency to + the audio buffer latency. + """ + + _check_init() + self._aborted = 0 + + if device_id == -1: + raise MidiException("Device id is -1, not a valid output id. -1 usually means there were no default Output devices.") + + try: + r = get_device_info(device_id) + except TypeError: + raise TypeError("an integer is required") + except OverflowError: + raise OverflowError("long int too large to convert to int") + + # and now some nasty looking error checking, to provide nice error + # messages to the kind, lovely, midi using people of whereever. + if r: + interf, name, input, output, opened = r + if output: + try: + self._output = _pypm.Output(device_id, latency) + except TypeError: + raise TypeError("an integer is required") + self.device_id = device_id + + elif input: + raise MidiException("Device id given is not a valid output id, it is an input id.") + else: + raise MidiException("Device id given is not a valid output id.") + else: + raise MidiException("Device id invalid, out of range.") + + def _check_open(self): + if self._output is None: + raise MidiException("midi not open.") + + if self._aborted: + raise MidiException("midi aborted.") + + + def close(self): + """ closes a midi stream, flushing any pending buffers. + Output.close(): return None + + PortMidi attempts to close open streams when the application + exits -- this is particularly difficult under Windows. + """ + _check_init() + if not (self._output is None): + self._output.Close() + self._output = None + + def abort(self): + """terminates outgoing messages immediately + Output.abort(): return None + + The caller should immediately close the output port; + this call may result in transmission of a partial midi message. + There is no abort for Midi input because the user can simply + ignore messages in the buffer and close an input device at + any time. + """ + + _check_init() + if self._output: + self._output.Abort() + self._aborted = 1 + + + + + + def write(self, data): + """writes a list of midi data to the Output + Output.write(data) + + writes series of MIDI information in the form of a list: + write([[[status <,data1><,data2><,data3>],timestamp], + [[status <,data1><,data2><,data3>],timestamp],...]) + <data> fields are optional + example: choose program change 1 at time 20000 and + send note 65 with velocity 100 500 ms later. + write([[[0xc0,0,0],20000],[[0x90,60,100],20500]]) + notes: + 1. timestamps will be ignored if latency = 0. + 2. To get a note to play immediately, send MIDI info with + timestamp read from function Time. + 3. understanding optional data fields: + write([[[0xc0,0,0],20000]]) is equivalent to + write([[[0xc0],20000]]) + + Can send up to 1024 elements in your data list, otherwise an + IndexError exception is raised. + """ + _check_init() + self._check_open() + + self._output.Write(data) + + + def write_short(self, status, data1 = 0, data2 = 0): + """write_short(status <, data1><, data2>) + Output.write_short(status) + Output.write_short(status, data1 = 0, data2 = 0) + + output MIDI information of 3 bytes or less. + data fields are optional + status byte could be: + 0xc0 = program change + 0x90 = note on + etc. + data bytes are optional and assumed 0 if omitted + example: note 65 on with velocity 100 + write_short(0x90,65,100) + """ + _check_init() + self._check_open() + self._output.WriteShort(status, data1, data2) + + + def write_sys_ex(self, when, msg): + """writes a timestamped system-exclusive midi message. + Output.write_sys_ex(when, msg) + + msg - can be a *list* or a *string* + when - a timestamp in miliseconds + example: + (assuming o is an onput MIDI stream) + o.write_sys_ex(0,'\\xF0\\x7D\\x10\\x11\\x12\\x13\\xF7') + is equivalent to + o.write_sys_ex(pyportmidi.time(), + [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7]) + """ + _check_init() + self._check_open() + self._output.WriteSysEx(when, msg) + + + def note_on(self, note, velocity=None, channel = 0): + """turns a midi note on. Note must be off. + Output.note_on(note, velocity=None, channel = 0) + + Turn a note on in the output stream. The note must already + be off for this to work correctly. + """ + if velocity is None: + velocity = 0 + + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0x90+channel, note, velocity) + + def note_off(self, note, velocity=None, channel = 0): + """turns a midi note off. Note must be on. + Output.note_off(note, velocity=None, channel = 0) + + Turn a note off in the output stream. The note must already + be on for this to work correctly. + """ + if velocity is None: + velocity = 0 + + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0x80 + channel, note, velocity) + + + def set_instrument(self, instrument_id, channel = 0): + """select an instrument, with a value between 0 and 127 + Output.set_instrument(instrument_id, channel = 0) + + """ + if not (0 <= instrument_id <= 127): + raise ValueError("Undefined instrument id: %d" % instrument_id) + + if not (0 <= channel <= 15): + raise ValueError("Channel not between 0 and 15.") + + self.write_short(0xc0+channel, instrument_id) + + + +def time(): + """returns the current time in ms of the PortMidi timer + pyportmidi.time(): return time + + The time is reset to 0, when the module is inited. + """ + return _pypm.Time() + + + + + + + + +class MidiException(Exception): + """MidiException(errno) that can be raised. + """ + def __init__(self, value): + self.parameter = value + def __str__(self): + return repr(self.parameter) + + + diff --git a/pd/portmidi/pm_python/setup.py b/pd/portmidi/pm_python/setup.py new file mode 100644 index 000000000..14ab1c758 --- /dev/null +++ b/pd/portmidi/pm_python/setup.py @@ -0,0 +1,185 @@ +import sys +import os +import logging + +from distutils.core import setup, Command +from distutils.extension import Extension +try: + from Cython.Distutils import build_ext +except ImportError: + logging.warn("Cython is preferred over pyrex for python3 compatibility.") + from Pyrex.Distutils import build_ext + + + + + +DESCRIPTION = open('README_PYTHON.txt').read() +CHANGES = open('CHANGES.txt').read() +TODO = open('TODO.txt').read() + +EXTRAS = {} + +long_description = DESCRIPTION + CHANGES + TODO +#import sys +#if "checkdocs" in sys.argv: +# print long_description + + +METADATA = { + 'name': 'pyportmidi', + 'version': '0.0.7', + 'license': 'MIT License', + 'url': 'http://pypi.python.org/pyportmidi/', + 'author': 'John Harrison, Roger B. Dannenberg, Rene Dudfield, others...', + 'author_email': 'renesd@gmail.com', + 'maintainer': 'Rene Dudfield', + 'maintainer_email': 'renesd@gmail.com', + 'description': 'Python Wrappings for PortMidi #python. CHANGES: new package layout.', + 'long_description': long_description, + 'classifiers': [ + 'Development Status :: 2 - Pre-Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'License :: OSI Approved :: BSD License', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Cython', + 'Programming Language :: C', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.0', + 'Programming Language :: Python :: 3.1', + 'Programming Language :: Python :: 3.2', + 'Topic :: Multimedia :: Sound/Audio :: MIDI', + 'Topic :: Software Development :: Libraries', + ], +} + + +if "bdist_msi" in sys.argv: + # hack the version name to a format msi doesn't have trouble with + METADATA["version"] = METADATA["version"].replace("pre", "a0") + METADATA["version"] = METADATA["version"].replace("rc", "b0") + METADATA["version"] = METADATA["version"].replace("release", "") + + + + + +# allow optionally using setuptools for bdist_egg. +using_setuptools = False + +if "-setuptools" in sys.argv: + using_setuptools = True + + from setuptools import setup, Command + sys.argv.remove ("-setuptools") + + EXTRAS.update({'include_package_data': True, + 'install_requires': [], + 'zip_safe': False, + 'test_suite' : 'pyportmidi.tests', + } + ) + + +# test command. For doing 'python setup.py test' +class TestCommand(Command): + user_options = [ ] + + def initialize_options(self): + self._dir = os.getcwd() + + def finalize_options(self): + pass + + def run(self): + ''' + runs the tests with default options. + ''' + import pyportmidi.tests + pyportmidi.tests.main() + + #import subprocess + #return subprocess.call([sys.executable, "run_tests.py"]) + + +cmdclass = {'build_ext': build_ext} + +# we use our test command. +if not using_setuptools: + import os + cmdclass['test'] = TestCommand + + + +scripts = [] + +PACKAGEDATA = { + 'cmdclass': cmdclass, + + 'package_dir': {'pyportmidi': 'pyportmidi', + #'pyportmidi.tests': 'test', + #'pyportmidi.docs': 'docs', + #'pyportmidi.examples': 'examples', + + }, + 'packages': ['pyportmidi', + 'pyportmidi.tests', + ], + 'scripts': scripts, +} + + +PACKAGEDATA.update(METADATA) +PACKAGEDATA.update(EXTRAS) + + + +if sys.platform == 'win32': + print "Found Win32 platform" + EXTENSION = dict( + ext_modules=[ + Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")], + library_dirs = ["../Release"], + libraries = ["portmidi", "winmm"], + include_dirs = ["../porttime"], +# define_macros = [("_WIN32_", None)]) # needed by portmidi.h + extra_compile_args = ["/DWIN32"]) # needed by portmidi.h + ] + ) +elif sys.platform == 'darwin': + print "Found darwin (OS X) platform" + library_dirs = ["/usr/local/lib"] + include_dirs = ["/usr/local/include"] + EXTENSION = dict( + ext_modules=[ + Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")], + library_dirs = library_dirs, + include_dirs = include_dirs, + libraries = ["portmidi"], + extra_link_args=["-framework", "CoreFoundation", + "-framework", "CoreMIDI", + "-framework", "CoreAudio"]) + ] + ) +else: + print "Assuming Linux platform" + EXTENSION = dict( + ext_modules=[ + Extension("pyportmidi._pyportmidi", [os.path.join("pyportmidi", "_pyportmidi.pyx")], + library_dirs=["./linux"], + libraries = ["portmidi", "asound", "pthread"] + ) + ] + + ) + +PACKAGEDATA.update(EXTENSION) + +setup(**PACKAGEDATA) diff --git a/pd/portmidi/pm_qt/README_QT.txt b/pd/portmidi/pm_qt/README_QT.txt new file mode 100644 index 000000000..613f4a19e --- /dev/null +++ b/pd/portmidi/pm_qt/README_QT.txt @@ -0,0 +1,15 @@ +README_QT.txt for PortMidi +Richard Starfield +20 Sep 2010 + +This is a QtCreator build file for PortMidi. + +To build PortMidi on Windows with QtCreator: + +Move portmidi/pm_qt/portmidi.pro to portmidi/portmidi.pro + +Open portmidi.pro in QtCreator, change to the release build option and build all to compile the static library. + +This has been tested in Windows. The project file does include Linux build switches but they haven't been tested yet. + +To compile a DLL instead of a static library change line 11 from "CONFIG += staticlib" to "CONFIG += DLL" diff --git a/pd/portmidi/pm_qt/portmidi.pro b/pd/portmidi/pm_qt/portmidi.pro new file mode 100644 index 000000000..886eec8f0 --- /dev/null +++ b/pd/portmidi/pm_qt/portmidi.pro @@ -0,0 +1,47 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2010-09-02T12:50:47 +# +#------------------------------------------------- + +QT -= core gui + +TARGET = portmidi +TEMPLATE = lib +CONFIG += staticlib # replace this with DLL for dynamic link on Windows + +INCLUDEPATH = pm_common/ porttime/ + +win32 { + INCLUDEPATH += pm_win/ + LIBS += -lwinmm + SOURCES += pm_win/pmwinmm.c \ + pm_win/pmwin.c + HEADERS += pm_win/pmwinmm.h +} + +# this build hasn't been tested on Linux yet +unix { + DEFINES += PMALSA + INCLUDEPATH += pm_linux/ + LIBS += -lasound + SOURCES += pm_linux/finddefault.c \ + pm_linux/pmlinux.c \ + pm_linux/pmlinuxalsa.c + HEADERS += pm_linux/pmlinux.h pm_linux/pmlinuxalsa.h +} + + +DEFINES -= UNICODE + +SOURCES += \ + pm_common/portmidi.c \ + pm_common/pmutil.c \ + porttime/porttime.c \ + porttime/ptwinmm.c + +HEADERS += \ + pm_common/pmutil.h \ + pm_common/pminternal.h \ + pm_common/portmidi.h \ + porttime/porttime.h diff --git a/pd/portmidi/pm_test/CMakeLists.txt b/pd/portmidi/pm_test/CMakeLists.txt new file mode 100644 index 000000000..b89074b0b --- /dev/null +++ b/pd/portmidi/pm_test/CMakeLists.txt @@ -0,0 +1,26 @@ +# pm_test + +# set the build directory to be in portmidi, not in portmidi/pm_test +# this is required for Xcode: +if(APPLE) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) +endif(APPLE) + +if(WIN32) +include(../pm_win/static.cmake) +endif(WIN32) + +macro(make_a_test name) + add_executable(${name} ${name}.c) + target_link_libraries(${name} portmidi-static ${PM_NEEDED_LIBS}) + add_dependencies(${name} portmidi-static) +endmacro(make_a_test) + +make_a_test(test) +make_a_test(midithread) +make_a_test(midithru) +make_a_test(sysex) +make_a_test(latency) +make_a_test(mm) +make_a_test(midiclock) +make_a_test(qtest) diff --git a/pd/portmidi/pm_test/latency.c b/pd/portmidi/pm_test/latency.c new file mode 100755 index 000000000..507648c12 --- /dev/null +++ b/pd/portmidi/pm_test/latency.c @@ -0,0 +1,290 @@ +/* latency.c -- measure latency of OS */ + +#include "porttime.h" +#include "portmidi.h" +#include "stdlib.h" +#include "stdio.h" +#include "string.h" +#include "assert.h" + +/* Latency is defined here to mean the time starting when a + process becomes ready to run, and ending when the process + actually runs. Latency is due to contention for the + processor, usually due to other processes, OS activity + including device drivers handling interrupts, and + waiting for the scheduler to suspend the currently running + process and activate the one that is waiting. + + Latency can affect PortMidi applications: if a process fails + to wake up promptly, MIDI input may sit in the input buffer + waiting to be handled, and MIDI output may not be generated + with accurate timing. Using the latency parameter when + opening a MIDI output port allows the caller to defer timing + to PortMidi, which in most implementations will pass the + data on to the OS. By passing timestamps and data to the + OS kernel, device driver, or even hardware, there are fewer + sources of latency that can affect the ultimate timing of + the data. On the other hand, the application must generate + and deliver the data ahead of the timestamp. The amount by + which data is computed early must be at least as large as + the worst-case latency to avoid timing problems. + + Latency is even more important in audio applications. If an + application lets an audio output buffer underflow, an audible + pop or click is produced. Audio input buffers can overflow, + causing data to be lost. In general the audio buffers must + be large enough to buffer the worst-case latency that the + application will encounter. + + This program measures latency by recording the difference + between the scheduled callback time and the current real time. + We do not really know the scheduled callback time, so we will + record the differences between the real time of each callback + and the real time of the previous callback. Differences that + are larger than the scheduled difference are recorded. Smaller + differences indicate the system is recovering from an earlier + latency, so these are ignored. + Since printing by the callback process can cause all sorts of + delays, this program records latency observations in a + histogram. When the program is stopped, the histogram is + printed to the console. + + Optionally the system can be tested under a load of MIDI input, + MIDI output, or both. If MIDI input is selected, the callback + thread will read any waiting MIDI events each iteration. You + must generate events on this interface for the test to actually + put any appreciable load on PortMidi. If MIDI output is + selected, alternating note on and note off events are sent each + X iterations, where you specify X. For example, with a timer + callback period of 2ms and X=1, a MIDI event is sent every 2ms. + + + INTERPRETING RESULTS: Time is quantized to 1ms, so there is + some uncertainty due to rounding. A microsecond latency that + spans the time when the clock is incremented will be reported + as a latency of 1. On the other hand, a latency of almost + 1ms that falls between two clock ticks will be reported as + zero. In general, if the highest nonzero bin is numbered N, + then the maximum latency is N+1. + +CHANGE LOG + +18-Jul-03 Mark Nelson -- Added code to generate MIDI or receive + MIDI during test, and made period user-settable. + */ + +#define HIST_LEN 21 /* how many 1ms bins in the histogram */ + +#define STRING_MAX 80 /* used for console input */ + +#define INPUT_BUFFER_SIZE 100 +#define OUTPUT_BUFFER_SIZE 0 + +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif +#ifndef min +#define min(a, b) ((a) <= (b) ? (a) : (b)) +#endif + +int get_number(char *prompt); + +PtTimestamp previous_callback_time = 0; + +int period; /* milliseconds per callback */ + +int histogram[HIST_LEN]; +int max_latency = 0; /* worst latency observed */ +int out_of_range = 0; /* how many points outside of HIST_LEN? */ + +int test_in, test_out; /* test MIDI in and/or out? */ +int output_period; /* output MIDI every __ iterations if test_out true */ +int iteration = 0; +PmStream *in, *out; +int note_on = 0; /* is the note currently on? */ + +/* callback function for PortTime -- computes histogram */ +void pt_callback(PtTimestamp timestamp, void *userData) +{ + PtTimestamp difference = timestamp - previous_callback_time - period; + previous_callback_time = timestamp; + + /* allow 5 seconds for the system to settle down */ + if (timestamp < 5000) return; + + iteration++; + /* send a note on/off if user requested it */ + if (test_out && (iteration % output_period == 0)) { + PmEvent buffer[1]; + buffer[0].timestamp = Pt_Time(NULL); + if (note_on) { + /* note off */ + buffer[0].message = Pm_Message(0x90, 60, 0); + note_on = 0; + } else { + /* note on */ + buffer[0].message = Pm_Message(0x90, 60, 100); + note_on = 1; + } + Pm_Write(out, buffer, 1); + iteration = 0; + } + + /* read all waiting events (if user requested) */ + if (test_in) { + PmError status; + PmEvent buffer[1]; + do { + status = Pm_Poll(in); + if (status == TRUE) { + Pm_Read(in,buffer,1); + } + } while (status == TRUE); + } + + if (difference < 0) return; /* ignore when system is "catching up" */ + + /* update the histogram */ + if (difference < HIST_LEN) { + histogram[difference]++; + } else { + out_of_range++; + } + + if (max_latency < difference) max_latency = difference; +} + + +int main() +{ + char line[STRING_MAX]; + int i; + int len; + int choice; + PtTimestamp stop; + printf("Latency histogram.\n"); + period = 0; + while (period < 1) { + period = get_number("Choose timer period (in ms, >= 1): "); + } + printf("Benchmark with:\n\t%s\n\t%s\n\t%s\n\t%s\n", + "1. No MIDI traffic", + "2. MIDI input", + "3. MIDI output", + "4. MIDI input and output"); + choice = get_number("? "); + switch (choice) { + case 1: test_in = 0; test_out = 0; break; + case 2: test_in = 1; test_out = 0; break; + case 3: test_in = 0; test_out = 1; break; + case 4: test_in = 1; test_out = 1; break; + default: assert(0); + } + if (test_in || test_out) { + /* list device information */ + for (i = 0; i < Pm_CountDevices(); i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if ((test_in && info->input) || + (test_out && info->output)) { + printf("%d: %s, %s", i, info->interf, info->name); + if (info->input) printf(" (input)"); + if (info->output) printf(" (output)"); + printf("\n"); + } + } + /* open stream(s) */ + if (test_in) { + int i = get_number("MIDI input device number: "); + Pm_OpenInput(&in, + i, + NULL, + INPUT_BUFFER_SIZE, + (PmTimestamp (*)(void *)) Pt_Time, + NULL); + /* turn on filtering; otherwise, input might overflow in the + 5-second period before timer callback starts reading midi */ + Pm_SetFilter(in, PM_FILT_ACTIVE | PM_FILT_CLOCK); + } + if (test_out) { + int i = get_number("MIDI output device number: "); + PmEvent buffer[1]; + Pm_OpenOutput(&out, + i, + NULL, + OUTPUT_BUFFER_SIZE, + (PmTimestamp (*)(void *)) Pt_Time, + NULL, + 0); /* no latency scheduling */ + + /* send a program change to force a status byte -- this fixes + a problem with a buggy linux MidiSport driver, and shouldn't + hurt anything else + */ + buffer[0].timestamp = 0; + buffer[0].message = Pm_Message(0xC0, 0, 0); /* program change */ + Pm_Write(out, buffer, 1); + + output_period = get_number( + "MIDI out should be sent every __ callback iterations: "); + + assert(output_period >= 1); + } + } + + printf("%s%s", "Latency measurements will start in 5 seconds. ", + "Type return to stop: "); + Pt_Start(period, &pt_callback, 0); + fgets(line, STRING_MAX, stdin); + stop = Pt_Time(); + Pt_Stop(); + + /* courteously turn off the last note, if necessary */ + if (note_on) { + PmEvent buffer[1]; + buffer[0].timestamp = Pt_Time(NULL); + buffer[0].message = Pm_Message(0x90, 60, 0); + Pm_Write(out, buffer, 1); + } + + /* print the histogram */ + printf("Duration of test: %g seconds\n\n", max(0, stop - 5000) * 0.001); + printf("Latency(ms) Number of occurrences\n"); + /* avoid printing beyond last non-zero histogram entry */ + len = min(HIST_LEN, max_latency + 1); + for (i = 0; i < len; i++) { + printf("%2d %10d\n", i, histogram[i]); + } + printf("Number of points greater than %dms: %d\n", + HIST_LEN - 1, out_of_range); + printf("Maximum latency: %d milliseconds\n", max_latency); + printf("\nNote that due to rounding, actual latency can be 1ms higher\n"); + printf("than the numbers reported here.\n"); + printf("Type return to exit..."); + fgets(line, STRING_MAX, stdin); + + if(choice == 2) + Pm_Close(in); + else if(choice == 3) + Pm_Close(out); + else if(choice == 4) + { + Pm_Close(in); + Pm_Close(out); + } + return 0; +} + + +/* read a number from console */ +int get_number(char *prompt) +{ + char line[STRING_MAX]; + int n = 0, i; + printf(prompt); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + + } + return i; +} diff --git a/pd/portmidi/pm_test/latency.vcproj b/pd/portmidi/pm_test/latency.vcproj new file mode 100755 index 000000000..afefed735 --- /dev/null +++ b/pd/portmidi/pm_test/latency.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="latency" + ProjectGUID="{41D78CBF-B04B-4561-BA4A-AC238C40633D}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="latency.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/latency.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\latency.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/latency.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\latency.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="latency.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/latency.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\latency.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/latency.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\latency.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\latency.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/midiclock.c b/pd/portmidi/pm_test/midiclock.c new file mode 100644 index 000000000..60fcf7a9a --- /dev/null +++ b/pd/portmidi/pm_test/midiclock.c @@ -0,0 +1,287 @@ +/* miditime.c -- a test program that sends midi clock and MTC */ + +#include "portmidi.h" +#include "porttime.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <ctype.h> + +#ifndef false +#define false 0 +#define true 1 +#endif + +#define private static +typedef int boolean; + +#define MIDI_TIME_CLOCK 0xf8 +#define MIDI_START 0xfa +#define MIDI_CONTINUE 0xfb +#define MIDI_STOP 0xfc +#define MIDI_Q_FRAME 0xf1 + +#define OUTPUT_BUFFER_SIZE 0 +#define DRIVER_INFO NULL +#define TIME_PROC ((int32_t (*)(void *)) Pt_Time) +#define TIME_INFO NULL +#define LATENCY 0 +#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */ + +#define STRING_MAX 80 /* used for console input */ + +/* to determine ms per clock: + * time per beat in seconds = 60 / tempo + * multiply by 1000 to get time per beat in ms: 60000 / tempo + * divide by 24 CLOCKs per beat: (60000/24) / tempo + * simplify: 2500 / tempo + */ +#define TEMPO_TO_CLOCK 2500.0 + +boolean done = false; +PmStream *midi; +/* shared flags to control callback output generation: */ +boolean clock_running = false; +boolean send_start_stop = false; +boolean time_code_running = false; +boolean active = false; /* tells callback to do its thing */ +float tempo = 60.0F; +/* protocol for handing off portmidi to callback thread: + main owns portmidi + main sets active = true: ownership transfers to callback + main sets active = false: main requests ownership + callback sees active == false, yields ownership back to main + main waits 2ms to make sure callback has a chance to yield + (stop making PortMidi calls), then assumes it can close + PortMidi + */ + +/* timer_poll -- the timer callback function */ +/* + * All MIDI sends take place here + */ +void timer_poll(PtTimestamp timestamp, void *userData) +{ + static int callback_owns_portmidi = false; + static PmTimestamp clock_start_time = 0; + static double next_clock_time = 0; + /* SMPTE time */ + static int frames = 0; + static int seconds = 0; + static int minutes = 0; + static int hours = 0; + static int mtc_count = 0; /* where are we in quarter frame sequence? */ + static int smpte_start_time = 0; + static double next_smpte_time = 0; + #define QUARTER_FRAME_PERIOD (1.0 / 120.0) /* 30fps, 1/4 frame */ + + if (callback_owns_portmidi && !active) { + /* main is requesting (by setting active to false) that we shut down */ + callback_owns_portmidi = false; + return; + } + if (!active) return; /* main still getting ready or it's closing down */ + callback_owns_portmidi = true; /* main is ready, we have portmidi */ + if (send_start_stop) { + if (clock_running) { + Pm_WriteShort(midi, 0, MIDI_STOP); + } else { + Pm_WriteShort(midi, 0, MIDI_START); + clock_start_time = timestamp; + next_clock_time = TEMPO_TO_CLOCK / tempo; + } + clock_running = !clock_running; + send_start_stop = false; /* until main sets it again */ + /* note that there's a slight race condition here: main could + set send_start_stop asynchronously, but we assume user is + typing slower than the clock rate */ + } + if (clock_running) { + if ((timestamp - clock_start_time) > next_clock_time) { + Pm_WriteShort(midi, 0, MIDI_TIME_CLOCK); + next_clock_time += TEMPO_TO_CLOCK / tempo; + } + } + if (time_code_running) { + int data = 0; // initialization avoids compiler warning + if ((timestamp - smpte_start_time) < next_smpte_time) + return; + switch (mtc_count) { + case 0: /* frames low nibble */ + data = frames; + break; + case 1: /* frames high nibble */ + data = frames >> 4; + break; + case 2: /* frames seconds low nibble */ + data = seconds; + break; + case 3: /* frames seconds high nibble */ + data = seconds >> 4; + break; + case 4: /* frames minutes low nibble */ + data = minutes; + break; + case 5: /* frames minutes high nibble */ + data = minutes >> 4; + break; + case 6: /* hours low nibble */ + data = hours; + break; + case 7: /* hours high nibble */ + data = hours >> 4; + break; + } + data &= 0xF; /* take only 4 bits */ + Pm_WriteShort(midi, 0, + Pm_Message(MIDI_Q_FRAME, (mtc_count << 4) + data, 0)); + mtc_count = (mtc_count + 1) & 7; /* wrap around */ + if (mtc_count == 0) { /* update time by two frames */ + frames += 2; + if (frames >= 30) { + frames = 0; + seconds++; + if (seconds >= 60) { + seconds = 0; + minutes++; + if (minutes >= 60) { + minutes = 0; + hours++; + /* just let hours wrap if it gets that far */ + } + } + } + } + next_smpte_time += QUARTER_FRAME_PERIOD; + } else { /* time_code_running is false */ + smpte_start_time = timestamp; + /* so that when it finally starts, we'll be in sync */ + } +} + + +/* read a number from console */ +/**/ +int get_number(char *prompt) +{ + char line[STRING_MAX]; + int n = 0, i; + printf(prompt); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + + } + return i; +} + +/**************************************************************************** +* showhelp +* Effect: print help text +****************************************************************************/ + +private void showhelp() +{ + printf("\n"); + printf("t toggles sending MIDI Time Code (MTC)\n"); + printf("c toggles sending MIDI CLOCK (initially on)\n"); + printf("m to set tempo (from 1bpm to 300bpm)\n"); + printf("q quits\n"); + printf("\n"); +} + +/**************************************************************************** +* doascii +* Inputs: +* char c: input character +* Effect: interpret to control output +****************************************************************************/ + +private void doascii(char c) +{ + if (isupper(c)) c = tolower(c); + if (c == 'q') done = true; + else if (c == 'c') { + printf("%s MIDI CLOCKs\n", (clock_running ? "Stopping" : "Starting")); + send_start_stop = true; + } else if (c == 't') { + printf("%s MIDI Time Code\n", + (time_code_running ? "Stopping" : "Starting")); + time_code_running = !time_code_running; + } else if (c == 'm') { + int input_tempo = get_number("Enter new tempo (bpm): "); + if (input_tempo >= 1 && input_tempo <= 300) { + printf("Changing tempo to %d\n", input_tempo); + tempo = (float) input_tempo; + } else { + printf("Tempo range is 1 to 300, current tempo is %g bpm\n", + tempo); + } + } else { + showhelp(); + } +} + + +/* main - prompt for parameters, start processing */ +/* + * Prompt user to type return. + * Then send START and MIDI CLOCK for 60 beats/min. + * Commands: + * t - toggle sending MIDI Time Code (MTC) + * c - toggle sending MIDI CLOCK + * m - set tempo + * q - quit + */ +int main(int argc, char **argv) +{ + char s[STRING_MAX]; /* console input */ + int outp; + PmError err; + int i; + if (argc > 1) { + printf("Warning: command line arguments ignored\n"); + } + showhelp(); + /* use porttime callback to send midi */ + Pt_Start(1, timer_poll, 0); + /* list device information */ + printf("MIDI output devices:\n"); + for (i = 0; i < Pm_CountDevices(); i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (info->output) printf("%d: %s, %s\n", i, info->interf, info->name); + } + outp = get_number("Type output device number: "); + err = Pm_OpenOutput(&midi, outp, DRIVER_INFO, OUTPUT_BUFFER_SIZE, + TIME_PROC, TIME_INFO, LATENCY); + if (err) { + printf(Pm_GetErrorText(err)); + goto error_exit_no_device; + } + active = true; + + printf("Type RETURN to start MIDI CLOCK:\n"); + if (!fgets(s, STRING_MAX, stdin)) goto error_exit; + send_start_stop = true; /* send START and then CLOCKs */ + + while (!done) { + if (fgets(s, STRING_MAX, stdin)) { + doascii(s[0]); + } + } + + error_exit: + active = false; + Pt_Sleep(2); /* this is to allow callback to complete -- it's + real time, so it's either ok and it runs on + time, or there's no point to synchronizing + with it */ + /* now we "own" portmidi again */ + Pm_Close(midi); + error_exit_no_device: + Pt_Stop(); + Pm_Terminate(); + exit(0); +} + diff --git a/pd/portmidi/pm_test/midiclock.vcproj b/pd/portmidi/pm_test/midiclock.vcproj new file mode 100644 index 000000000..b66e30230 --- /dev/null +++ b/pd/portmidi/pm_test/midiclock.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="midiclock" + ProjectGUID="{9B448D22-EC7E-4BD8-A552-B268D843CC3C}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="midiclock.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/midiclock.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\midiclock.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/midiclock.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\midiclock.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="midiclock.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/midiclock.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\midiclock.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/midiclock.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\midiclock.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\midiclock.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/midithread.c b/pd/portmidi/pm_test/midithread.c new file mode 100755 index 000000000..fab9794f2 --- /dev/null +++ b/pd/portmidi/pm_test/midithread.c @@ -0,0 +1,329 @@ +/* midithread.c -- example program showing how to do midi processing + in a preemptive thread + + Notes: if you handle midi I/O from your main program, there will be + some delay before handling midi messages whenever the program is + doing something like file I/O, graphical interface updates, etc. + + To handle midi with minimal delay, you should do all midi processing + in a separate, high priority thread. A convenient way to get a high + priority thread in windows is to use the timer callback provided by + the PortTime library. That is what we show here. + + If the high priority thread writes to a file, prints to the console, + or does just about anything other than midi processing, this may + create delays, so all this processing should be off-loaded to the + "main" process or thread. Communication between threads can be tricky. + If one thread is writing at the same time the other is reading, very + tricky race conditions can arise, causing programs to behave + incorrectly, but only under certain timing conditions -- a terrible + thing to debug. Advanced programmers know this as a synchronization + problem. See any operating systems textbook for the complete story. + + To avoid synchronization problems, a simple, reliable approach is + to communicate via messages. PortMidi offers a message queue as a + datatype, and operations to insert and remove messages. Use two + queues as follows: midi_to_main transfers messages from the midi + thread to the main thread, and main_to_midi transfers messages from + the main thread to the midi thread. Queues are safe for use between + threads as long as ONE thread writes and ONE thread reads. You must + NEVER allow two threads to write to the same queue. + + This program transposes incoming midi data by an amount controlled + by the main program. To change the transposition, type an integer + followed by return. The main program sends this via a message queue + to the midi thread. To quit, type 'q' followed by return. + + The midi thread can also send a pitch to the main program on request. + Type 'm' followed by return to wait for the next midi message and + print the pitch. + + This program illustrates: + Midi processing in a high-priority thread. + Communication with a main process via message queues. + + */ + +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "assert.h" +#include "portmidi.h" +#include "pmutil.h" +#include "porttime.h" + +/* if INPUT_BUFFER_SIZE is 0, PortMidi uses a default value */ +#define INPUT_BUFFER_SIZE 0 + +#define OUTPUT_BUFFER_SIZE 100 +#define DRIVER_INFO NULL +#define TIME_PROC NULL +#define TIME_INFO NULL +/* use zero latency because we want output to be immediate */ +#define LATENCY 0 + +#define STRING_MAX 80 + +/**********************************/ +/* DATA USED ONLY BY process_midi */ +/* (except during initialization) */ +/**********************************/ + +int active = FALSE; +int monitor = FALSE; +int midi_thru = TRUE; + +int transpose; +PmStream *midi_in; +PmStream *midi_out; + +/****************************/ +/* END OF process_midi DATA */ +/****************************/ + +/* shared queues */ +PmQueue *midi_to_main; +PmQueue *main_to_midi; + +#define QUIT_MSG 1000 +#define MONITOR_MSG 1001 +#define THRU_MSG 1002 + +/* timer interrupt for processing midi data */ +void process_midi(PtTimestamp timestamp, void *userData) +{ + PmError result; + PmEvent buffer; /* just one message at a time */ + int32_t msg; + + /* do nothing until initialization completes */ + if (!active) + return; + + /* check for messages */ + do { + result = Pm_Dequeue(main_to_midi, &msg); + if (result) { + if (msg >= -127 && msg <= 127) + transpose = msg; + else if (msg == QUIT_MSG) { + /* acknowledge receipt of quit message */ + Pm_Enqueue(midi_to_main, &msg); + active = FALSE; + return; + } else if (msg == MONITOR_MSG) { + /* main has requested a pitch. monitor is a flag that + * records the request: + */ + monitor = TRUE; + } else if (msg == THRU_MSG) { + /* toggle Thru on or off */ + midi_thru = !midi_thru; + } + } + } while (result); + + /* see if there is any midi input to process */ + do { + result = Pm_Poll(midi_in); + if (result) { + int status, data1, data2; + if (Pm_Read(midi_in, &buffer, 1) == pmBufferOverflow) + continue; + if (midi_thru) + Pm_Write(midi_out, &buffer, 1); + /* unless there was overflow, we should have a message now */ + status = Pm_MessageStatus(buffer.message); + data1 = Pm_MessageData1(buffer.message); + data2 = Pm_MessageData2(buffer.message); + if ((status & 0xF0) == 0x90 || + (status & 0xF0) == 0x80) { + + /* this is a note-on or note-off, so transpose and send */ + data1 += transpose; + + /* keep within midi pitch range, keep proper pitch class */ + while (data1 > 127) + data1 -= 12; + while (data1 < 0) + data1 += 12; + + /* send the message */ + buffer.message = Pm_Message(status, data1, data2); + Pm_Write(midi_out, &buffer, 1); + + /* if monitor is set, send the pitch to the main thread */ + if (monitor) { + Pm_Enqueue(midi_to_main, &data1); + monitor = FALSE; /* only send one pitch per request */ + } + } + } + } while (result); +} + +void exit_with_message(char *msg) +{ + char line[STRING_MAX]; + printf("%s\n", msg); + fgets(line, STRING_MAX, stdin); + exit(1); +} + +int main() +{ + int id; + int32_t n; + const PmDeviceInfo *info; + char line[STRING_MAX]; + int spin; + int done = FALSE; + + /* determine what type of test to run */ + printf("begin PortMidi multithread test...\n"); + + /* note that it is safe to call PortMidi from the main thread for + initialization and opening devices. You should not make any + calls to PortMidi from this thread once the midi thread begins. + to make PortMidi calls. + */ + + /* make the message queues */ + /* messages can be of any size and any type, but all messages in + * a given queue must have the same size. We'll just use int32_t's + * for our messages in this simple example + */ + midi_to_main = Pm_QueueCreate(32, sizeof(int32_t)); + assert(midi_to_main != NULL); + main_to_midi = Pm_QueueCreate(32, sizeof(int32_t)); + assert(main_to_midi != NULL); + + /* a little test of enqueue and dequeue operations. Ordinarily, + * you would call Pm_Enqueue from one thread and Pm_Dequeue from + * the other. Since the midi thread is not running, this is safe. + */ + n = 1234567890; + Pm_Enqueue(midi_to_main, &n); + n = 987654321; + Pm_Enqueue(midi_to_main, &n); + Pm_Dequeue(midi_to_main, &n); + if (n != 1234567890) { + exit_with_message("Pm_Dequeue produced unexpected result."); + } + Pm_Dequeue(midi_to_main, &n); + if(n != 987654321) { + exit_with_message("Pm_Dequeue produced unexpected result."); + } + + /* always start the timer before you start midi */ + Pt_Start(1, &process_midi, 0); /* start a timer with millisecond accuracy */ + /* the timer will call our function, process_midi() every millisecond */ + + Pm_Initialize(); + + id = Pm_GetDefaultOutputDeviceID(); + info = Pm_GetDeviceInfo(id); + if (info == NULL) { + printf("Could not open default output device (%d).", id); + exit_with_message(""); + } + printf("Opening output device %s %s\n", info->interf, info->name); + + /* use zero latency because we want output to be immediate */ + Pm_OpenOutput(&midi_out, + id, + DRIVER_INFO, + OUTPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO, + LATENCY); + + id = Pm_GetDefaultInputDeviceID(); + info = Pm_GetDeviceInfo(id); + if (info == NULL) { + printf("Could not open default input device (%d).", id); + exit_with_message(""); + } + printf("Opening input device %s %s\n", info->interf, info->name); + Pm_OpenInput(&midi_in, + id, + DRIVER_INFO, + INPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO); + + active = TRUE; /* enable processing in the midi thread -- yes, this + is a shared variable without synchronization, but + this simple assignment is safe */ + + printf("Enter midi input; it will be transformed as specified by...\n"); + printf("%s\n%s\n%s\n", + "Type 'q' to quit, 'm' to monitor next pitch, t to toggle thru or", + "type a number to specify transposition.", + "Must terminate with [ENTER]"); + + while (!done) { + int32_t msg; + int input; + int len; + fgets(line, STRING_MAX, stdin); + /* remove the newline: */ + len = strlen(line); + if (len > 0) line[len - 1] = 0; /* overwrite the newline char */ + if (strcmp(line, "q") == 0) { + msg = QUIT_MSG; + Pm_Enqueue(main_to_midi, &msg); + /* wait for acknowlegement */ + do { + spin = Pm_Dequeue(midi_to_main, &msg); + } while (spin == 0); /* spin */ ; + done = TRUE; /* leave the command loop and wrap up */ + } else if (strcmp(line, "m") == 0) { + msg = MONITOR_MSG; + Pm_Enqueue(main_to_midi, &msg); + printf("Waiting for note...\n"); + do { + spin = Pm_Dequeue(midi_to_main, &msg); + } while (spin == 0); /* spin */ ; + // convert int32_t to long for safe printing + printf("... pitch is %ld\n", (long) msg); + } else if (strcmp(line, "t") == 0) { + /* reading midi_thru asynchronously could give incorrect results, + e.g. if you type "t" twice before the midi thread responds to + the first one, but we'll do it this way anyway. Perhaps a more + correct way would be to wait for an acknowledgement message + containing the new state. */ + printf("Setting THRU %s\n", (midi_thru ? "off" : "on")); + msg = THRU_MSG; + Pm_Enqueue(main_to_midi, &msg); + } else if (sscanf(line, "%d", &input) == 1) { + if (input >= -127 && input <= 127) { + /* send transposition value, make sur */ + printf("Transposing by %d\n", input); + msg = (int32_t) input; + Pm_Enqueue(main_to_midi, &msg); + } else { + printf("Transposition must be within -127...127\n"); + } + } else { + printf("%s\n%s\n", + "Type 'q[ENTER]' to quit, 'm[ENTER]' to monitor next pitch, or", + "enter a number to specify transposition."); + } + } + + /* at this point, midi thread is inactive and we need to shut down + * the midi input and output + */ + Pt_Stop(); /* stop the timer */ + Pm_QueueDestroy(midi_to_main); + Pm_QueueDestroy(main_to_midi); + + /* Belinda! if close fails here, some memory is deleted, right??? */ + Pm_Close(midi_in); + Pm_Close(midi_out); + + printf("finished portMidi multithread test...enter any character to quit [RETURN]..."); + fgets(line, STRING_MAX, stdin); + return 0; +} diff --git a/pd/portmidi/pm_test/midithread.vcproj b/pd/portmidi/pm_test/midithread.vcproj new file mode 100755 index 000000000..b09d8a858 --- /dev/null +++ b/pd/portmidi/pm_test/midithread.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="midithread" + ProjectGUID="{EED7440D-04E3-4948-92DB-C85B4ADB1D82}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="midithread.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/midithread.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\midithread.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/midithread.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\midithread.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="midithread.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/midithread.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\midithread.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/midithread.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\midithread.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\midithread.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/midithru.c b/pd/portmidi/pm_test/midithru.c new file mode 100755 index 000000000..41d350a43 --- /dev/null +++ b/pd/portmidi/pm_test/midithru.c @@ -0,0 +1,366 @@ +/* midithru.c -- example program implementing background thru processing */ + +/* suppose you want low-latency midi-thru processing, but your application + wants to take advantage of the input buffer and timestamped data so that + it does not have to operate with very low latency. + + This program illustrates how to use a timer callback from PortTime to + implement a low-latency process that handles midi thru, including correctly + merging midi data from the application with midi data from the input port. + + The main application, which runs in the main program thread, will use an + interface similar to that of PortMidi, but since PortMidi does not allow + concurrent threads to share access to a stream, the application will + call private methods that transfer MIDI messages to and from the timer + thread. All PortMidi API calls are made from the timer thread. + */ + +/* DESIGN + +All setup will be done by the main thread. Then, all direct access to +PortMidi will be handed off to the timer callback thread. + +After this hand-off, the main thread will get/send messages via a queue. + +The goal is to send incoming messages to the midi output while merging +any midi data generated by the application. Sysex is a problem here +because you cannot insert (merge) a midi message while a sysex is in +progress. There are at least three ways to implement midi thru with +sysex messages: + +1) Turn them off. If your application does not need them, turn them off + with Pm_SetFilter(midi_in, PM_FILT_ACTIVE | PM_FILT_SYSEX). You will + not receive sysex (or active sensing messages), so you will not have + to handle them. + +2) Make them atomic. As you receive sysex messages, copy the data into + a (big) buffer. Ideally, expand the buffer as needed -- sysex messages + do not have any maximum length. Even more ideally, use a list structure + and real-time memory allocation to avoid latency in the timer thread. + When a full sysex message is received, send it to the midi output all + at once. + +3) Process sysex incrementally. Send sysex data to midi output as it + arrives. Block any non-real-time messages from the application until + the sysex message completes. There is the risk that an incomplete + sysex message will block messages forever, so implement a 5-second + timeout: if no sysex data is seen for 5 seconds, release the block, + possibly losing the rest of the sysex message. + + Application messages must be processed similarly: once started, a + sysex message will block MIDI THRU processing. We will assume that + the application will not abort a sysex message, so timeouts are not + necessary here. + +This code implements (3). + +Latency is also an issue. PortMidi requires timestamps to be in +non-decreasing order. Since we'll be operating with a low-latency +timer thread, we can just set the latency to zero meaning timestamps +are ignored by PortMidi. This will allow thru to go through with +minimal latency. The application, however, needs to use timestamps +because we assume it is high latency (the whole purpose of this +example is to illustrate how to get low-latency thru with a high-latency +application.) So the callback thread will implement midi timing by +observing timestamps. The current timestamp will be available in the +global variable current_timestamp. + +*/ + + +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "assert.h" +#include "portmidi.h" +#include "pmutil.h" +#include "porttime.h" + +#define MIDI_SYSEX 0xf0 +#define MIDI_EOX 0xf7 + +/* active is set true when midi processing should start */ +int active = FALSE; +/* process_midi_exit_flag is set when the timer thread shuts down */ +int process_midi_exit_flag; + +PmStream *midi_in; +PmStream *midi_out; + +/* shared queues */ +#define IN_QUEUE_SIZE 1024 +#define OUT_QUEUE_SIZE 1024 +PmQueue *in_queue; +PmQueue *out_queue; +PmTimestamp current_timestamp = 0; +int thru_sysex_in_progress = FALSE; +int app_sysex_in_progress = FALSE; +PmTimestamp last_timestamp = 0; + + +/* time proc parameter for Pm_MidiOpen */ +PmTimestamp midithru_time_proc(void *info) +{ + return current_timestamp; +} + + +/* timer interrupt for processing midi data. + Incoming data is delivered to main program via in_queue. + Outgoing data from main program is delivered via out_queue. + Incoming data from midi_in is copied with low latency to midi_out. + Sysex messages from either source block messages from the other. + */ +void process_midi(PtTimestamp timestamp, void *userData) +{ + PmError result; + PmEvent buffer; /* just one message at a time */ + + current_timestamp++; /* update every millisecond */ + /* if (current_timestamp % 1000 == 0) + printf("time %d\n", current_timestamp); */ + + /* do nothing until initialization completes */ + if (!active) { + /* this flag signals that no more midi processing will be done */ + process_midi_exit_flag = TRUE; + return; + } + + /* see if there is any midi input to process */ + if (!app_sysex_in_progress) { + do { + result = Pm_Poll(midi_in); + if (result) { + int status; + PmError rslt = Pm_Read(midi_in, &buffer, 1); + if (rslt == pmBufferOverflow) + continue; + assert(rslt == 1); + + /* record timestamp of most recent data */ + last_timestamp = current_timestamp; + + /* the data might be the end of a sysex message that + has timed out, in which case we must ignore it. + It's a continuation of a sysex message if status + is actually a data byte (high-order bit is zero). */ + status = Pm_MessageStatus(buffer.message); + if (((status & 0x80) == 0) && !thru_sysex_in_progress) { + continue; /* ignore this data */ + } + + /* implement midi thru */ + /* note that you could output to multiple ports or do other + processing here if you wanted + */ + /* printf("thru: %x\n", buffer.message); */ + Pm_Write(midi_out, &buffer, 1); + + /* send the message to the application */ + /* you might want to filter clock or active sense messages here + to avoid sending a bunch of junk to the application even if + you want to send it to MIDI THRU + */ + Pm_Enqueue(in_queue, &buffer); + + /* sysex processing */ + if (status == MIDI_SYSEX) thru_sysex_in_progress = TRUE; + else if ((status & 0xF8) != 0xF8) { + /* not MIDI_SYSEX and not real-time, so */ + thru_sysex_in_progress = FALSE; + } + if (thru_sysex_in_progress && /* look for EOX */ + (((buffer.message & 0xFF) == MIDI_EOX) || + (((buffer.message >> 8) & 0xFF) == MIDI_EOX) || + (((buffer.message >> 16) & 0xFF) == MIDI_EOX) || + (((buffer.message >> 24) & 0xFF) == MIDI_EOX))) { + thru_sysex_in_progress = FALSE; + } + } + } while (result); + } + + + /* see if there is application midi data to process */ + while (!Pm_QueueEmpty(out_queue)) { + /* see if it is time to output the next message */ + PmEvent *next = (PmEvent *) Pm_QueuePeek(out_queue); + assert(next); /* must be non-null because queue is not empty */ + if (next->timestamp <= current_timestamp) { + /* time to send a message, first make sure it's not blocked */ + int status = Pm_MessageStatus(next->message); + if ((status & 0xF8) == 0xF8) { + ; /* real-time messages are not blocked */ + } else if (thru_sysex_in_progress) { + /* maybe sysex has timed out (output becomes unblocked) */ + if (last_timestamp + 5000 < current_timestamp) { + thru_sysex_in_progress = FALSE; + } else break; /* output is blocked, so exit loop */ + } + Pm_Dequeue(out_queue, &buffer); + Pm_Write(midi_out, &buffer, 1); + + /* inspect message to update app_sysex_in_progress */ + if (status == MIDI_SYSEX) app_sysex_in_progress = TRUE; + else if ((status & 0xF8) != 0xF8) { + /* not MIDI_SYSEX and not real-time, so */ + app_sysex_in_progress = FALSE; + } + if (app_sysex_in_progress && /* look for EOX */ + (((buffer.message & 0xFF) == MIDI_EOX) || + (((buffer.message >> 8) & 0xFF) == MIDI_EOX) || + (((buffer.message >> 16) & 0xFF) == MIDI_EOX) || + (((buffer.message >> 24) & 0xFF) == MIDI_EOX))) { + app_sysex_in_progress = FALSE; + } + } else break; /* wait until indicated timestamp */ + } +} + + +void exit_with_message(char *msg) +{ +#define STRING_MAX 80 + char line[STRING_MAX]; + printf("%s\nType ENTER...", msg); + fgets(line, STRING_MAX, stdin); + exit(1); +} + + +void initialize() +/* set up midi processing thread and open midi streams */ +{ + /* note that it is safe to call PortMidi from the main thread for + initialization and opening devices. You should not make any + calls to PortMidi from this thread once the midi thread begins. + to make PortMidi calls. + */ + + /* note that this routine provides minimal error checking. If + you use the PortMidi library compiled with PM_CHECK_ERRORS, + then error messages will be printed and the program will exit + if an error is encountered. Otherwise, you should add some + error checking to this code. + */ + + const PmDeviceInfo *info; + int id; + + /* make the message queues */ + in_queue = Pm_QueueCreate(IN_QUEUE_SIZE, sizeof(PmEvent)); + assert(in_queue != NULL); + out_queue = Pm_QueueCreate(OUT_QUEUE_SIZE, sizeof(PmEvent)); + assert(out_queue != NULL); + + /* always start the timer before you start midi */ + Pt_Start(1, &process_midi, 0); /* start a timer with millisecond accuracy */ + /* the timer will call our function, process_midi() every millisecond */ + + Pm_Initialize(); + + id = Pm_GetDefaultOutputDeviceID(); + info = Pm_GetDeviceInfo(id); + if (info == NULL) { + printf("Could not open default output device (%d).", id); + exit_with_message(""); + } + printf("Opening output device %s %s\n", info->interf, info->name); + + /* use zero latency because we want output to be immediate */ + Pm_OpenOutput(&midi_out, + id, + NULL /* driver info */, + OUT_QUEUE_SIZE, + &midithru_time_proc, + NULL /* time info */, + 0 /* Latency */); + + id = Pm_GetDefaultInputDeviceID(); + info = Pm_GetDeviceInfo(id); + if (info == NULL) { + printf("Could not open default input device (%d).", id); + exit_with_message(""); + } + printf("Opening input device %s %s\n", info->interf, info->name); + Pm_OpenInput(&midi_in, + id, + NULL /* driver info */, + 0 /* use default input size */, + &midithru_time_proc, + NULL /* time info */); + /* Note: if you set a filter here, then this will filter what goes + to the MIDI THRU port. You may not want to do this. + */ + Pm_SetFilter(midi_in, PM_FILT_ACTIVE | PM_FILT_CLOCK); + + active = TRUE; /* enable processing in the midi thread -- yes, this + is a shared variable without synchronization, but + this simple assignment is safe */ + +} + + +void finalize() +{ + /* the timer thread could be in the middle of accessing PortMidi stuff */ + /* to detect that it is done, we first clear process_midi_exit_flag and + then wait for the timer thread to set it + */ + process_midi_exit_flag = FALSE; + active = FALSE; + /* busy wait for flag from timer thread that it is done */ + while (!process_midi_exit_flag) ; + /* at this point, midi thread is inactive and we need to shut down + * the midi input and output + */ + Pt_Stop(); /* stop the timer */ + Pm_QueueDestroy(in_queue); + Pm_QueueDestroy(out_queue); + + Pm_Close(midi_in); + Pm_Close(midi_out); + + Pm_Terminate(); +} + + +int main(int argc, char *argv[]) +{ + PmTimestamp last_time = 0; + PmEvent buffer; + + /* determine what type of test to run */ + printf("begin PortMidi midithru program...\n"); + + initialize(); /* set up and start midi processing */ + + printf("%s\n%s\n", + "This program will run for 60 seconds, or until you play middle C,", + "echoing all input with a 2 second delay."); + + while (current_timestamp < 60000) { + /* just to make the point that this is not a low-latency process, + spin until half a second has elapsed */ + last_time = last_time + 500; + while (last_time > current_timestamp) ; + + /* now read data and send it after changing timestamps */ + while (Pm_Dequeue(in_queue, &buffer) == 1) { + /* printf("timestamp %d\n", buffer.timestamp); */ + /* printf("message %x\n", buffer.message); */ + buffer.timestamp = buffer.timestamp + 2000; /* delay */ + Pm_Enqueue(out_queue, &buffer); + /* play middle C to break out of loop */ + if (Pm_MessageStatus(buffer.message) == 0x90 && + Pm_MessageData1(buffer.message) == 60) { + goto quit_now; + } + } + } +quit_now: + finalize(); + exit_with_message("finished PortMidi midithru program."); + return 0; /* never executed, but keeps the compiler happy */ +} diff --git a/pd/portmidi/pm_test/midithru.vcproj b/pd/portmidi/pm_test/midithru.vcproj new file mode 100755 index 000000000..4eb8ed4db --- /dev/null +++ b/pd/portmidi/pm_test/midithru.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="midithru" + ProjectGUID="{80193DD1-2C02-4A4C-BDF8-49623AD6F556}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="midithru.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/midithru.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\midithru.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/midithru.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\midithru.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="midithru.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/midithru.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\midithru.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/midithru.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\midithru.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\midithru.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/mm.c b/pd/portmidi/pm_test/mm.c new file mode 100755 index 000000000..209ff74ee --- /dev/null +++ b/pd/portmidi/pm_test/mm.c @@ -0,0 +1,572 @@ +/* mm.c -- midi monitor */ + +/***************************************************************************** +* Change Log +* Date | Change +*-----------+----------------------------------------------------------------- +* 7-Apr-86 | Created changelog +* 31-Jan-90 | GWL : use new cmdline +* 5-Apr-91 | JDW : Further changes +* 16-Feb-92 | GWL : eliminate label mmexit:; add error recovery +* 18-May-92 | GWL : continuous clocks, etc. +* 17-Jan-94 | GWL : option to display notes +* 20-Nov-06 | RBD : port mm.c from CMU Midi Toolkit to PortMidi +* | mm.c -- revealing MIDI secrets for over 20 years! +*****************************************************************************/ + +#include "stdlib.h" +#include "ctype.h" +#include "string.h" +#include "stdio.h" +#include "porttime.h" +#include "portmidi.h" + +#define STRING_MAX 80 + +#define MIDI_CODE_MASK 0xf0 +#define MIDI_CHN_MASK 0x0f +/*#define MIDI_REALTIME 0xf8 + #define MIDI_CHAN_MODE 0xfa */ +#define MIDI_OFF_NOTE 0x80 +#define MIDI_ON_NOTE 0x90 +#define MIDI_POLY_TOUCH 0xa0 +#define MIDI_CTRL 0xb0 +#define MIDI_CH_PROGRAM 0xc0 +#define MIDI_TOUCH 0xd0 +#define MIDI_BEND 0xe0 + +#define MIDI_SYSEX 0xf0 +#define MIDI_Q_FRAME 0xf1 +#define MIDI_SONG_POINTER 0xf2 +#define MIDI_SONG_SELECT 0xf3 +#define MIDI_TUNE_REQ 0xf6 +#define MIDI_EOX 0xf7 +#define MIDI_TIME_CLOCK 0xf8 +#define MIDI_START 0xfa +#define MIDI_CONTINUE 0xfb +#define MIDI_STOP 0xfc +#define MIDI_ACTIVE_SENSING 0xfe +#define MIDI_SYS_RESET 0xff + +#define MIDI_ALL_SOUND_OFF 0x78 +#define MIDI_RESET_CONTROLLERS 0x79 +#define MIDI_LOCAL 0x7a +#define MIDI_ALL_OFF 0x7b +#define MIDI_OMNI_OFF 0x7c +#define MIDI_OMNI_ON 0x7d +#define MIDI_MONO_ON 0x7e +#define MIDI_POLY_ON 0x7f + + +#define private static + +#ifndef false +#define false 0 +#define true 1 +#endif + +typedef int boolean; + +int debug = false; /* never set, but referenced by userio.c */ +PmStream *midi_in; /* midi input */ +boolean active = false; /* set when midi_in is ready for reading */ +boolean in_sysex = false; /* we are reading a sysex message */ +boolean inited = false; /* suppress printing during command line parsing */ +boolean done = false; /* when true, exit */ +boolean notes = true; /* show notes? */ +boolean controls = true; /* show continuous controllers */ +boolean bender = true; /* record pitch bend etc.? */ +boolean excldata = true; /* record system exclusive data? */ +boolean verbose = true; /* show text representation? */ +boolean realdata = true; /* record real time messages? */ +boolean clksencnt = true; /* clock and active sense count on */ +boolean chmode = true; /* show channel mode messages */ +boolean pgchanges = true; /* show program changes */ +boolean flush = false; /* flush all pending MIDI data */ + +uint32_t filter = 0; /* remember state of midi filter */ + +uint32_t clockcount = 0; /* count of clocks */ +uint32_t actsensecount = 0; /* cout of active sensing bytes */ +uint32_t notescount = 0; /* #notes since last request */ +uint32_t notestotal = 0; /* total #notes */ + +char val_format[] = " Val %d\n"; + +/***************************************************************************** +* Imported variables +*****************************************************************************/ + +extern int abort_flag; + +/***************************************************************************** +* Routines local to this module +*****************************************************************************/ + +private void mmexit(int code); +private void output(PmMessage data); +private int put_pitch(int p); +private void showhelp(); +private void showbytes(PmMessage data, int len, boolean newline); +private void showstatus(boolean flag); +private void doascii(char c); +private int get_number(char *prompt); + + +/* read a number from console */ +/**/ +int get_number(char *prompt) +{ + char line[STRING_MAX]; + int n = 0, i; + printf(prompt); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + + } + return i; +} + + +void receive_poll(PtTimestamp timestamp, void *userData) +{ + PmEvent event; + int count; + if (!active) return; + while ((count = Pm_Read(midi_in, &event, 1))) { + if (count == 1) output(event.message); + else printf(Pm_GetErrorText(count)); + } +} + + +/**************************************************************************** +* main +* Effect: prompts for parameters, starts monitor +****************************************************************************/ + +int main(int argc, char **argv) +{ + char *argument; + int inp; + PmError err; + int i; + if (argc > 1) { /* first arg can change defaults */ + argument = argv[1]; + while (*argument) doascii(*argument++); + } + showhelp(); + /* use porttime callback to empty midi queue and print */ + Pt_Start(1, receive_poll, 0); + /* list device information */ + printf("MIDI input devices:\n"); + for (i = 0; i < Pm_CountDevices(); i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (info->input) printf("%d: %s, %s\n", i, info->interf, info->name); + } + inp = get_number("Type input device number: "); + err = Pm_OpenInput(&midi_in, inp, NULL, 512, NULL, NULL); + if (err) { + printf(Pm_GetErrorText(err)); + Pt_Stop(); + mmexit(1); + } + Pm_SetFilter(midi_in, filter); + inited = true; /* now can document changes, set filter */ + printf("Midi Monitor ready.\n"); + active = true; + while (!done) { + char s[100]; + if (fgets(s, 100, stdin)) { + doascii(s[0]); + } + } + active = false; + Pm_Close(midi_in); + Pt_Stop(); + Pm_Terminate(); + mmexit(0); + return 0; // make the compiler happy be returning a value +} + + +/**************************************************************************** +* doascii +* Inputs: +* char c: input character +* Effect: interpret to revise flags +****************************************************************************/ + +private void doascii(char c) +{ + if (isupper(c)) c = tolower(c); + if (c == 'q') done = true; + else if (c == 'b') { + bender = !bender; + filter ^= PM_FILT_PITCHBEND; + if (inited) + printf("Pitch Bend, etc. %s\n", (bender ? "ON" : "OFF")); + } else if (c == 'c') { + controls = !controls; + filter ^= PM_FILT_CONTROL; + if (inited) + printf("Control Change %s\n", (controls ? "ON" : "OFF")); + } else if (c == 'h') { + pgchanges = !pgchanges; + filter ^= PM_FILT_PROGRAM; + if (inited) + printf("Program Changes %s\n", (pgchanges ? "ON" : "OFF")); + } else if (c == 'n') { + notes = !notes; + filter ^= PM_FILT_NOTE; + if (inited) + printf("Notes %s\n", (notes ? "ON" : "OFF")); + } else if (c == 'x') { + excldata = !excldata; + filter ^= PM_FILT_SYSEX; + if (inited) + printf("System Exclusive data %s\n", (excldata ? "ON" : "OFF")); + } else if (c == 'r') { + realdata = !realdata; + filter ^= (PM_FILT_PLAY | PM_FILT_RESET | PM_FILT_TICK | PM_FILT_UNDEFINED); + if (inited) + printf("Real Time messages %s\n", (realdata ? "ON" : "OFF")); + } else if (c == 'k') { + clksencnt = !clksencnt; + filter ^= PM_FILT_CLOCK; + if (inited) + printf("Clock and Active Sense Counting %s\n", (clksencnt ? "ON" : "OFF")); + if (!clksencnt) clockcount = actsensecount = 0; + } else if (c == 's') { + if (clksencnt) { + if (inited) + printf("Clock Count %ld\nActive Sense Count %ld\n", + (long) clockcount, (long) actsensecount); + } else if (inited) { + printf("Clock Counting not on\n"); + } + } else if (c == 't') { + notestotal+=notescount; + if (inited) + printf("This Note Count %ld\nTotal Note Count %ld\n", + (long) notescount, (long) notestotal); + notescount=0; + } else if (c == 'v') { + verbose = !verbose; + if (inited) + printf("Verbose %s\n", (verbose ? "ON" : "OFF")); + } else if (c == 'm') { + chmode = !chmode; + if (inited) + printf("Channel Mode Messages %s", (chmode ? "ON" : "OFF")); + } else { + if (inited) { + if (c == ' ') { + PmEvent event; + while (Pm_Read(midi_in, &event, 1)) ; /* flush midi input */ + printf("...FLUSHED MIDI INPUT\n\n"); + } else showhelp(); + } + } + if (inited) Pm_SetFilter(midi_in, filter); +} + + + +private void mmexit(int code) +{ + /* if this is not being run from a console, maybe we should wait for + * the user to read error messages before exiting + */ + exit(code); +} + + +/**************************************************************************** +* output +* Inputs: +* data: midi message buffer holding one command or 4 bytes of sysex msg +* Effect: format and print midi data +****************************************************************************/ + +char vel_format[] = " Vel %d\n"; + +private void output(PmMessage data) +{ + int command; /* the current command */ + int chan; /* the midi channel of the current event */ + int len; /* used to get constant field width */ + + /* printf("output data %8x; ", data); */ + + command = Pm_MessageStatus(data) & MIDI_CODE_MASK; + chan = Pm_MessageStatus(data) & MIDI_CHN_MASK; + + if (in_sysex || Pm_MessageStatus(data) == MIDI_SYSEX) { +#define sysex_max 16 + int i; + PmMessage data_copy = data; + in_sysex = true; + /* look for MIDI_EOX in first 3 bytes + * if realtime messages are embedded in sysex message, they will + * be printed as if they are part of the sysex message + */ + for (i = 0; (i < 4) && ((data_copy & 0xFF) != MIDI_EOX); i++) + data_copy >>= 8; + if (i < 4) { + in_sysex = false; + i++; /* include the EOX byte in output */ + } + showbytes(data, i, verbose); + if (verbose) printf("System Exclusive\n"); + } else if (command == MIDI_ON_NOTE && Pm_MessageData2(data) != 0) { + notescount++; + if (notes) { + showbytes(data, 3, verbose); + if (verbose) { + printf("NoteOn Chan %2d Key %3d ", chan, Pm_MessageData1(data)); + len = put_pitch(Pm_MessageData1(data)); + printf(vel_format + len, Pm_MessageData2(data)); + } + } + } else if ((command == MIDI_ON_NOTE /* && Pm_MessageData2(data) == 0 */ || + command == MIDI_OFF_NOTE) && notes) { + showbytes(data, 3, verbose); + if (verbose) { + printf("NoteOff Chan %2d Key %3d ", chan, Pm_MessageData1(data)); + len = put_pitch(Pm_MessageData1(data)); + printf(vel_format + len, Pm_MessageData2(data)); + } + } else if (command == MIDI_CH_PROGRAM && pgchanges) { + showbytes(data, 2, verbose); + if (verbose) { + printf(" ProgChg Chan %2d Prog %2d\n", chan, Pm_MessageData1(data) + 1); + } + } else if (command == MIDI_CTRL) { + /* controls 121 (MIDI_RESET_CONTROLLER) to 127 are channel + * mode messages. */ + if (Pm_MessageData1(data) < MIDI_ALL_SOUND_OFF) { + showbytes(data, 3, verbose); + if (verbose) { + printf("CtrlChg Chan %2d Ctrl %2d Val %2d\n", + chan, Pm_MessageData1(data), Pm_MessageData2(data)); + } + } else /* channel mode */ if (chmode) { + showbytes(data, 3, verbose); + if (verbose) { + switch (Pm_MessageData1(data)) { + case MIDI_ALL_SOUND_OFF: + printf("All Sound Off, Chan %2d\n", chan); + break; + case MIDI_RESET_CONTROLLERS: + printf("Reset All Controllers, Chan %2d\n", chan); + break; + case MIDI_LOCAL: + printf("LocCtrl Chan %2d %s\n", + chan, Pm_MessageData2(data) ? "On" : "Off"); + break; + case MIDI_ALL_OFF: + printf("All Off Chan %2d\n", chan); + break; + case MIDI_OMNI_OFF: + printf("OmniOff Chan %2d\n", chan); + break; + case MIDI_OMNI_ON: + printf("Omni On Chan %2d\n", chan); + break; + case MIDI_MONO_ON: + printf("Mono On Chan %2d\n", chan); + if (Pm_MessageData2(data)) + printf(" to %d received channels\n", Pm_MessageData2(data)); + else + printf(" to all received channels\n"); + break; + case MIDI_POLY_ON: + printf("Poly On Chan %2d\n", chan); + break; + } + } + } + } else if (command == MIDI_POLY_TOUCH && bender) { + showbytes(data, 3, verbose); + if (verbose) { + printf("P.Touch Chan %2d Key %2d ", chan, Pm_MessageData1(data)); + len = put_pitch(Pm_MessageData1(data)); + printf(val_format + len, Pm_MessageData2(data)); + } + } else if (command == MIDI_TOUCH && bender) { + showbytes(data, 2, verbose); + if (verbose) { + printf(" A.Touch Chan %2d Val %2d\n", chan, Pm_MessageData1(data)); + } + } else if (command == MIDI_BEND && bender) { + showbytes(data, 3, verbose); + if (verbose) { + printf("P.Bend Chan %2d Val %2d\n", chan, + (Pm_MessageData1(data) + (Pm_MessageData2(data)<<7))); + } + } else if (Pm_MessageStatus(data) == MIDI_SONG_POINTER) { + showbytes(data, 3, verbose); + if (verbose) { + printf(" Song Position %d\n", + (Pm_MessageData1(data) + (Pm_MessageData2(data)<<7))); + } + } else if (Pm_MessageStatus(data) == MIDI_SONG_SELECT) { + showbytes(data, 2, verbose); + if (verbose) { + printf(" Song Select %d\n", Pm_MessageData1(data)); + } + } else if (Pm_MessageStatus(data) == MIDI_TUNE_REQ) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Tune Request\n"); + } + } else if (Pm_MessageStatus(data) == MIDI_Q_FRAME && realdata) { + showbytes(data, 2, verbose); + if (verbose) { + printf(" Time Code Quarter Frame Type %d Values %d\n", + (Pm_MessageData1(data) & 0x70) >> 4, Pm_MessageData1(data) & 0xf); + } + } else if (Pm_MessageStatus(data) == MIDI_START && realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Start\n"); + } + } else if (Pm_MessageStatus(data) == MIDI_CONTINUE && realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Continue\n"); + } + } else if (Pm_MessageStatus(data) == MIDI_STOP && realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Stop\n"); + } + } else if (Pm_MessageStatus(data) == MIDI_SYS_RESET && realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" System Reset\n"); + } + } else if (Pm_MessageStatus(data) == MIDI_TIME_CLOCK) { + if (clksencnt) clockcount++; + else if (realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Clock\n"); + } + } + } else if (Pm_MessageStatus(data) == MIDI_ACTIVE_SENSING) { + if (clksencnt) actsensecount++; + else if (realdata) { + showbytes(data, 1, verbose); + if (verbose) { + printf(" Active Sensing\n"); + } + } + } else showbytes(data, 3, verbose); + fflush(stdout); +} + + +/**************************************************************************** +* put_pitch +* Inputs: +* int p: pitch number +* Effect: write out the pitch name for a given number +****************************************************************************/ + +private int put_pitch(int p) +{ + char result[8]; + static char *ptos[] = { + "c", "cs", "d", "ef", "e", "f", "fs", "g", + "gs", "a", "bf", "b" }; + /* note octave correction below */ + sprintf(result, "%s%d", ptos[p % 12], (p / 12) - 1); + printf(result); + return strlen(result); +} + + +/**************************************************************************** +* showbytes +* Effect: print hex data, precede with newline if asked +****************************************************************************/ + +char nib_to_hex[] = "0123456789ABCDEF"; + +private void showbytes(PmMessage data, int len, boolean newline) +{ + int count = 0; + int i; + +/* if (newline) { + putchar('\n'); + count++; + } */ + for (i = 0; i < len; i++) { + putchar(nib_to_hex[(data >> 4) & 0xF]); + putchar(nib_to_hex[data & 0xF]); + count += 2; + if (count > 72) { + putchar('.'); + putchar('.'); + putchar('.'); + break; + } + data >>= 8; + } + putchar(' '); +} + + + +/**************************************************************************** +* showhelp +* Effect: print help text +****************************************************************************/ + +private void showhelp() +{ + printf("\n"); + printf(" Item Reported Range Item Reported Range\n"); + printf(" ------------- ----- ------------- -----\n"); + printf(" Channels 1 - 16 Programs 1 - 128\n"); + printf(" Controllers 0 - 127 After Touch 0 - 127\n"); + printf(" Loudness 0 - 127 Pitch Bend 0 - 16383, center = 8192\n"); + printf(" Pitches 0 - 127, 60 = c4 = middle C\n"); + printf(" \n"); + printf("n toggles notes"); + showstatus(notes); + printf("t displays noteon count since last t\n"); + printf("b toggles pitch bend, aftertouch"); + showstatus(bender); + printf("c toggles continuous control"); + showstatus(controls); + printf("h toggles program changes"); + showstatus(pgchanges); + printf("x toggles system exclusive"); + showstatus(excldata); + printf("k toggles clock and sense counting only"); + showstatus(clksencnt); + printf("r toggles other real time messages & SMPTE"); + showstatus(realdata); + printf("s displays clock and sense count since last k\n"); + printf("m toggles channel mode messages"); + showstatus(chmode); + printf("v toggles verbose text"); + showstatus(verbose); + printf("q quits\n"); + printf("\n"); +} + +/**************************************************************************** +* showstatus +* Effect: print status of flag +****************************************************************************/ + +private void showstatus(boolean flag) +{ + printf(", now %s\n", flag ? "ON" : "OFF" ); +} diff --git a/pd/portmidi/pm_test/mm.vcproj b/pd/portmidi/pm_test/mm.vcproj new file mode 100755 index 000000000..e9c5357bb --- /dev/null +++ b/pd/portmidi/pm_test/mm.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="mm" + ProjectGUID="{EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="mm.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/mm.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\mm.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/mm.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\mm.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="mm.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/mm.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\mm.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/mm.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\mm.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\mm.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/qtest.c b/pd/portmidi/pm_test/qtest.c new file mode 100644 index 000000000..14d803e87 --- /dev/null +++ b/pd/portmidi/pm_test/qtest.c @@ -0,0 +1,174 @@ +#include "portmidi.h" +#include "pmutil.h" +#include "stdlib.h" +#include "stdio.h" + + +/* make_msg -- make a psuedo-random message of length n whose content + * is purely a function of i + */ +void make_msg(long msg[], int n, int i) +{ + int j; + for (j = 0; j < n; j++) { + msg[j] = i % (j + 5); + } +} + + +/* print_msg -- print the content of msg of length n to stdout */ +/**/ +void print_msg(long msg[], int n) +{ + int i; + for (i = 0; i < n; i++) { + printf(" %li", msg[i]); + } +} + + +/* cmp_msg -- compare two messages of length n */ +/**/ +int cmp_msg(long msg[], long msg2[], int n, int i) +{ + int j; + for (j = 0; j < n; j++) { + if (msg[j] != msg2[j]) { + printf("Received message %d doesn't match sent message\n", i); + printf("in: "); print_msg(msg, n); printf("\n"); + printf("out:"); print_msg(msg2, n); printf("\n"); + return FALSE; + } + } + return TRUE; +} + + +int main() +{ + int msg_len; + for (msg_len = 4; msg_len < 100; msg_len += 5) { + PmQueue *queue = Pm_QueueCreate(100, msg_len * sizeof(long)); + int i; + long msg[100]; + long msg2[100]; + + printf("msg_len = %d\n", msg_len); + if (!queue) { + printf("Could not allocate queue\n"); + return 1; + } + + /* insert/remove 1000 messages */ + printf("test 1\n"); + for (i = 0; i < 1357; i++) { + make_msg(msg, msg_len, i); + if (Pm_Enqueue(queue, msg)) { + printf("Pm_Enqueue error\n"); + return 1; + } + if (Pm_Dequeue(queue, msg2) != 1) { + printf("Pm_Dequeue error\n"); + return 1; + } + if (!cmp_msg(msg, msg2, msg_len, i)) { + return 1; + } + } + + /* make full */ + printf("test 2\n"); + for (i = 0; i < 100; i++) { + make_msg(msg, msg_len, i); + if (Pm_Enqueue(queue, msg)) { + printf("Pm_Enqueue error\n"); + return 1; + } + } + + /* alternately remove and insert */ + for (i = 100; i < 1234; i++) { + make_msg(msg, msg_len, i - 100); /* what we expect */ + if (Pm_Dequeue(queue, msg2) != 1) { + printf("Pm_Dequeue error\n"); + return 1; + } + if (!cmp_msg(msg, msg2, msg_len, i)) { + return 1; + } + make_msg(msg, msg_len, i); + if (Pm_Enqueue(queue, msg)) { + printf("Pm_Enqueue error\n"); + return 1; + } + } + + /* remove all */ + while (!Pm_QueueEmpty(queue)) { + make_msg(msg, msg_len, i - 100); /* what we expect */ + if (Pm_Dequeue(queue, msg2) != 1) { + printf("Pm_Dequeue error\n"); + return 1; + } + if (!cmp_msg(msg, msg2, msg_len, i)) { + return 1; + } + i++; + } + if (i != 1334) { + printf("Message count error\n"); + return 1; + } + + /* now test overflow */ + printf("test 3\n"); + for (i = 0; i < 110; i++) { + make_msg(msg, msg_len, i); + if (Pm_Enqueue(queue, msg) == pmBufferOverflow) { + break; /* this is supposed to execute after 100 messages */ + } + } + for (i = 0; i < 100; i++) { + make_msg(msg, msg_len, i); + if (Pm_Dequeue(queue, msg2) != 1) { + printf("Pm_Dequeue error\n"); + return 1; + } + if (!cmp_msg(msg, msg2, msg_len, i)) { + return 1; + } + } + /* we should detect overflow after removing 100 messages */ + if (Pm_Dequeue(queue, msg2) != pmBufferOverflow) { + printf("Pm_Dequeue overflow expected\n"); + return 1; + } + + /* after overflow is detected (and cleared), sender can + * send again + */ + /* see if function is restored, also test peek */ + printf("test 4\n"); + for (i = 0; i < 1357; i++) { + long *peek; + make_msg(msg, msg_len, i); + if (Pm_Enqueue(queue, msg)) { + printf("Pm_Enqueue error\n"); + return 1; + } + peek = (long *) Pm_QueuePeek(queue); + if (!cmp_msg(msg, peek, msg_len, i)) { + return 1; + } + if (Pm_Dequeue(queue, msg2) != 1) { + printf("Pm_Dequeue error\n"); + return 1; + } + if (!cmp_msg(msg, msg2, msg_len, i)) { + return 1; + } + } + Pm_QueueDestroy(queue); + } + return 0; +} diff --git a/pd/portmidi/pm_test/qtest.vcproj b/pd/portmidi/pm_test/qtest.vcproj new file mode 100755 index 000000000..83fa04a04 --- /dev/null +++ b/pd/portmidi/pm_test/qtest.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="qtest" + ProjectGUID="{2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="qtest.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/qtest.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\qtest.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/qtest.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\qtest.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="qtest.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/qtest.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\qtest.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/qtest.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\qtest.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\qtest.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/sysex.c b/pd/portmidi/pm_test/sysex.c new file mode 100755 index 000000000..627a3dfa9 --- /dev/null +++ b/pd/portmidi/pm_test/sysex.c @@ -0,0 +1,528 @@ +/* sysex.c -- example program showing how to send and receive sysex + messages + + Messages are stored in a file using 2-digit hexadecimal numbers, + one per byte, separated by blanks, with up to 32 numbers per line: + F0 14 A7 4B ... + + */ + +#include "stdio.h" +#include "stdlib.h" +#include "assert.h" +#include "portmidi.h" +#include "porttime.h" +#include "string.h" +#ifdef WIN32 +// need to get declaration for Sleep() +#include "windows.h" +#else +#include <unistd.h> +#define Sleep(n) usleep(n * 1000) +#endif + +#define MIDI_SYSEX 0xf0 +#define MIDI_EOX 0xf7 + +#define STRING_MAX 80 + +#ifndef true +#define true 1 +#define false 0 +#endif + +int latency = 0; + +/* read a number from console */ +/**/ +int get_number(char *prompt) +{ + char line[STRING_MAX]; + int n = 0, i; + printf(prompt); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + + } + return i; +} + + +/* loopback test -- send/rcv from 2 to 1000 bytes of random midi data */ +/**/ +void loopback_test() +{ + int outp; + int inp; + PmStream *midi_in; + PmStream *midi_out; + unsigned char msg[1024]; + char line[80]; + int32_t len; + int i; + int data; + PmEvent event; + int shift; + long total_bytes = 0; + int32_t begin_time; + + Pt_Start(1, 0, 0); + + printf("Connect a midi cable from an output port to an input port.\n"); + printf("This test will send random data via sysex message from output\n"); + printf("to input and check that the correct data was received.\n"); + outp = get_number("Type output device number: "); + /* Open output with 1ms latency -- when latency is non-zero, the Win32 + implementation supports sending sysex messages incrementally in a + series of buffers. This is nicer than allocating a big buffer for the + message, and it also seems to work better. Either way works. + */ + while ((latency = get_number( + "Latency in milliseconds (0 to send data immediatedly,\n" + " >0 to send timestamped messages): ")) < 0); + Pm_OpenOutput(&midi_out, outp, NULL, 0, NULL, NULL, latency); + inp = get_number("Type input device number: "); + /* since we are going to send and then receive, make sure the input buffer + is large enough for the entire message */ + Pm_OpenInput(&midi_in, inp, NULL, 512, NULL, NULL); + + srand((unsigned int) Pt_Time()); /* seed for random numbers */ + + begin_time = Pt_Time(); + while (1) { + PmError count; + int32_t start_time; + int error_position = -1; /* 0; -1; -1 for continuous */ + int expected = 0; + int actual = 0; + /* this modification will run until an error is detected */ + /* set error_position above to 0 for interactive, -1 for */ + /* continuous */ + if (error_position >= 0) { + printf("Type return to send message, q to quit: "); + fgets(line, STRING_MAX, stdin); + if (line[0] == 'q') goto cleanup; + } + + /* compose the message */ + len = rand() % 998 + 2; /* len only counts data bytes */ + msg[0] = (char) MIDI_SYSEX; /* start of SYSEX message */ + /* data bytes go from 1 to len */ + for (i = 0; i < len; i++) { +/* pick whether data is sequential or random... (docs say random) */ +#define DATA_EXPR (i+1) +// #define DATA_EXPR rand() + msg[i + 1] = DATA_EXPR & 0x7f; /* MIDI data */ + } + /* final EOX goes in len+1, total of len+2 bytes in msg */ + msg[len + 1] = (char) MIDI_EOX; + + /* sanity check: before we send, there should be no queued data */ + count = Pm_Read(midi_in, &event, 1); + + if (count != 0) { + printf("Before sending anything, a MIDI message was found in\n"); + printf("the input buffer. Please try again.\n"); + break; + } + + /* send the message */ + printf("Sending %d byte sysex message.\n", len + 2); + Pm_WriteSysEx(midi_out, 0, msg); + + /* receive the message and compare to msg[] */ + data = 0; + shift = 0; + i = 0; + start_time = Pt_Time(); + error_position = -1; + /* allow up to 2 seconds for transmission */ + while (data != MIDI_EOX && start_time + 2000 > Pt_Time()) { + count = Pm_Read(midi_in, &event, 1); + if (count == 0) { + Sleep(1); /* be nice: give some CPU time to the system */ + continue; /* continue polling for input */ + } + + /* printf("read %lx ", event.message); + fflush(stdout); */ + + /* compare 4 bytes of data until you reach an eox */ + for (shift = 0; shift < 32 && (data != MIDI_EOX); shift += 8) { + data = (event.message >> shift) & 0xFF; + if (data != msg[i] && error_position < 0) { + error_position = i; + expected = msg[i]; + actual = data; + } + i++; + } + } + if (error_position >= 0) { + printf("Error at byte %d: sent %x recd %x.\n", error_position, + expected, actual); + break; + } else if (i != len + 2) { + printf("Error: byte %d not received.\n", i); + break; + } else { + int seconds = (Pt_Time() - begin_time) / 1000; + if (seconds == 0) seconds = 1; + printf("Correctly received %d byte sysex message.\n", i); + total_bytes += i; + printf("Cummulative bytes/sec: %d\n", total_bytes / seconds); + } + } +cleanup: + Pm_Close(midi_out); + Pm_Close(midi_in); + return; +} + + +/* send_multiple test -- send many sysex messages */ +/**/ +void send_multiple_test() +{ + int outp; + int length; + int num_msgs; + PmStream *midi_out; + unsigned char msg[1024]; + int i; + PtTimestamp start_time; + PtTimestamp stop_time; + + Pt_Start(1, 0, 0); + + printf("This is for performance testing. You should be sending to this\n"); + printf("program running the receive multiple test. Do NOT send to\n"); + printf("a synthesizer or you risk reprogramming it\n"); + outp = get_number("Type output device number: "); + while ((latency = get_number( + "Latency in milliseconds (0 to send data immediatedly,\n" + " >0 to send timestamped messages): ")) < 0); + Pm_OpenOutput(&midi_out, outp, NULL, 0, NULL, NULL, latency); + while ((length = get_number("Message length (7 - 1024): ")) < 7 || + length > 1024) ; + while ((num_msgs = get_number("Number of messages: ")) < 1); + /* latency, length, and num_msgs should now all be valid */ + /* compose the message except for sequence number in first 5 bytes */ + msg[0] = (char) MIDI_SYSEX; + for (i = 6; i < length - 1; i++) { + msg[i] = i % 128; /* this is just filler */ + } + msg[length - 1] = (char) MIDI_EOX; + + start_time = Pt_Time(); + /* send the messages */ + for (i = num_msgs; i > 0; i--) { + /* insert sequence number into first 5 data bytes */ + /* sequence counts down to zero */ + int j; + int count = i; + /* 7 bits of message count i goes into each data byte */ + for (j = 1; j <= 5; j++) { + msg[j] = count & 127; + count >>= 7; + } + /* send the message */ + Pm_WriteSysEx(midi_out, 0, msg); + } + stop_time = Pt_Time(); + Pm_Close(midi_out); + return; +} + +#define MAX_MSG_LEN 1024 +static unsigned char receive_msg[MAX_MSG_LEN]; +static int receive_msg_index; +static int receive_msg_length; +static int receive_msg_count; +static int receive_msg_error; +static int receive_msg_messages; +static PmStream *receive_msg_midi_in; +static int receive_poll_running; + +/* receive_poll -- callback function to check for midi input */ +/**/ +void receive_poll(PtTimestamp timestamp, void *userData) +{ + PmError count; + PmEvent event; + int shift; + int data = 0; + int i; + + if (!receive_poll_running) return; /* wait until midi device is opened */ + shift = 0; + while (data != MIDI_EOX) { + count = Pm_Read(receive_msg_midi_in, &event, 1); + if (count == 0) return; + + /* compare 4 bytes of data until you reach an eox */ + for (shift = 0; shift < 32 && (data != MIDI_EOX); shift += 8) { + receive_msg[receive_msg_index++] = data = + (event.message >> shift) & 0xFF; + if (receive_msg_index >= MAX_MSG_LEN) { + printf("error: incoming sysex too long\n"); + goto error; + } + } + } + /* check the message */ + if (receive_msg_length == 0) { + receive_msg_length = receive_msg_index; + } + if (receive_msg_length != receive_msg_index) { + printf("error: incoming sysex wrong length\n"); + goto error; + } + if (receive_msg[0] != MIDI_SYSEX) { + printf("error: incoming sysex missing status byte\n"); + goto error; + } + /* get and check the count */ + count = 0; + for (i = 0; i < 5; i++) { + count += receive_msg[i + 1] << (7 * i); + } + if (receive_msg_count == -1) { + receive_msg_count = count; + receive_msg_messages = count; + } + if (receive_msg_count != count) { + printf("error: incoming sysex has wrong count\n"); + goto error; + } + for (i = 6; i < receive_msg_index - 1; i++) { + if (receive_msg[i] != i % 128) { + printf("error: incoming sysex has bad data\n"); + goto error; + } + } + if (receive_msg[receive_msg_length - 1] != MIDI_EOX) goto error; + receive_msg_index = 0; /* get ready for next message */ + receive_msg_count--; + return; + error: + receive_msg_error = 1; + return; +} + + +/* receive_multiple_test -- send/rcv from 2 to 1000 bytes of random midi data */ +/**/ +void receive_multiple_test() +{ + PmError err; + int inp; + + printf("This test expects to receive data sent by the send_multiple test\n"); + printf("The test will check that correct data is received.\n"); + + /* Important: start PortTime first -- if it is not started first, it will + be started by PortMidi, and then our attempt to open again will fail */ + receive_poll_running = false; + if ((err = Pt_Start(1, receive_poll, 0))) { + printf("PortTime error code: %d\n", err); + goto cleanup; + } + inp = get_number("Type input device number: "); + Pm_OpenInput(&receive_msg_midi_in, inp, NULL, 512, NULL, NULL); + receive_msg_index = 0; + receive_msg_length = 0; + receive_msg_count = -1; + receive_msg_error = 0; + receive_poll_running = true; + while ((!receive_msg_error) && (receive_msg_count != 0)) { +#ifdef WIN32 + Sleep(1000); +#else + sleep(1); /* block and wait */ +#endif + } + if (receive_msg_error) { + printf("Receive_multiple test encountered an error\n"); + } else { + printf("Receive_multiple test successfully received %d sysex messages\n", + receive_msg_messages); + } +cleanup: + receive_poll_running = false; + Pm_Close(receive_msg_midi_in); + Pt_Stop(); + return; +} + + +#define is_real_time_msg(msg) ((0xF0 & Pm_MessageStatus(msg)) == 0xF8) + + +void receive_sysex() +{ + char line[80]; + FILE *f; + PmStream *midi; + int shift = 0; + int data = 0; + int bytes_on_line = 0; + PmEvent msg; + + /* determine which output device to use */ + int i = get_number("Type input device number: "); + + /* open input device */ + Pm_OpenInput(&midi, i, NULL, 512, NULL, NULL); + printf("Midi Input opened, type file for sysex data: "); + + /* open file */ + fgets(line, STRING_MAX, stdin); + /* remove the newline character */ + if (strlen(line) > 0) line[strlen(line) - 1] = 0; + f = fopen(line, "w"); + if (!f) { + printf("Could not open %s\n", line); + Pm_Close(midi); + return; + } + + printf("Ready to receive a sysex message\n"); + + /* read data and write to file */ + while (data != MIDI_EOX) { + PmError count; + count = Pm_Read(midi, &msg, 1); + /* CAUTION: this causes busy waiting. It would be better to + be in a polling loop to avoid being compute bound. PortMidi + does not support a blocking read since this is so seldom + useful. + */ + if (count == 0) continue; + /* ignore real-time messages */ + if (is_real_time_msg(Pm_MessageStatus(msg.message))) continue; + + /* write 4 bytes of data until you reach an eox */ + for (shift = 0; shift < 32 && (data != MIDI_EOX); shift += 8) { + data = (msg.message >> shift) & 0xFF; + /* if this is a status byte that's not MIDI_EOX, the sysex + message is incomplete and there is no more sysex data */ + if (data & 0x80 && data != MIDI_EOX) break; + fprintf(f, "%2x ", data); + if (++bytes_on_line >= 16) { + fprintf(f, "\n"); + bytes_on_line = 0; + } + } + } + fclose(f); + Pm_Close(midi); +} + + +void send_sysex() +{ + char line[80]; + FILE *f; + PmStream *midi; + int data; + int shift = 0; + PmEvent msg; + + /* determine which output device to use */ + int i = get_number("Type output device number: "); + while ((latency = get_number( + "Latency in milliseconds (0 to send data immediatedly,\n" + " >0 to send timestamped messages): ")) < 0); + + msg.timestamp = 0; /* no need for timestamp */ + + /* open output device */ + Pm_OpenOutput(&midi, i, NULL, 0, NULL, NULL, latency); + printf("Midi Output opened, type file with sysex data: "); + + /* open file */ + fgets(line, STRING_MAX, stdin); + /* remove the newline character */ + if (strlen(line) > 0) line[strlen(line) - 1] = 0; + f = fopen(line, "r"); + if (!f) { + printf("Could not open %s\n", line); + Pm_Close(midi); + return; + } + + /* read file and send data */ + msg.message = 0; + while (1) { + /* get next byte from file */ + + if (fscanf(f, "%x", &data) == 1) { + /* printf("read %x, ", data); */ + /* OR byte into message at proper offset */ + msg.message |= (data << shift); + shift += 8; + } + /* send the message if it's full (shift == 32) or if we are at end */ + if (shift == 32 || data == MIDI_EOX) { + /* this will send sysex data 4 bytes at a time -- it would + be much more efficient to send multiple PmEvents at once + but this method is simpler. See Pm_WriteSysEx for a more + efficient code example. + */ + Pm_Write(midi, &msg, 1); + msg.message = 0; + shift = 0; + } + if (data == MIDI_EOX) { /* end of message */ + fclose(f); + Pm_Close(midi); + return; + } + } +} + + +int main() +{ + int i; + char line[80]; + + /* list device information */ + for (i = 0; i < Pm_CountDevices(); i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + printf("%d: %s, %s", i, info->interf, info->name); + if (info->input) printf(" (input)"); + if (info->output) printf(" (output)"); + printf("\n"); + } + while (1) { + printf("Type r to receive sysex, s to send," + " l for loopback test, m to send multiple," + " n to receive multiple, q to quit: "); + fgets(line, STRING_MAX, stdin); + switch (line[0]) { + case 'r': + receive_sysex(); + break; + case 's': + send_sysex(); + break; + case 'l': + loopback_test(); + break; + case 'm': + send_multiple_test(); + break; + case 'n': + receive_multiple_test(); + break; + case 'q': + exit(0); + default: + break; + } + } + return 0; +} diff --git a/pd/portmidi/pm_test/sysex.vcproj b/pd/portmidi/pm_test/sysex.vcproj new file mode 100755 index 000000000..d5bfd97b4 --- /dev/null +++ b/pd/portmidi/pm_test/sysex.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="sysex" + ProjectGUID="{71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="sysex.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/sysex.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\sysex.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/sysex.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\sysex.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="sysex.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/sysex.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\sysex.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/sysex.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\sysex.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\sysex.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/test.c b/pd/portmidi/pm_test/test.c new file mode 100755 index 000000000..03d6331ad --- /dev/null +++ b/pd/portmidi/pm_test/test.c @@ -0,0 +1,489 @@ +#include "portmidi.h" +#include "porttime.h" +#include "stdlib.h" +#include "stdio.h" +#include "string.h" +#include "assert.h" + +#define INPUT_BUFFER_SIZE 100 +#define OUTPUT_BUFFER_SIZE 0 +#define DRIVER_INFO NULL +#define TIME_PROC ((int32_t (*)(void *)) Pt_Time) +#define TIME_INFO NULL +#define TIME_START Pt_Start(1, 0, 0) /* timer started w/millisecond accuracy */ + +#define STRING_MAX 80 /* used for console input */ + +int32_t latency = 0; + +/* crash the program to test whether midi ports are closed */ +/**/ +void doSomethingReallyStupid() { + int * tmp = NULL; + *tmp = 5; +} + + +/* exit the program without any explicit cleanup */ +/**/ +void doSomethingStupid() { + assert(0); +} + + +/* read a number from console */ +/**/ +int get_number(char *prompt) +{ + char line[STRING_MAX]; + int n = 0, i; + printf(prompt); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + + } + return i; +} + + +/* + * the somethingStupid parameter can be set to simulate a program crash. + * We want PortMidi to close Midi ports automatically in the event of a + * crash because Windows does not (and this may cause an OS crash) + */ +void main_test_input(unsigned int somethingStupid) { + PmStream * midi; + PmError status, length; + PmEvent buffer[1]; + int num = 10; + int i = get_number("Type input number: "); + /* It is recommended to start timer before Midi; otherwise, PortMidi may + start the timer with its (default) parameters + */ + TIME_START; + + /* open input device */ + Pm_OpenInput(&midi, + i, + DRIVER_INFO, + INPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO); + + printf("Midi Input opened. Reading %d Midi messages...\n", num); + Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX); + /* empty the buffer after setting filter, just in case anything + got through */ + while (Pm_Poll(midi)) { + Pm_Read(midi, buffer, 1); + } + /* now start paying attention to messages */ + i = 0; /* count messages as they arrive */ + while (i < num) { + status = Pm_Poll(midi); + if (status == TRUE) { + length = Pm_Read(midi,buffer, 1); + if (length > 0) { + printf("Got message %d: time %ld, %2lx %2lx %2lx\n", + i, + (long) buffer[0].timestamp, + (long) Pm_MessageStatus(buffer[0].message), + (long) Pm_MessageData1(buffer[0].message), + (long) Pm_MessageData2(buffer[0].message)); + i++; + } else { + assert(0); + } + } + /* simulate crash if somethingStupid is 1 or 2 */ + if ((i > (num/2)) && (somethingStupid == 1)) { + doSomethingStupid(); + } else if ((i > (num/2)) && (somethingStupid == 2)) { + doSomethingReallyStupid(); + } + } + + /* close device (this not explicitly needed in most implementations) */ + printf("ready to close..."); + + Pm_Close(midi); + printf("done closing..."); +} + + + +void main_test_output() { + PmStream * midi; + char line[80]; + int32_t off_time; + int chord[] = { 60, 67, 76, 83, 90 }; + #define chord_size 5 + PmEvent buffer[chord_size]; + PmTimestamp timestamp; + + /* determine which output device to use */ + int i = get_number("Type output number: "); + + /* It is recommended to start timer before PortMidi */ + TIME_START; + + /* open output device -- since PortMidi avoids opening a timer + when latency is zero, we will pass in a NULL timer pointer + for that case. If PortMidi tries to access the time_proc, + we will crash, so this test will tell us something. */ + Pm_OpenOutput(&midi, + i, + DRIVER_INFO, + OUTPUT_BUFFER_SIZE, + (latency == 0 ? NULL : TIME_PROC), + (latency == 0 ? NULL : TIME_INFO), + latency); + printf("Midi Output opened with %ld ms latency.\n", (long) latency); + + /* output note on/off w/latency offset; hold until user prompts */ + printf("ready to send program 1 change... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + /* if we were writing midi for immediate output, we could always use + timestamps of zero, but since we may be writing with latency, we + will explicitly set the timestamp to "now" by getting the time. + The source of timestamps should always correspond to the TIME_PROC + and TIME_INFO parameters used in Pm_OpenOutput(). */ + buffer[0].timestamp = TIME_PROC(TIME_INFO); + /* Send a program change to increase the chances we will hear notes */ + /* Program 0 is usually a piano, but you can change it here: */ +#define PROGRAM 0 + buffer[0].message = Pm_Message(0xC0, PROGRAM, 0); + Pm_Write(midi, buffer, 1); + + printf("ready to note-on... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + buffer[0].timestamp = TIME_PROC(TIME_INFO); + buffer[0].message = Pm_Message(0x90, 60, 100); + Pm_Write(midi, buffer, 1); + printf("ready to note-off... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + buffer[0].timestamp = TIME_PROC(TIME_INFO); + buffer[0].message = Pm_Message(0x90, 60, 0); + Pm_Write(midi, buffer, 1); + + /* output short note on/off w/latency offset; hold until user prompts */ + printf("ready to note-on (short form)... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + Pm_WriteShort(midi, TIME_PROC(TIME_INFO), + Pm_Message(0x90, 60, 100)); + printf("ready to note-off (short form)... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + Pm_WriteShort(midi, TIME_PROC(TIME_INFO), + Pm_Message(0x90, 60, 0)); + + /* output several note on/offs to test timing. + Should be 1s between notes */ + printf("chord will arpeggiate if latency > 0\n"); + printf("ready to chord-on/chord-off... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + timestamp = TIME_PROC(TIME_INFO); + for (i = 0; i < chord_size; i++) { + buffer[i].timestamp = timestamp + 1000 * i; + buffer[i].message = Pm_Message(0x90, chord[i], 100); + } + Pm_Write(midi, buffer, chord_size); + + off_time = timestamp + 1000 + chord_size * 1000; + while (TIME_PROC(TIME_INFO) < off_time) + /* busy wait */; + for (i = 0; i < chord_size; i++) { + buffer[i].timestamp = timestamp + 1000 * i; + buffer[i].message = Pm_Message(0x90, chord[i], 0); + } + Pm_Write(midi, buffer, chord_size); + + /* close device (this not explicitly needed in most implementations) */ + printf("ready to close and terminate... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + + Pm_Close(midi); + Pm_Terminate(); + printf("done closing and terminating...\n"); +} + + +void main_test_both() +{ + int i = 0; + int in, out; + PmStream * midi, * midiOut; + PmEvent buffer[1]; + PmError status, length; + int num = 10; + + in = get_number("Type input number: "); + out = get_number("Type output number: "); + + /* In is recommended to start timer before PortMidi */ + TIME_START; + + Pm_OpenOutput(&midiOut, + out, + DRIVER_INFO, + OUTPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO, + latency); + printf("Midi Output opened with %ld ms latency.\n", (long) latency); + /* open input device */ + Pm_OpenInput(&midi, + in, + DRIVER_INFO, + INPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO); + printf("Midi Input opened. Reading %d Midi messages...\n",num); + Pm_SetFilter(midi, PM_FILT_ACTIVE | PM_FILT_CLOCK); + /* empty the buffer after setting filter, just in case anything + got through */ + while (Pm_Poll(midi)) { + Pm_Read(midi, buffer, 1); + } + i = 0; + while (i < num) { + status = Pm_Poll(midi); + if (status == TRUE) { + length = Pm_Read(midi,buffer,1); + if (length > 0) { + Pm_Write(midiOut, buffer, 1); + printf("Got message %d: time %ld, %2lx %2lx %2lx\n", + i, + (long) buffer[0].timestamp, + (long) Pm_MessageStatus(buffer[0].message), + (long) Pm_MessageData1(buffer[0].message), + (long) Pm_MessageData2(buffer[0].message)); + i++; + } else { + assert(0); + } + } + } + + /* close midi devices */ + Pm_Close(midi); + Pm_Close(midiOut); + Pm_Terminate(); +} + + +/* main_test_stream exercises windows winmm API's stream mode */ +/* The winmm stream mode is used for latency>0, and sends + timestamped messages. The timestamps are relative (delta) + times, whereas PortMidi times are absolute. Since peculiar + things happen when messages are not always sent in advance, + this function allows us to exercise the system and test it. + */ +void main_test_stream() { + PmStream * midi; + char line[80]; + PmEvent buffer[16]; + + /* determine which output device to use */ + int i = get_number("Type output number: "); + + latency = 500; /* ignore LATENCY for this test and + fix the latency at 500ms */ + + /* It is recommended to start timer before PortMidi */ + TIME_START; + + /* open output device */ + Pm_OpenOutput(&midi, + i, + DRIVER_INFO, + OUTPUT_BUFFER_SIZE, + TIME_PROC, + TIME_INFO, + latency); + printf("Midi Output opened with %ld ms latency.\n", (long) latency); + + /* output note on/off w/latency offset; hold until user prompts */ + printf("ready to send output... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + + /* if we were writing midi for immediate output, we could always use + timestamps of zero, but since we may be writing with latency, we + will explicitly set the timestamp to "now" by getting the time. + The source of timestamps should always correspond to the TIME_PROC + and TIME_INFO parameters used in Pm_OpenOutput(). */ + buffer[0].timestamp = TIME_PROC(TIME_INFO); + buffer[0].message = Pm_Message(0xC0, 0, 0); + buffer[1].timestamp = buffer[0].timestamp; + buffer[1].message = Pm_Message(0x90, 60, 100); + buffer[2].timestamp = buffer[0].timestamp + 1000; + buffer[2].message = Pm_Message(0x90, 62, 100); + buffer[3].timestamp = buffer[0].timestamp + 2000; + buffer[3].message = Pm_Message(0x90, 64, 100); + buffer[4].timestamp = buffer[0].timestamp + 3000; + buffer[4].message = Pm_Message(0x90, 66, 100); + buffer[5].timestamp = buffer[0].timestamp + 4000; + buffer[5].message = Pm_Message(0x90, 60, 0); + buffer[6].timestamp = buffer[0].timestamp + 4000; + buffer[6].message = Pm_Message(0x90, 62, 0); + buffer[7].timestamp = buffer[0].timestamp + 4000; + buffer[7].message = Pm_Message(0x90, 64, 0); + buffer[8].timestamp = buffer[0].timestamp + 4000; + buffer[8].message = Pm_Message(0x90, 66, 0); + + Pm_Write(midi, buffer, 9); +#ifdef SEND8 + /* Now, we're ready for the real test. + Play 4 notes at now, now+500, now+1000, and now+1500 + Then wait until now+2000. + Play 4 more notes as before. + We should hear 8 evenly spaced notes. */ + now = TIME_PROC(TIME_INFO); + for (i = 0; i < 4; i++) { + buffer[i * 2].timestamp = now + (i * 500); + buffer[i * 2].message = Pm_Message(0x90, 60, 100); + buffer[i * 2 + 1].timestamp = now + 250 + (i * 500); + buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0); + } + Pm_Write(midi, buffer, 8); + + while (Pt_Time() < now + 2500) + /* busy wait */; + /* now we are 500 ms behind schedule, but since the latency + is 500, the delay should not be audible */ + now += 2000; + for (i = 0; i < 4; i++) { + buffer[i * 2].timestamp = now + (i * 500); + buffer[i * 2].message = Pm_Message(0x90, 60, 100); + buffer[i * 2 + 1].timestamp = now + 250 + (i * 500); + buffer[i * 2 + 1].message = Pm_Message(0x90, 60, 0); + } + Pm_Write(midi, buffer, 8); +#endif + /* close device (this not explicitly needed in most implementations) */ + printf("ready to close and terminate... (type RETURN):"); + fgets(line, STRING_MAX, stdin); + + Pm_Close(midi); + Pm_Terminate(); + printf("done closing and terminating...\n"); +} + + +void show_usage() +{ + printf("Usage: test [-h] [-l latency-in-ms]\n"); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int default_in; + int default_out; + int i = 0, n = 0; + char line[STRING_MAX]; + int test_input = 0, test_output = 0, test_both = 0, somethingStupid = 0; + int stream_test = 0; + int latency_valid = FALSE; + + if (sizeof(void *) == 8) + printf("Apparently this is a 64-bit machine.\n"); + else if (sizeof(void *) == 4) + printf ("Apparently this is a 32-bit machine.\n"); + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-h") == 0) { + show_usage(); + } else if (strcmp(argv[i], "-l") == 0 && (i + 1 < argc)) { + i = i + 1; + latency = atoi(argv[i]); + printf("Latency will be %ld\n", (long) latency); + latency_valid = TRUE; + } else { + show_usage(); + } + } + + while (!latency_valid) { + int lat; // declared int to match "%d" + printf("Latency in ms: "); + if (scanf("%d", &lat) == 1) { + latency = (int32_t) lat; // coerce from "%d" to known size + latency_valid = TRUE; + } + } + + /* determine what type of test to run */ + printf("begin portMidi test...\n"); + printf("%s%s%s%s%s", + "enter your choice...\n 1: test input\n", + " 2: test input (fail w/assert)\n", + " 3: test input (fail w/NULL assign)\n", + " 4: test output\n 5: test both\n", + " 6: stream test\n"); + while (n != 1) { + n = scanf("%d", &i); + fgets(line, STRING_MAX, stdin); + switch(i) { + case 1: + test_input = 1; + break; + case 2: + test_input = 1; + somethingStupid = 1; + break; + case 3: + test_input = 1; + somethingStupid = 2; + break; + case 4: + test_output = 1; + break; + case 5: + test_both = 1; + break; + case 6: + stream_test = 1; + break; + default: + printf("got %d (invalid input)\n", n); + break; + } + } + + /* list device information */ + default_in = Pm_GetDefaultInputDeviceID(); + default_out = Pm_GetDefaultOutputDeviceID(); + for (i = 0; i < Pm_CountDevices(); i++) { + char *deflt; + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (((test_input | test_both) & info->input) | + ((test_output | test_both | stream_test) & info->output)) { + printf("%d: %s, %s", i, info->interf, info->name); + if (info->input) { + deflt = (i == default_in ? "default " : ""); + printf(" (%sinput)", deflt); + } + if (info->output) { + deflt = (i == default_out ? "default " : ""); + printf(" (%soutput)", deflt); + } + printf("\n"); + } + } + + /* run test */ + if (stream_test) { + main_test_stream(); + } else if (test_input) { + main_test_input(somethingStupid); + } else if (test_output) { + main_test_output(); + } else if (test_both) { + main_test_both(); + } + + printf("finished portMidi test...type ENTER to quit..."); + fgets(line, STRING_MAX, stdin); + return 0; +} diff --git a/pd/portmidi/pm_test/test.vcproj b/pd/portmidi/pm_test/test.vcproj new file mode 100755 index 000000000..95d7f4b93 --- /dev/null +++ b/pd/portmidi/pm_test/test.vcproj @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding = "Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="test" + ProjectGUID="{0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="test.dir\Debug" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + BasicRuntimeChecks="3" + CompileAs="1" + DebugInformationFormat="3" + ExceptionHandling="0" + InlineFunctionExpansion="0" + Optimization="0" + RuntimeLibrary="1" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + AssemblerListingLocation="Debug" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Debug/test.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,_DEBUG,PM_CHECK_ERRORS=1,DEBUG,CMAKE_INTDIR=\"Debug\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386 /debug" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Debug\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Debug\test.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="2" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Debug/test.pdb" + GenerateDebugInformation="TRUE" + SubSystem="1" + ImportLibrary="..\pm_test\Debug\test.lib"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="test.dir\Release" + ConfigurationType="1" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="FALSE" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions=" /Zm1000" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + CompileAs="1" + ExceptionHandling="0" + InlineFunctionExpansion="2" + Optimization="2" + RuntimeLibrary="0" + WarningLevel="3" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + AssemblerListingLocation="Release" + ObjectFile="$(IntDir)\" + ProgramDataBaseFileName="../pm_test/Release/test.pdb" +/> + <Tool + Name="VCCustomBuildTool"/> + <Tool + Name="VCResourceCompilerTool" + AdditionalIncludeDirectories="..\pm_common;..\porttime;" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\""/> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="WIN32,_WINDOWS,NDEBUG,CMAKE_INTDIR=\"Release\"" + MkTypLibCompatible="FALSE" + TargetEnvironment="1" + GenerateStublessProxies="TRUE" + TypeLibraryName="$(InputName).tlb" + OutputDirectory="$(IntDir)" + HeaderFileName="$(InputName).h" + DLLDataFileName="" + InterfaceIdentifierFileName="$(InputName)_i.c" + ProxyFileName="$(InputName)_p.c"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCLinkerTool" + AdditionalOptions=" /STACK:10000000 /machine:I386" + AdditionalDependencies="$(NOINHERIT) kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib ..\Release\portmidi_s.lib winmm.lib " + OutputFile="..\pm_test\Release\test.exe" + Version="0.0" + GenerateManifest="TRUE" + LinkIncremental="1" + AdditionalLibraryDirectories="" + ProgramDataBaseFile="../pm_test/Release/test.pdb" + SubSystem="1" + ImportLibrary="..\pm_test\Release\test.lib"/> + </Configuration> + </Configurations> + <Files> + <Filter + Name="Source Files" + Filter=""> + <File + RelativePath="..\pm_test\test.c"> + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/pm_test/txdata.syx b/pd/portmidi/pm_test/txdata.syx new file mode 100755 index 000000000..1e06e5a6e --- /dev/null +++ b/pd/portmidi/pm_test/txdata.syx @@ -0,0 +1,257 @@ +20 0 1d 4 c 6 0 34 1 4d 4 d 1f 7 3 6 + c 5e 4 4d d b 18 5 3 6 0 3d 1 4a 16 18 +1f 8 3 6 d 0 1 63 4 13 3a 23 0 0 0 2 + c 2 4 0 63 32 0 0 0 32 0 47 72 61 6e 64 +50 69 61 6e 6f 63 63 63 32 32 32 0 0 0 0 0 +10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 9 9 f c 27 2 35 37 10 1f 4 3 4 + d 19 4 56 5 16 1f f 8 d c 0 43 60 4 e +1f c 3 7 e 0 43 63 5 10 3c 14 8 2 1b 56 + 5 2 4 0 63 32 0 0 0 32 0 4c 6f 54 69 6e +65 38 31 5a 20 63 63 63 32 32 32 0 7f 0 1 0 +18 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f e f e 9 0 3 43 2d e 1f f 5 7 + f 16 43 5a 0 0 1f 12 6 8 d 0 3 63 4 0 +1f 12 6 8 f 0 2 63 4 6 34 14 0 1 2 4e +18 2 4 0 63 32 0 32 0 32 0 44 79 6e 6f 6d +69 74 65 45 50 63 63 63 32 32 32 0 70 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f b 1 b 8 18 40 5f a e 1f 1f 0 a + f 0 40 5f 4 0 1f 1f 0 a f 0 40 63 5 6 +1f 1f 0 a f 0 40 5f 0 8 1f 20 0 3 0 5a +18 4 4 0 63 32 32 0 0 32 0 50 65 72 63 4f +72 67 61 6e 20 63 63 63 32 32 32 0 0 0 0 0 + 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f b 7 f 9 0 4 49 13 13 1f 8 7 5 + e 0 2 58 0 c 1f 6 4 6 f 23 3 46 10 a +1f 7 8 c d 0 2 63 8 b 2 1c 0 0 0 52 +18 4 4 0 63 32 0 32 0 32 0 54 68 69 6e 20 +43 6c 61 76 20 63 63 63 32 32 32 0 70 0 20 0 +10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f c 0 6 1 a 4 50 20 e 1f c 0 6 + 1 a 4 50 1f 8 1f b 9 5 e 0 2 63 5 e +1f b 9 5 e 0 3 63 4 8 4 1a 0 0 0 52 +1d 2 4 0 63 32 0 32 0 32 0 42 72 69 74 65 +43 65 6c 73 74 63 63 63 32 32 32 0 20 0 26 0 + 1 0 8 4 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 f 1f 4 8 f 0 3a 51 4 b e 1f 0 8 + f 0 22 4b 4 3 f 1a b 8 d 0 3b 36 9 3 +12 1f 0 8 f 0 22 5d 4 b 3a 1e 19 5 0 52 +18 4 4 0 63 32 0 0 0 32 0 54 72 75 6d 70 +65 74 38 31 5a 63 63 63 32 32 32 0 0 0 50 0 +51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 c 5 0 8 0 0 2 4a 4 b f 1f 0 8 + f 0 2 3f 4 3 1f f 0 8 0 23 3 44 b 3 +10 1f 0 9 f 0 2 5e 4 c 3a 1f 19 7 0 52 +18 4 4 0 63 32 0 0 0 32 0 46 6c 75 67 65 +6c 68 6f 72 6e 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 10 1f 0 8 f 0 42 4a 0 3 11 1f 0 8 + f a 43 51 0 3 11 9 0 8 d 0 42 2b 16 6 +10 1f 0 9 f 0 42 63 4 b 3a 1e 9 9 0 5a +24 4 4 0 63 32 31 0 0 32 0 52 61 73 70 41 +6c 74 6f 20 20 63 63 63 32 32 32 0 10 0 20 0 +54 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 10 9 2 6 d 0 41 3e 4 15 c b 2 3 + e 0 41 4f 4 12 c e 2 8 d 0 42 4b a 1c + d b 1 9 e 0 3 63 a 14 0 23 f 2 1b 5e +18 4 5 0 63 28 50 32 0 32 0 48 61 72 6d 6f +6e 69 63 61 20 63 63 63 32 32 32 0 50 10 50 0 +50 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1c 2 0 4 e 63 0 4e 4 3 d 5 0 6 + e 63 1 56 a 8 12 7 0 6 9 63 2 47 1b e + a a 0 5 f 0 1 63 4 b 32 1a 8 d 0 52 + c 4 4 0 63 32 0 0 0 32 0 44 6f 75 62 6c +65 42 61 73 73 63 63 63 32 32 32 0 10 0 0 0 + 3 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 b 4 0 4 f 14 2 49 9 6 a 7 0 4 + f 14 2 51 a 0 8 1f 0 5 f 0 1 63 9 6 + a 1f 0 5 f 0 1 63 a 0 3c 1f 6 9 0 52 + 5 4 4 0 63 32 0 0 0 32 0 48 69 53 74 72 +69 6e 67 20 31 63 63 63 32 32 32 0 2 0 30 0 +32 0 10 5 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 10 13 f 4 a 0 3 3b 14 14 1f e 8 7 + 9 0 2 42 5 e 18 13 d 9 c 0 2 3c 13 8 +1f 11 7 4 f 0 42 63 4 10 3a 1b 0 0 0 52 +1d 4 4 0 63 32 0 0 0 32 0 48 61 72 70 20 +20 20 20 20 20 63 63 63 32 32 32 8 0 0 21 0 + 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 6 6 4 f 0 40 48 5 0 c 8 7 5 + f 5 0 52 4 0 f 7 3 7 e 8 3 63 4 6 + f 8 4 5 f 0 3 63 4 6 7c 1f 0 6 0 4a +11 2 4 0 63 32 0 0 0 32 0 46 61 6e 66 61 +72 54 70 74 73 63 63 63 32 32 32 6 1 0 38 0 + 8 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 d b 0 1 c 0 2 2c 3d 3 d 7 0 1 + c 0 2 1f 3c 3 d 1f 0 5 f 0 2 63 5 6 + d 1f 0 5 f 0 2 63 4 0 3c 63 0 2f 0 53 +11 4 4 0 63 32 0 0 0 32 0 42 72 65 61 74 +68 4f 72 67 6e 63 63 63 32 32 32 4 30 5 50 0 +11 0 18 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 9 0 6 0 27 2 51 19 b 1c 6 0 8 + 0 37 2 47 a 3 1f a 0 9 0 3d 2 4d a e +1f 12 8 8 f 0 3 61 4 b 28 1f 0 3 0 52 + c 3 4 0 63 32 1 32 0 32 0 4e 79 6c 6f 6e +47 75 69 74 20 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f e e f f 0 3 48 2d 6 1f f 4 f + f 25 3 5b 0 0 1f 12 6 c e 1c 3 55 0 10 +1f 13 7 8 e 6 4 62 4 e 3b 14 0 0 0 42 +18 2 4 0 63 32 0 32 0 32 0 47 75 69 74 61 +72 20 23 31 20 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 19 8 a 3 0 3 63 10 18 1f c 5 b + 5 0 3 52 0 b 1f 19 6 b 5 0 3 63 a 16 +1f f 11 9 7 0 4 63 4 3 3a 14 0 0 0 42 +18 2 4 0 63 32 0 32 0 32 0 46 75 6e 6b 79 +20 50 69 63 6b 63 63 63 32 32 32 0 30 0 0 0 + 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 1 0 8 4 0 3 3d a 1e 1f 1 0 8 + 0 0 0 43 0 10 1f 9 6 8 c 1b 7 46 1c 1e +1f 9 0 9 9 0 1 63 4 3 3a 1c 0 0 0 52 + c 4 5 0 63 4b 0 0 0 32 0 45 6c 65 63 42 +61 73 73 20 31 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f f f e 9 0 3 46 1d 16 1f f 5 e + e d 3 63 0 b 1f 13 6 5 d 1c 3 63 0 0 +1f 13 6 8 f 0 4 63 4 6 3b 1f 0 0 0 42 + c 4 4 0 63 32 0 32 0 32 0 53 79 6e 46 75 +6e 6b 42 61 73 63 63 63 32 32 32 d 6c 0 0 0 +70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 10 7 8 3 0 3 4f 4 3 1f 9 0 8 + 0 0 1 4a 0 b 1f 11 0 8 0 0 1 47 4 8 +1f 9 0 8 0 0 0 63 0 b 39 19 0 7 0 52 + c 2 4 0 63 32 0 32 0 32 0 4c 61 74 65 6c +79 42 61 73 73 63 63 63 32 32 32 2 0 0 0 0 +40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 13 12 0 9 d 22 0 51 0 b 1f 14 0 5 + 8 24 40 5c 0 3 1f 11 0 6 c 2c 0 53 9 0 +10 1f 0 b f 0 0 5c a e 3a 22 11 e 1e 5e +18 7 4 0 63 32 0 32 0 32 0 53 79 6e 63 20 +4c 65 61 64 20 63 63 63 32 32 32 0 70 0 40 0 + 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 13 1e 0 9 e 0 0 63 3f b 1f 14 0 5 + e 24 1 51 4 3 1f 14 0 f 1 0 41 4d 8 3 + f 1f 0 b f 0 2 63 4 b 3b 20 11 12 33 56 +18 4 4 0 63 37 e 0 0 32 0 4a 61 7a 7a 20 +46 6c 75 74 65 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 15 13 d 3 d 1e 2 50 18 e 15 14 9 4 + c 1e 2 56 11 8 1b 1f f 7 f 0 1 63 4 6 +1a 1f e 6 f 0 2 63 4 0 7c b 0 8 0 62 +18 4 4 0 63 32 0 0 0 32 0 4a 61 76 61 20 +4a 69 76 65 20 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 0 0 4 f 0 40 63 3c 0 b 8 7 7 + f 5 0 63 4 6 f 5 3 7 f 8 0 3b 5 6 + e 8 4 5 f 0 3 63 3 0 7e 1d 6 f 0 4a +11 0 4 0 63 32 0 0 0 32 0 42 61 61 64 42 +72 65 61 74 68 63 63 63 32 32 32 6 30 0 38 0 + 1 0 46 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 0 0 4 f 0 40 47 2f 0 e 8 7 7 + f 5 0 4c 0 6 13 1c d c 6 8 0 63 5 6 +14 11 d b 0 0 3 63 4 0 7a 10 0 51 0 68 +17 0 4 0 63 32 0 0 0 32 0 56 6f 63 61 6c +4e 75 74 73 20 63 63 63 32 32 32 6 30 0 30 0 + 1 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 1f 0 5 f 0 0 41 32 3 1f 14 10 5 + 5 1 2 63 7 3 1f b 12 8 f 0 1 63 c 3 +1f 1f f 8 f 0 1 63 4 3 39 23 0 0 0 62 +18 7 4 0 63 32 0 0 0 32 0 57 61 74 65 72 +47 6c 61 73 73 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 16 2 0 4 6 9 1 4f 8 0 19 e 1 4 + 0 20 1 43 19 0 1f 12 10 6 7 0 0 54 3d 3 +16 d 6 6 2 1e 3 61 8 e 3a 20 1 14 0 42 + c 2 4 2 63 63 63 0 0 32 0 46 75 7a 7a 79 +20 4b 6f 74 6f 63 63 63 32 32 32 0 0 0 0 b +50 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1c 8 0 3 e 0 1 55 12 3 1c 7 0 1 + e 2e 1 58 27 b e 4 0 2 a 0 2 63 4 a + d 9 0 2 c 1 2 63 10 b 4 54 0 47 0 53 +18 7 4 0 63 32 0 0 0 32 0 42 72 74 68 62 +65 6c 6c 73 20 63 63 63 32 32 32 0 4 0 40 0 +40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1a 4 1 1 b 16 0 47 5 3 15 e 0 1 + d 0 0 4c 5 16 1c 6 4 2 7 0 0 63 4 16 +18 18 3 1 e 0 0 5e 4 10 24 7 0 4 0 62 +24 4 4 0 63 32 0 0 0 32 0 54 75 62 65 20 +42 65 6c 6c 73 63 63 63 32 32 32 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 1f 13 3 0 0 0 5f 3d 6 1f 12 13 2 + 0 0 1 52 5 2 1f 14 13 3 0 0 1 56 28 5 +1e b 13 f 9 0 0 63 6 3 3b 63 0 63 0 73 +23 7 4 0 63 32 0 0 0 32 0 4e 6f 69 73 65 +20 53 68 6f 74 63 63 63 32 32 32 8 0 0 0 8 + 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 1f 16 0 3 7 0 1 50 0 3 1f 18 3 3 + 3 22 0 63 0 14 1d 7 6 3 6 0 1 3c 8 3 +1f 5 7 3 0 0 1 63 4 1b 39 23 0 8 0 42 +18 4 4 0 63 32 0 0 0 32 0 48 61 6e 64 20 +44 72 75 6d 20 63 63 63 32 32 32 0 1 0 3 0 + 1 0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 7d f7 \ No newline at end of file diff --git a/pd/portmidi/pm_win/README_WIN.txt b/pd/portmidi/pm_win/README_WIN.txt old mode 100644 new mode 100755 index 3fe5ee417..b161bb274 --- a/pd/portmidi/pm_win/README_WIN.txt +++ b/pd/portmidi/pm_win/README_WIN.txt @@ -1,19 +1,23 @@ File: PortMidi Win32 Readme Author: Belinda Thom, June 16 2002 -Revised by: Roger Dannenberg, June 2002, May 2004 +Revised by: Roger Dannenberg, June 2002, May 2004, June 2007, + Umpei Kurokawa, June 2007 + Roger Dannenberg Sep 2009 + +Contents: + Using Portmidi + To Install Portmidi + To Compile Portmidi + About Cmake + Using other versions of Visual C++ + To Create Your Own Portmidi Client Application + + ============================================================================= USING PORTMIDI: ============================================================================= -PortMidi has been created using a DLL because the Win32 MMedia API doesn't -handle midiInput properly in the debugger. Specifically, it doesn't clean up -after itself if the user (i.e. you, a PortMidi application) hasn't explicitly -closed all open midi input devices. This lack of cleanup can lead to much -pain and agony, including the blue-screen-of-death. This situation becomes -increasingly unacceptable when you are debugging your code, so a portMidi DLL -seemed to be the most elegant solution. - Using Microsoft Visual C++ project files (provided with PortMidi), there are two configurations of the PortMidi library. The Debug version is intended for debugging, especially in a console application. The Debug @@ -33,14 +37,14 @@ is both optimized and lacking the debugging printout code of the Debug version. Read the portmidi.h file for PortMidi API details on using the PortMidi API. -See <...>\pm_dll_test\test.c or <...>\multithread\test.c for usage examples. +See <...>\pm_test\test.c and other files in pm_test for usage examples. ============================================================================= TO INSTALL PORTMIDI: ============================================================================= -1) download portmidi.zip +1) get current source from the portmedia project at SourceForge.net -2) unzip portmidi.zip into directory: <...>\portmidi +2) copy source into directory: <...>\portmidi ============================================================================= TO COMPILE PORTMIDI: @@ -48,58 +52,104 @@ TO COMPILE PORTMIDI: 3) cd to or open the portmidi directory -4) start or click on the portmidi.dsw workspace - +4) start or click on the portmidi.sln workspace (note, all Visual Studio + files are built by CMake. If you need a different version or have + problems with paths, try rebuilding the Visual Studio project files + using CMake -- See "Using other versions of visual C++" below.) + 5) the following projects exist within this workspace: - - portmidi (the PortMidi library) - - pm_dll (the dll library used to close midi ports on program exit) - - porttime (a small portable library implementing timer facilities) - - test (simple midi I/O testing) - - multithread (an example illustrating low-latency MIDI processing - using a dedicated low-latency thread) - - sysex (simple sysex message I/O testing) - - latency (uses porttime to measure system latency) - -6) verify that all project settings are for Win32 Debug release: - - type Alt-F7 - - highlight all three projects in left part of Project Settings window; - - "Settings For" should say "Win32 Debug" - -7) use Build->Batch Build ... to build everything in the project - -8) The settings for these projects were distributed in the zip file, so + - portmidi-static, portmidi-dynamic (versions of the PortMidi library) + - test (simple midi I/O testing) + - midithread (an example illustrating low-latency MIDI processing + using a dedicated low-latency thread) + - sysex (simple sysex message I/O testing) + - latency (uses porttime to measure system latency) + - midithru (an example illustrating software MIDI THRU) + - qtest (a test of the new multicore-safe queue implementation) + - mm (allows monitoring of midi messages) + - pmjni (a dll to provide an interface to PortMidi for Java) + +6) set the Java SDK path using one of two methods: + Method 1: open portmidi/CMakeLists.txt with CMake, configure, and + generate -- this should find the Java SDK path and update your + solution and project files + Method 2: (does not require CMake): + - open the pmjni project properties + - visit Configuration Properties, C/C++, General + - find Additional Include Directories property and open the editor (...) + - at the end of the list, you will find two paths mentioning Java + - these are absolute paths to the Java SDK; you'll need to install the + Java SDK (from Sun) and update these directories in order to build + this project. + - similarly, the Linker->Input->Additional Dependencies list has a + path to the jvm.lib file, which needs to be correct(ed). + +6) use Build->Batch Build ... to build everything in the project. If a + build fails, try building again. There seem to be some missing + dependencies, so you may have to "ALL_BUILD" several times before + everything builds successfully. + +7) The settings for these projects were distributed in the zip file, so compile should just work. -9) IMPORTANT! PortMidi uses a DLL, pm_dll.dll, but there is no simple way - to set up projects to use pm_dll. THEREFORE, you need to copy DLLs - as follows (you can do this with <...>\portmidi\pm_win\copy-dll.bat): - copy <...>\portmidi\pm_win\Debug\pm_dll.dll to: - <...>\portmidi\pm_test\latencyDebug\pm_dll.dll - <...>\portmidi\pm_test\midithreadDebug\pm_dll.dll - <...>\portmidi\pm_test\sysexDebug\pm_dll.dll - <...>\portmidi\pm_test\testDebug\pm_dll.dll - <...>\portmidi\pm_test\midithruDebug\pm_dll.dll - and copy <...>\portmidi\pm_win\Release\pm_dll.dll to: - <...>\portmidi\pm_test\latencyRelease\pm_dll.dll - <...>\portmidi\pm_test\midithreadRelease\pm_dll.dll - <...>\portmidi\pm_test\sysexRelease\pm_dll.dll - <...>\portmidi\pm_test\testRelease\pm_dll.dll - <...>\portmidi\pm_test\midithruRelease\pm_dll.dll - each time you rebuild the pm_dll project, these copies must be redone! - - Since Windows will look in the executable directory for DLLs, we - recommend that you always install a copy of pm_dll.dll (either the - debug version or the release version) in the same directory as the - application using PortMidi. The release DLL is about 40KB. This will - ensure that the application uses the correct DLL. - -10) run test project; use the menu that shows up from the command prompt to +8) run test project; use the menu that shows up from the command prompt to test that portMidi works on your system. tests include: - verify midi output works - verify midi input works - - verify midi input w/midi thru works -11) run other projects if you wish: sysex, latency, midithread, mm, qtest +9) run other projects if you wish: sysex, latency, midithread, mm, + qtest, midithru + +10) compile the java code: + - cd pm_java + - make.bat + + If there is a problem running javac, note that you must have + a path to javac.exe on your PATH environment variable. Edit + your path (in Vista) using Control Panel > User Accounts > + User Accounts > Change my environment variables; then select + Path and click Edit... After changing, you will have to + restart the command window to see any effect. + + In Vista, you may get a warning about running + UpdateRsrcJavaExe.exe. This is called by make.bat, and you + should allow the program to run. + + Note that make.bat does not build pmjni\jportmidi_JPortMidiApi.h + because it is included in the distribution. You can rebuild it + from sources as follows: + cd pm_java + javah jportmidi.JPortMidiApi + move jportmidi_JPortMidiApi pmjni\jportmidi_JPortMidiApi.h + +11) you might wish to move pm_java/win32 to another location; run the + pmdefaults.exe program from the (entire) win32 directory to use + PmDefaults. This program let's you select default input/output + midi devices for PortMidi applications. + +============================================================================ +ABOUT CMAKE +============================================================================ + +cmake was used to generate .vcproj files. cmake embeds absolute paths +into .vcproj files, which makes the files non-portable to other systems. +To work around this problem, pm_win\clean_up_vcproj.bat can be used to +replace absolute paths with relative paths. To use it, you will need to +install gawk and set your search path to allow you to execute gawk, e.g. +my path includes "C:\Program Files\GnuWin32\bin;". You will also need to +edit pm_win\clean_up_vcproj.awk, replacing C:\Users\rbd\portmidi with +whatever absolute path cmake uses in your vcproj files. + +This is not a general or robust fix, but it seems to work with the +vcproj files currently created by CMake. + +============================================================================ +USING OTHER VERSIONS OF VISUAL C++ +============================================================================ + +You can use cmake to make Visual Studio solution and project files. +If you do not want to use the provided Version 9 project files, install +cmake, run it, set the "Where is the source code" box to your portmidi +directory, and click on Configure. A menu will allow you to choose the +Visual Studio project version you want. Click Configure once again, then +Generate, and you should be all set to open portmidi.sln. ============================================================================ TO CREATE YOUR OWN PORTMIDI CLIENT APPLICATION: @@ -119,43 +169,35 @@ The easiest way is to start a new project w/in the portMidi workspace: in the next step) - Click OK - Select "An Empty Project" and click Finish - + + In Visual C++ 2005 Express Edition, + - File->New->Projects + - Location: <...>\portmidi\<yourProjectName> + - select Add to solution + - select CLR Empty project in CLR + - select Win32 Console Application in Win32 + - select Empty project in General + 2) Now this project will be the active project. Make it explicitly depend on PortMidi dll: - Project->Dependencies - Click pm_dll -3) Important! in order to be able to use portMidi DLL from your new project - and set breakpoints, copy following files from <...>\pm_dll\Debug into - <...>\<yourProjectName>\Debug directory: - pm_dll.lib - pm_dll.dll - each time you rebuild pm_dll, these copies must be redone! - -4) add whatever files you wish to add to your new project, using portMidi +3) add whatever files you wish to add to your new project, using portMidi calls as desired (see USING PORTMIDI at top of this readme) -5) when you include portMidi files, do so like this: - - #include "..\pm_dll\portmidi.h" +4) when you include portMidi files, do so like this: + - #include "..\pm_common\portmidi.h" - etc. -6) build and run your project +5) build and run your project ============================================================================ DESIGN NOTES ============================================================================ -The DLL is used so that PortMidi can (usually) close open devices when the -program terminates. Failure to close input devices under WinNT, Win2K, and -probably later systems causes the OS to crash. - -This is accomplished with a .LIB/.DLL pair, linking to the .LIB -in order to access functions in the .DLL. - -PortMidi for Win32 exists as a simple library, +PortMidi for Win32 exists as a simple static library, with Win32-specific code in pmwin.c and MM-specific code in pmwinmm.c. -pmwin.c uses a DLL in pmdll.c to call Pm_Terminate() when the program -exits to make sure that all MIDI ports are closed. Orderly cleanup after errors are encountered is based on a fixed order of steps and state changes to reflect each step. Here's the order: @@ -171,10 +213,8 @@ To open input: set descriptor field of PmInternal structure - open device set handle field of midiwinmm_type structure - - allocate buffer 1 for sysex - buffer is added to input port - - allocate buffer 2 for sysex - buffer is added to input port + - allocate buffers + - start device - return - return @@ -287,5 +327,15 @@ part of PortMidi is allowed to directly copy sysex bytes to "fill_base[*fill_offset_ptr++]" until *fill_offset_ptr reaches fill_length. See the code for details. +----------- + +Additional notes on using VS 2005 (maybe this is obsolete now?): + +1) Make sure "Configuration: All Configurations" is selected in all of the following Properties modifications! + +2) In my case the project defaulted to compiling all .c files with the C++ compiler, which was disastrous. I had to go to set Properties for each file, to wit: Expand Configuration Properties, Expand C/C++, Select Advanced, set the Compile As popup to Compile as C Code (/TC). (For better or worse, the project I inherited has a bunch of .c files that rely on C++ features, so I couldn't reliably set this the project properties level.) + +3) While you're there, make sure that the C/C++ -> General -> "Compile with Common Language Runtime support" is set to "No Common Language Runtime support" (the C compiler *can't* support CLR, but VS won't do anything useful like automatically set the two options to match)-. + +4) I never got VS precompiled header thing to work sensibly, so I took the path of least resistance and turned PCH's off for all my files. Properties -> Configuration Properties -> C/C++ -> Precompiled Headers -> Create/Use Precompiled Header popup set to "Not Using Precompiled Headers". The compiler is reasonably fast even if it has to parse all the header files, so unless someone wants to explain VS's PCHs to me, the hell with it, I say. - \ No newline at end of file diff --git a/pd/portmidi/pm_win/clean_cmake.bat b/pd/portmidi/pm_win/clean_cmake.bat new file mode 100644 index 000000000..6bf4b68e0 --- /dev/null +++ b/pd/portmidi/pm_win/clean_cmake.bat @@ -0,0 +1,6 @@ +del /Q ..\CMakeFiles +del /Q ..\CMakeCache.txt +del /Q ..\pm_test\CMakeFiles +del /Q ..\pm_common\CMakeFiles +del /Q ..\pm_dylib\CMakeFiles + diff --git a/pd/portmidi/pm_win/clean_up_vcproj.awk b/pd/portmidi/pm_win/clean_up_vcproj.awk new file mode 100644 index 000000000..a3eadfcb8 --- /dev/null +++ b/pd/portmidi/pm_win/clean_up_vcproj.awk @@ -0,0 +1,70 @@ +# gawk script to convert CMake-generated Visual Studio projects into +# stand-alone project files +# +# Roger Dannenberg, October 2009 +# +# the result uses relative path names (so you can install the project on +# any machine and use it) +# +# NOTE: to run this, you must assign base_relative to the relative path +# from the vcproj file to portmidi, e.g. base_relative=.. or base_relative=. + +BEGIN { + state = "normal"; + #=================IMPORTANT==================== + # change the following path to the path in which + # the CMakeLists.txt file resides: + base_path = "C:\\\\Users\\\\rbd\\\\portmedia\\\\portmidi"; + #============================================== + + base_path_2 = base_path; + gsub("\\\\\\\\", "/", base_path_2) + cmake_stuff = 0; # flag to print <file> ... </file> text +} +# this case removes CMake phases from project +state == "cmakelists" { + # print "IN CMAKELISTS " + file_text = file_text "\n" $0 # collect the <file> ... </file> section + if (index($0, "CMakeLists.txt") > 0) { + cmake_stuff = 1 # remember to delete this <file> ... </file> section + } + + if (index($0, "</File>") > 0) { + state = "normal"; + if (cmake_stuff == 0) { + gsub(base_path, base_relative, file_text) + gsub(base_path_2, base_relative, file_text) + print file_text; + } + cmake_stuff = 0; + }; + next +} + +# this is the normal case, not in buildPhases list +state == "normal" { + # print "NOT IN BUILD PHASES" + # take out all the absolute paths + gsub(base_path, base_relative, $0); + gsub(base_path_2, base_relative, $0); + # special processing for <file> ... </file> text: + if ($0 ~ "<File$") { + file_text = $0; + cmake_stuff = 0; # innocent (keep text) until proven guilty + state = "cmakelists"; + next # do not print this line + }; + # THIS CODE WOULD ALLOW portmidi-static and portmidi-dynamic IN + # pm_commmon. I DECIDED TO TRY PUTTING THEM IN SEPARATE DIRECTORIES + # INSTEAD. + # Use static libraries for everything except portmidi-dynamic + #if (($0 ~ "RuntimeLibrary=") && (base_relative ~ "dynamic")) { + # if ($0 ~ 2) { + # $0 = "\t\t\t\tRuntimeLibrary=\"0\""; + # } else if ($0 ~ 3) { + # $0 = "\t\t\t\tRuntimeLibrary=\"1\""; + # } + print $0; + next +} + diff --git a/pd/portmidi/pm_win/clean_up_vcproj.bat b/pd/portmidi/pm_win/clean_up_vcproj.bat new file mode 100644 index 000000000..1919246d7 --- /dev/null +++ b/pd/portmidi/pm_win/clean_up_vcproj.bat @@ -0,0 +1,76 @@ +@echo off +rem Start this program in portmidi\pm_win +cd ..\pm_common + +rename portmidi-static.vcproj portmidi-static.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. portmidi-static.vcproj-cmake > portmidi-static.vcproj +del portmidi-static.vcproj-cmake +echo portmidi-static + +rename pmjni.vcproj pmjni.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. pmjni.vcproj-cmake > pmjni.vcproj +del pmjni.vcproj-cmake +echo pmjni + +cd ../pm_dylib + +rename portmidi-dynamic.vcproj portmidi-dynamic.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. portmidi-dynamic.vcproj-cmake > portmidi-dynamic.vcproj +del portmidi-dynamic.vcproj-cmake +echo portmidi-dynamic + +cd ..\pm_test + +rename latency.vcproj latency.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. latency.vcproj-cmake > latency.vcproj +del latency.vcproj-cmake +echo latency + +rename midiclock.vcproj midiclock.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midiclock.vcproj-cmake > midiclock.vcproj +del midiclock.vcproj-cmake +echo midiclock + +rename midithread.vcproj midithread.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midithread.vcproj-cmake > midithread.vcproj +del midithread.vcproj-cmake +echo midithread + +rename midithru.vcproj midithru.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. midithru.vcproj-cmake > midithru.vcproj +del midithru.vcproj-cmake +echo midithru + +rename mm.vcproj mm.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. mm.vcproj-cmake > mm.vcproj +del mm.vcproj-cmake +echo mm + +rename qtest.vcproj qtest.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. qtest.vcproj-cmake > qtest.vcproj +del qtest.vcproj-cmake +echo qtest + +rename sysex.vcproj sysex.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. sysex.vcproj-cmake > sysex.vcproj +del sysex.vcproj-cmake +echo sysex + +rename test.vcproj test.vcproj-cmake +gawk -f ..\pm_win\clean_up_vcproj.awk -v base_relative=.. test.vcproj-cmake > test.vcproj +del test.vcproj-cmake + +cd .. +echo test + +rename ALL_BUILD.vcproj ALL_BUILD.vcproj-cmake +gawk -f pm_win\clean_up_vcproj.awk -v base_relative=. ALL_BUILD.vcproj-cmake > ALL_BUILD.vcproj +del ALL_BUILD.vcproj-cmake +echo ALL_BUILD + +rename ZERO_CHECK.vcproj ZERO_CHECK.vcproj-cmake +gawk -f pm_win\clean_up_vcproj.awk -v base_relative=. ZERO_CHECK.vcproj-cmake > ZERO_CHECK.vcproj +del ZERO_CHECK.vcproj-cmake +echo ZERO_CHECK + +cd pm_win diff --git a/pd/portmidi/pm_win/copy-dll.bat b/pd/portmidi/pm_win/copy-dll.bat deleted file mode 100644 index 7c55fff3d..000000000 --- a/pd/portmidi/pm_win/copy-dll.bat +++ /dev/null @@ -1,17 +0,0 @@ -copy Debug\pm_dll.dll ..\pm_test\testDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\sysexDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\midithreadDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\latencyDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\midithruDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\qtestDebug\pm_dll.dll -copy Debug\pm_dll.dll ..\pm_test\mmDebug\pm_dll.dll - -copy Release\pm_dll.dll ..\pm_test\testRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\sysexRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\midithreadRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\latencyRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\midithruRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\qtestRelease\pm_dll.dll -copy Release\pm_dll.dll ..\pm_test\mmRelease\pm_dll.dll - - diff --git a/pd/portmidi/pm_win/debugging_dlls.txt b/pd/portmidi/pm_win/debugging_dlls.txt old mode 100644 new mode 100755 diff --git a/pd/portmidi/pm_win/pm_dll.dsp b/pd/portmidi/pm_win/pm_dll.dsp deleted file mode 100644 index 77218ccb1..000000000 --- a/pd/portmidi/pm_win/pm_dll.dsp +++ /dev/null @@ -1,107 +0,0 @@ -# Microsoft Developer Studio Project File - Name="pm_dll" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=pm_dll - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "pm_dll.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "pm_dll.mak" CFG="pm_dll - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "pm_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "pm_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "pm_dll - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PM_DLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PM_DLL_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 - -!ELSEIF "$(CFG)" == "pm_dll - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 1 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PM_DLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "pm_common" /D "_WINDOWS" /D "_USRDLL" /D "PM_DLL_EXPORTS" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "USE_DLL_FOR_CLEANUP" /FR /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /dll /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "pm_dll - Win32 Release" -# Name "pm_dll - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\pmdll.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\pmdll.h -# End Source File -# End Group -# End Target -# End Project diff --git a/pd/portmidi/pm_win/pmdll.c b/pd/portmidi/pm_win/pmdll.c deleted file mode 100644 index c3acba33e..000000000 --- a/pd/portmidi/pm_win/pmdll.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -==================================================================== -DLL to perform action when program shuts down -==================================================================== -*/ - -#include "windows.h" -#include "pmdll.h" - -static close_fn_ptr_type close_function = NULL; - - -DLL_EXPORT pm_set_close_function(close_fn_ptr_type close_fn_ptr) -{ - close_function = close_fn_ptr; -} - - -static void Initialize( void ) { - return; -} - -static void Terminate( void ) { - if (close_function) { - (*close_function)(); - } -} - - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, //DLL module handle - DWORD fdwReason, //for calling function - LPVOID lbpvReserved)//reserved -{ - switch(fdwReason) { - case DLL_PROCESS_ATTACH: - /* when DLL starts, run this */ - Initialize(); - break; - case DLL_PROCESS_DETACH: - /* when DLL ends, this run (note: verified this run */ - Terminate(); - break; - default: - break; - } - return TRUE; -} - - diff --git a/pd/portmidi/pm_win/pmdll.h b/pd/portmidi/pm_win/pmdll.h deleted file mode 100644 index e5ad1c5bd..000000000 --- a/pd/portmidi/pm_win/pmdll.h +++ /dev/null @@ -1,5 +0,0 @@ -#define DLL_EXPORT __declspec( dllexport ) - -typedef void (*close_fn_ptr_type)(); - -DLL_EXPORT pm_set_close_function(close_fn_ptr_type close_fn_ptr); diff --git a/pd/portmidi/pm_win/pmwin.c b/pd/portmidi/pm_win/pmwin.c old mode 100644 new mode 100755 index 716b68fa5..5b4dec63f --- a/pd/portmidi/pm_win/pmwin.c +++ b/pd/portmidi/pm_win/pmwin.c @@ -9,6 +9,7 @@ be separate from the main portmidi.c file because it is system dependent, and it is separate from, say, pmwinmm.c, because it might need to register devices for winmm, directx, and others. + */ #include "stdlib.h" @@ -16,12 +17,10 @@ #include "pmutil.h" #include "pminternal.h" #include "pmwinmm.h" -#ifdef USE_DLL_FOR_CLEANUP -#include "pmdll.h" /* used to close ports on exit */ -#endif #ifdef DEBUG #include "stdio.h" #endif +#include <windows.h> /* pm_exit is called when the program exits. It calls pm_term to make sure PortMidi is properly closed. @@ -45,20 +44,9 @@ static void pm_exit(void) { /* pm_init is the windows-dependent initialization.*/ void pm_init(void) { -#ifdef USE_DLL_FOR_CLEANUP - /* we were hoping a DLL could offer more robust cleanup after errors, - but the DLL does not seem to run after crashes. Thus, the atexit() - mechanism is just as powerful, and simpler to implement. - */ - pm_set_close_function(pm_exit); -#ifdef DEBUG - printf("registered pm_term with cleanup DLL\n"); -#endif -#else atexit(pm_exit); #ifdef DEBUG printf("registered pm_exit with atexit()\n"); -#endif #endif pm_winmm_init(); /* initialize other APIs (DirectX?) here */ @@ -70,37 +58,77 @@ void pm_term(void) { } -PmDeviceID Pm_GetDefaultInputDeviceID() { - /* This routine should check the environment and the registry - as specified in portmidi.h, but for now, it just returns - the first device of the proper input/output flavor. - */ - int i; +static PmDeviceID pm_get_default_device_id(int is_input, char *key) { + HKEY hkey; +#define PATTERN_MAX 256 + char pattern[PATTERN_MAX]; + long pattern_max = PATTERN_MAX; + DWORD dwType; + /* Find first input or device -- this is the default. */ + PmDeviceID id = pmNoDevice; + int i, j; Pm_Initialize(); /* make sure descriptors exist! */ for (i = 0; i < pm_descriptor_index; i++) { - if (descriptors[i].pub.input) { - return i; + if (descriptors[i].pub.input == is_input) { + id = i; + break; } } - return pmNoDevice; + /* Look in registry for a default device name pattern. */ + if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) != + ERROR_SUCCESS) { + return id; + } + if (RegOpenKeyEx(hkey, "JavaSoft", 0, KEY_READ, &hkey) != + ERROR_SUCCESS) { + return id; + } + if (RegOpenKeyEx(hkey, "Prefs", 0, KEY_READ, &hkey) != + ERROR_SUCCESS) { + return id; + } + if (RegOpenKeyEx(hkey, "/Port/Midi", 0, KEY_READ, &hkey) != + ERROR_SUCCESS) { + return id; + } + if (RegQueryValueEx(hkey, key, NULL, &dwType, pattern, &pattern_max) != + ERROR_SUCCESS) { + return id; + } + + /* decode pattern: upper case encoded with "/" prefix */ + i = j = 0; + while (pattern[i]) { + if (pattern[i] == '/' && pattern[i + 1]) { + pattern[j++] = toupper(pattern[++i]); + } else { + pattern[j++] = tolower(pattern[i]); + } + i++; + } + pattern[j] = 0; /* end of string */ + + /* now pattern is the string from the registry; search for match */ + i = pm_find_default_device(pattern, is_input); + if (i != pmNoDevice) { + id = i; + } + return id; } + +PmDeviceID Pm_GetDefaultInputDeviceID() { + return pm_get_default_device_id(TRUE, + "/P/M_/R/E/C/O/M/M/E/N/D/E/D_/I/N/P/U/T_/D/E/V/I/C/E"); +} + + PmDeviceID Pm_GetDefaultOutputDeviceID() { - /* This routine should check the environment and the registry - as specified in portmidi.h, but for now, it just returns - the first device of the proper input/output flavor. - */ - int i; - Pm_Initialize(); /* make sure descriptors exist! */ - for (i = 0; i < pm_descriptor_index; i++) { - if (descriptors[i].pub.output) { - return i; - } - } - return pmNoDevice; - return 0; + return pm_get_default_device_id(FALSE, + "/P/M_/R/E/C/O/M/M/E/N/D/E/D_/O/U/T/P/U/T_/D/E/V/I/C/E"); } + #include "stdio.h" void *pm_alloc(size_t s) { @@ -112,3 +140,4 @@ void pm_free(void *ptr) { free(ptr); } + diff --git a/pd/portmidi/pm_win/pmwinmm.c b/pd/portmidi/pm_win/pmwinmm.c old mode 100644 new mode 100755 index 395b1134c..ab66f80dc --- a/pd/portmidi/pm_win/pmwinmm.c +++ b/pd/portmidi/pm_win/pmwinmm.c @@ -1,24 +1,28 @@ /* pmwinmm.c -- system specific definitions */ -/* without this define, InitializeCriticalSectionAndSpinCount is undefined */ -/* this version level means "Windows 2000 and higher" */ -#define _WIN32_WINNT 0x0500 +#ifdef _MSC_VER + #pragma warning(disable: 4133) // stop warnings about implicit typecasts +#endif + +#ifndef _WIN32_WINNT + /* without this define, InitializeCriticalSectionAndSpinCount is + * undefined. This version level means "Windows 2000 and higher" + */ + #define _WIN32_WINNT 0x0500 +#endif #include "windows.h" #include "mmsystem.h" #include "portmidi.h" -#ifdef NEWBUFFER #include "pmutil.h" -#endif #include "pminternal.h" #include "pmwinmm.h" -#include "string.h" +#include <string.h> #include "porttime.h" /* asserts used to verify portMidi code logic is sound; later may want something more graceful */ #include <assert.h> -#define DEBUG 1 #ifdef DEBUG /* this printf stuff really important for debugging client app w/host errors. probably want to do something else besides read/write from/to console @@ -39,9 +43,11 @@ static void CALLBACK winmm_in_callback(HMIDIIN hMidiIn, static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); +#ifdef USE_SYSEX_BUFFERS static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); +#endif extern pm_fns_node pm_winmm_in_dictionary; extern pm_fns_node pm_winmm_out_dictionary; @@ -158,8 +164,8 @@ static void pm_winmm_general_inputs() UINT i; WORD wRtn; midi_num_inputs = midiInGetNumDevs(); - midi_in_caps = pm_alloc(sizeof(MIDIINCAPS) * midi_num_inputs); - + midi_in_caps = (MIDIINCAPS *) pm_alloc(sizeof(MIDIINCAPS) * + midi_num_inputs); if (midi_in_caps == NULL) { /* if you can't open a particular system-level midi interface * (such as winmm), we just consider that system or API to be @@ -575,11 +581,12 @@ static PmError winmm_in_open(PmInternal *midi, void *driverInfo) */ InitializeCriticalSectionAndSpinCount(&m->lock, 4000); /* open device */ - pm_hosterror = midiInOpen(&(m->handle.in), /* input device handle */ - dwDevice, /* device ID */ - (DWORD) winmm_in_callback, /* callback address */ - (DWORD) midi, /* callback instance data */ - CALLBACK_FUNCTION); /* callback is a procedure */ + pm_hosterror = midiInOpen( + &(m->handle.in), /* input device handle */ + dwDevice, /* device ID */ + (DWORD_PTR) winmm_in_callback, /* callback address */ + (DWORD_PTR) midi, /* callback instance data */ + CALLBACK_FUNCTION); /* callback is a procedure */ if (pm_hosterror) goto free_descriptor; if (num_input_buffers < MIN_INPUT_BUFFERS) @@ -668,22 +675,29 @@ static void FAR PASCAL winmm_in_callback( PmInternal *midi = (PmInternal *) dwInstance; midiwinmm_type m = (midiwinmm_type) midi->descriptor; - /* if this callback is reentered with data, we're in trouble. It's hard - * to imagine that Microsoft would allow callbacks to be reentrant -- - * isn't the model that this is like a hardware interrupt? -- but I've - * seen reentrant behavior using a debugger, so it happens. + /* NOTE: we do not just EnterCriticalSection() here because an + * MIM_CLOSE message arrives when the port is closed, but then + * the m->lock has been destroyed. */ - EnterCriticalSection(&m->lock); switch (wMsg) { case MIM_DATA: { + /* if this callback is reentered with data, we're in trouble. + * It's hard to imagine that Microsoft would allow callbacks + * to be reentrant -- isn't the model that this is like a + * hardware interrupt? -- but I've seen reentrant behavior + * using a debugger, so it happens. + */ + long new_driver_time; + EnterCriticalSection(&m->lock); + /* dwParam1 is MIDI data received, packed into DWORD w/ 1st byte of message LOB; dwParam2 is time message received by input device driver, specified in [ms] from when midiInStart called. each message is expanded to include the status byte */ - long new_driver_time = dwParam2; + new_driver_time = dwParam2; if ((dwParam1 & 0x80) == 0) { /* not a status byte -- ignore it. This happened running the @@ -699,13 +713,16 @@ static void FAR PASCAL winmm_in_callback( event.message = dwParam1; pm_read_short(midi, &event); } + LeaveCriticalSection(&m->lock); break; } case MIM_LONGDATA: { MIDIHDR *lpMidiHdr = (MIDIHDR *) dwParam1; - unsigned char *data = lpMidiHdr->lpData; + unsigned char *data = (unsigned char *) lpMidiHdr->lpData; unsigned int processed = 0; int remaining = lpMidiHdr->dwBytesRecorded; + + EnterCriticalSection(&m->lock); /* printf("midi_in_callback -- lpMidiHdr %x, %d bytes, %2x...\n", lpMidiHdr, lpMidiHdr->dwBytesRecorded, *data); */ if (midi->time_proc) @@ -718,56 +735,30 @@ static void FAR PASCAL winmm_in_callback( remaining -= amt; processed += amt; } -#ifdef DELETE_THIS - unsigned int i = 0; - long size = sizeof(MIDIHDR) + lpMidiHdr->dwBufferLength; - - while (i < lpMidiHdr->dwBytesRecorded) { - /* optimization: if message_count == 0, we are on an (output) - * message boundary so we can transfer data directly to the - * queue - */ - PmEvent event; - if (midi->sysex_message_count == 0 && - !midi->flush && - i <= lpMidiHdr->dwBytesRecorded - 4 && - ((event.message = (((long) data[0]) | - (((long) data[1]) << 8) | (((long) data[2]) << 16) | - (((long) data[3]) << 24))) & - 0x80808080) == 0) { /* all data, no status */ - event.timestamp = dwParam2; - if (Pm_Enqueue(midi->queue, &event) == pmBufferOverflow) { - midi->flush = TRUE; - } - i += 4; - data += 4; - /* non-optimized: process one byte at a time. This is used to - * handle any embedded SYSEX or EOX bytes and to finish */ - } else { - pm_read_byte(midi, *data, dwParam2); - data++; - i++; - } - } -#endif + /* when a device is closed, the pending MIM_LONGDATA buffers are returned to this callback with dwBytesRecorded == 0. In this case, we do not want to send them back to the interface (if we do, the interface will not close, and Windows OS may hang). */ if (lpMidiHdr->dwBytesRecorded > 0) { + MMRESULT rslt; lpMidiHdr->dwBytesRecorded = 0; lpMidiHdr->dwFlags = 0; + /* note: no error checking -- can this actually fail? */ - assert(midiInPrepareHeader(hMidiIn, lpMidiHdr, - sizeof(MIDIHDR)) == MMSYSERR_NOERROR); + rslt = midiInPrepareHeader(hMidiIn, lpMidiHdr, sizeof(MIDIHDR)); + assert(rslt == MMSYSERR_NOERROR); /* note: I don't think this can fail except possibly for * MMSYSERR_NOMEM, but the pain of reporting this * unlikely but probably catastrophic error does not seem * worth it. */ - assert(midiInAddBuffer(hMidiIn, lpMidiHdr, - sizeof(MIDIHDR)) == MMSYSERR_NOERROR); + rslt = midiInAddBuffer(hMidiIn, lpMidiHdr, sizeof(MIDIHDR)); + assert(rslt == MMSYSERR_NOERROR); + LeaveCriticalSection(&m->lock); } else { + midiInUnprepareHeader(hMidiIn,lpMidiHdr,sizeof(MIDIHDR)); + LeaveCriticalSection(&m->lock); pm_free(lpMidiHdr); } break; @@ -785,7 +776,6 @@ static void FAR PASCAL winmm_in_callback( default: break; } - LeaveCriticalSection(&m->lock); } /* @@ -874,20 +864,22 @@ static PmError winmm_out_open(PmInternal *midi, void *driverInfo) /* open device */ if (midi->latency == 0) { /* use simple midi out calls */ - pm_hosterror = midiOutOpen((LPHMIDIOUT) & m->handle.out, /* device Handle */ - dwDevice, /* device ID */ - /* note: same callback fn as for StreamOpen: */ - (DWORD) winmm_streamout_callback, /* callback fn */ - (DWORD) midi, /* callback instance data */ - CALLBACK_FUNCTION); /* callback type */ + pm_hosterror = midiOutOpen( + (LPHMIDIOUT) & m->handle.out, /* device Handle */ + dwDevice, /* device ID */ + /* note: same callback fn as for StreamOpen: */ + (DWORD_PTR) winmm_streamout_callback, /* callback fn */ + (DWORD_PTR) midi, /* callback instance data */ + CALLBACK_FUNCTION); /* callback type */ } else { /* use stream-based midi output (schedulable in future) */ - pm_hosterror = midiStreamOpen(&m->handle.stream, /* device Handle */ - (LPUINT) & dwDevice, /* device ID pointer */ - 1, /* reserved, must be 1 */ - (DWORD) winmm_streamout_callback, - (DWORD) midi, /* callback instance data */ - CALLBACK_FUNCTION); + pm_hosterror = midiStreamOpen( + &m->handle.stream, /* device Handle */ + (LPUINT) & dwDevice, /* device ID pointer */ + 1, /* reserved, must be 1 */ + (DWORD_PTR) winmm_streamout_callback, + (DWORD_PTR) midi, /* callback instance data */ + CALLBACK_FUNCTION); } if (pm_hosterror != MMSYSERR_NOERROR) { goto free_descriptor; @@ -1215,7 +1207,7 @@ static PmError winmm_write_byte(PmInternal *midi, unsigned char byte, if (!hdr) { m->hdr = hdr = get_free_output_buffer(midi); assert(hdr); - midi->fill_base = m->hdr->lpData; + midi->fill_base = (unsigned char *) m->hdr->lpData; midi->fill_offset_ptr = &(hdr->dwBytesRecorded); /* when buffer fills, Pm_WriteSysEx will revert to calling * pmwin_write_byte, which expect to have space, so leave @@ -1319,11 +1311,15 @@ static void CALLBACK winmm_out_callback(HMIDIOUT hmo, UINT wMsg, buffers are free, so we need to do something to flag empty buffers if we leave them prepared */ + /* printf("out_callback: hdr %x, wMsg %x, MOM_DONE %x\n", hdr, wMsg, MOM_DONE); - if (wMsg == MOM_DONE) - assert(midiOutUnprepareHeader(m->handle.out, hdr, - sizeof(MIDIHDR)) == MMSYSERR_NOERROR); + */ + if (wMsg == MOM_DONE) { + MMRESULT ret = midiOutUnprepareHeader(m->handle.out, hdr, + sizeof(MIDIHDR)); + assert(ret == MMSYSERR_NOERROR); + } /* notify waiting sender that a buffer is available */ err = SetEvent(m->buffer_signal); assert(err); /* false -> error */ @@ -1345,8 +1341,9 @@ static void CALLBACK winmm_streamout_callback(HMIDIOUT hmo, UINT wMsg, /* printf("streamout_callback: hdr %x, wMsg %x, MOM_DONE %x\n", hdr, wMsg, MOM_DONE); */ if (wMsg == MOM_DONE) { - assert(midiOutUnprepareHeader(m->handle.out, hdr, - sizeof(MIDIHDR)) == MMSYSERR_NOERROR); + MMRESULT ret = midiOutUnprepareHeader(m->handle.out, hdr, + sizeof(MIDIHDR)); + assert(ret == MMSYSERR_NOERROR); } /* signal client in case it is blocked waiting for buffer */ err = SetEvent(m->buffer_signal); diff --git a/pd/portmidi/pm_win/pmwinmm.h b/pd/portmidi/pm_win/pmwinmm.h old mode 100644 new mode 100755 diff --git a/pd/portmidi/pm_win/static.cmake b/pd/portmidi/pm_win/static.cmake new file mode 100644 index 000000000..583b713f0 --- /dev/null +++ b/pd/portmidi/pm_win/static.cmake @@ -0,0 +1,16 @@ +# static.cmake -- change flags to link with static runtime libraries + +if(MSVC) + foreach(flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif(${flag_var} MATCHES "/MD") + endforeach(flag_var) + + message(STATUS + "Note: overriding CMAKE_*_FLAGS_* to use Visual C static multithread library") +endif(MSVC) diff --git a/pd/portmidi/portmidi.sln b/pd/portmidi/portmidi.sln new file mode 100755 index 000000000..d33fe7fa6 --- /dev/null +++ b/pd/portmidi/portmidi.sln @@ -0,0 +1,147 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ALL_BUILD", ".\ALL_BUILD.vcproj", "{E1C2664B-91BB-4D4F-868C-433164F81101}" + ProjectSection(ProjectDependencies) = postProject + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + {41D78CBF-B04B-4561-BA4A-AC238C40633D} = {41D78CBF-B04B-4561-BA4A-AC238C40633D} + {9B448D22-EC7E-4BD8-A552-B268D843CC3C} = {9B448D22-EC7E-4BD8-A552-B268D843CC3C} + {EED7440D-04E3-4948-92DB-C85B4ADB1D82} = {EED7440D-04E3-4948-92DB-C85B4ADB1D82} + {80193DD1-2C02-4A4C-BDF8-49623AD6F556} = {80193DD1-2C02-4A4C-BDF8-49623AD6F556} + {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF} = {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF} + {87B548BD-F5CE-4D1F-9181-390966AC5855} = {87B548BD-F5CE-4D1F-9181-390966AC5855} + {7283FAD1-7415-4061-A19A-FF5C7BCE9306} = {7283FAD1-7415-4061-A19A-FF5C7BCE9306} + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1} = {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1} + {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD} = {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD} + {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A} = {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZERO_CHECK", ".\ZERO_CHECK.vcproj", "{28779535-7541-4FF5-AC12-FAFD66E894EC}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "latency", "pm_test\latency.vcproj", "{41D78CBF-B04B-4561-BA4A-AC238C40633D}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midiclock", "pm_test\midiclock.vcproj", "{9B448D22-EC7E-4BD8-A552-B268D843CC3C}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midithread", "pm_test\midithread.vcproj", "{EED7440D-04E3-4948-92DB-C85B4ADB1D82}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "midithru", "pm_test\midithru.vcproj", "{80193DD1-2C02-4A4C-BDF8-49623AD6F556}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mm", "pm_test\mm.vcproj", "{EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pmjni", "pm_common\pmjni.vcproj", "{87B548BD-F5CE-4D1F-9181-390966AC5855}" + ProjectSection(ProjectDependencies) = postProject + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portmidi-dynamic", "pm_dylib\portmidi-dynamic.vcproj", "{7283FAD1-7415-4061-A19A-FF5C7BCE9306}" + ProjectSection(ProjectDependencies) = postProject + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portmidi-static", "pm_common\portmidi-static.vcproj", "{2985D5DA-D91E-44E0-924B-E612B6AA33F6}" + ProjectSection(ProjectDependencies) = postProject + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtest", "pm_test\qtest.vcproj", "{2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sysex", "pm_test\sysex.vcproj", "{71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "pm_test\test.vcproj", "{0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}" + ProjectSection(ProjectDependencies) = postProject + {2985D5DA-D91E-44E0-924B-E612B6AA33F6} = {2985D5DA-D91E-44E0-924B-E612B6AA33F6} + {28779535-7541-4FF5-AC12-FAFD66E894EC} = {28779535-7541-4FF5-AC12-FAFD66E894EC} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E1C2664B-91BB-4D4F-868C-433164F81101}.Debug|Win32.ActiveCfg = Debug|Win32 + {E1C2664B-91BB-4D4F-868C-433164F81101}.Release|Win32.ActiveCfg = Release|Win32 + {28779535-7541-4FF5-AC12-FAFD66E894EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {28779535-7541-4FF5-AC12-FAFD66E894EC}.Debug|Win32.Build.0 = Debug|Win32 + {28779535-7541-4FF5-AC12-FAFD66E894EC}.Release|Win32.ActiveCfg = Release|Win32 + {28779535-7541-4FF5-AC12-FAFD66E894EC}.Release|Win32.Build.0 = Release|Win32 + {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Debug|Win32.ActiveCfg = Debug|Win32 + {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Debug|Win32.Build.0 = Debug|Win32 + {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Release|Win32.ActiveCfg = Release|Win32 + {41D78CBF-B04B-4561-BA4A-AC238C40633D}.Release|Win32.Build.0 = Release|Win32 + {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Debug|Win32.Build.0 = Debug|Win32 + {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Release|Win32.ActiveCfg = Release|Win32 + {9B448D22-EC7E-4BD8-A552-B268D843CC3C}.Release|Win32.Build.0 = Release|Win32 + {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Debug|Win32.ActiveCfg = Debug|Win32 + {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Debug|Win32.Build.0 = Debug|Win32 + {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Release|Win32.ActiveCfg = Release|Win32 + {EED7440D-04E3-4948-92DB-C85B4ADB1D82}.Release|Win32.Build.0 = Release|Win32 + {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Debug|Win32.ActiveCfg = Debug|Win32 + {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Debug|Win32.Build.0 = Debug|Win32 + {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Release|Win32.ActiveCfg = Release|Win32 + {80193DD1-2C02-4A4C-BDF8-49623AD6F556}.Release|Win32.Build.0 = Release|Win32 + {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Debug|Win32.Build.0 = Debug|Win32 + {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Release|Win32.ActiveCfg = Release|Win32 + {EAADABB5-83D6-4669-98F8-6CDBE6AFD2BF}.Release|Win32.Build.0 = Release|Win32 + {87B548BD-F5CE-4D1F-9181-390966AC5855}.Debug|Win32.ActiveCfg = Debug|Win32 + {87B548BD-F5CE-4D1F-9181-390966AC5855}.Debug|Win32.Build.0 = Debug|Win32 + {87B548BD-F5CE-4D1F-9181-390966AC5855}.Release|Win32.ActiveCfg = Release|Win32 + {87B548BD-F5CE-4D1F-9181-390966AC5855}.Release|Win32.Build.0 = Release|Win32 + {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Debug|Win32.ActiveCfg = Debug|Win32 + {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Debug|Win32.Build.0 = Debug|Win32 + {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Release|Win32.ActiveCfg = Release|Win32 + {7283FAD1-7415-4061-A19A-FF5C7BCE9306}.Release|Win32.Build.0 = Release|Win32 + {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Debug|Win32.ActiveCfg = Debug|Win32 + {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Debug|Win32.Build.0 = Debug|Win32 + {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Release|Win32.ActiveCfg = Release|Win32 + {2985D5DA-D91E-44E0-924B-E612B6AA33F6}.Release|Win32.Build.0 = Release|Win32 + {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Debug|Win32.ActiveCfg = Debug|Win32 + {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Debug|Win32.Build.0 = Debug|Win32 + {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Release|Win32.ActiveCfg = Release|Win32 + {2204E68C-5C1F-440E-8CE6-7E273D4F6AD1}.Release|Win32.Build.0 = Release|Win32 + {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Debug|Win32.Build.0 = Debug|Win32 + {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Release|Win32.ActiveCfg = Release|Win32 + {71B9BC6E-7B40-4FBC-BC7F-4372AF03D0FD}.Release|Win32.Build.0 = Release|Win32 + {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Debug|Win32.ActiveCfg = Debug|Win32 + {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Debug|Win32.Build.0 = Debug|Win32 + {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Release|Win32.ActiveCfg = Release|Win32 + {0BEACB8B-4058-41A4-A9DE-1B1FB650B21A}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/pd/portmidi/portmidi_cdt.zip b/pd/portmidi/portmidi_cdt.zip new file mode 100644 index 0000000000000000000000000000000000000000..eaa2d7970cb8700ffb3b5579f128cbda2108a82c GIT binary patch literal 210271 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⁣a5xYO>(3%Bij!x) zJg#xH=((rki6;R}+K7UPNCn6C>^`3f0#l<}ZWieP?`DBQwz_{yq&nE`duqGbMtiC) z8<y8e=b4gJ5)rqAxN<sa03+27Cra=Twk8(EzkGLO*I2EelyYOmbo=X#9g99KqmiE@ zz1uFA8xH)0cDa<HJD=$d2}+~LBs<hY%9P5&?Q}$iI&m#Ht`mPboxZv2Y&5yKi`RL) z&E2H~P}WLdsHkGVu)7IicQVzZ)g{7+=vqXF+aJJ4)uF2(cnDh&YdyrF=6nbl4FBlb z&HZBa-p-fYNgY^+Y$$c~<A=42sRG?3_hf_UcM)Pt-OfUMRVFfE0?~_*3M)`y0_{f@ zL`F60*l~>(8fQ{&R-IP1>hU?NKA*E<8;ka5SZdnF@?3d_8xq<Hdl<rp_>~tTeQ*nm zPZ!IzyW0P3DbM;y=myNs9VVk!F1Pg-m)C|x;XppUe|*^TC{_GMeX1!@XDRB07Z|`8 z!N3a$cnDh)OE2)(52F*Q6)Zv6#@%%RJsu!-0G`73)e5!z!Yq)z7EANXI&GGin1+b~ zlUR_KQX^Pn`ztmFuO{xGw)ChuXx(WJ5W+!IwTl>~h=KOq;TqvW)dK6H>VW#??Wc>Y z+?-79|Ag6CX68qY9VS*C3adK*p|Y$Z6ILF5m-3W+28|t`jz4|=o7a{sJS<kr?>~P3 z^adn0Hc$Laq9q-ue<L-FH+-s+pO)bUq-k+PeOLn^B*+x^IHg}2^Vz|ekg&KlPlnl% zVaW#$OjH<Xleow)&PC*rs_^ml9)1J9Ka4@3ug{M<Za5|vpnnvqzWJzA=VeK$_X4rw zzCi8qUyj`Cz`*&ahkTgh_Bt_e2E7=#gKiAmjvpg^z>$GzE3<X1nS!7;V@^pSTy4gT zn)#2`k6-5zN9RF;8Aby_*35gnxqWo6dF{M$_<QM`Y!G06e?Pxuad>Ar84xdw0kW9o z<Rd3USuc9cq!2UVz#q@2^dd_lgTa+8z7c-qHzwSCEV~9*_8DB+Yj9=1!IgssS3YBI z<)FEh&zf8Lthto~=2kvuZsmZvm4oJ14w+jyXl`Y{xs}hETRCKI<*>Pxz2*kaDfTau z9BNgzTtpG}x-o5DeEu#}AUkU^Oh&WrHO5+uv7uR8H`$A<G9uyk-%ii3W~cAY?ds8` zIQ}Zfg!69qVTY#}wH>ZVu={Rz44Ul2=DV@2L?j!TbXS;l_W=q4pdkwK_`Q493=d2R zsuYyJ+HtYM>4)WBCjaawN5>aJ;bkno!Ykz`5slYeH~C7EuPKD_z2S5+y&RqV+lSee ze<ck(KM`NdSzlqAvzVt3)Pi`rUO%}PpEmo}2Kz#R?JN)0)Sd<{yy3MtMuP*pYccAK zN!gd%mi8F$(c13mk6cKbd+m0t#C`;9+~YF$8}$`xRdU-pFNLe?grh|c4B+mb)-lgy zp;Rcq)oK$`tmKKiRIR9k+8d;t?dgZ)fcOJG#D2NOUblO@z%lX_RAVevn%nymu&`<Y zhEBI9aPX{3dwIpZyJLdafW$jf9M8XAn{q4Vxxo~?$BRE1f45o<b)IR@d%Ie$Z<AY) zyo@E5%KX2LU(ULpZdcZ)$O9mj?nFj17xPEnuL5#zB05(`z$sM3L2o1sEz;u3S)mz` z^7!EqcZ+~nOP;b0I<x!p7yO`+eDOvmBK-RwV9~y~PUbKVyVagb#6S|8LV2}yRMxl; z4ScL{@ib9%8XNtF&jEJH;svpv>@zsuNu|J_<14(uDs$1))z$PdrlURh)YtR<l4Q*q zwc8vcOS2q9yRtWsBZ_ud8f85pz_#4l&bHN$I4xPYR8#0l0)qpG(2oS`sjzpAx}rOZ zw0QpX*isw2n!`8S<$pZ6dwoNXBVV2#pV`sC*N4y*H7YRTP7kYso^!UmUEvA(z$pzg z+uNI=TdZ2-Xvc+MKv|ok0;i<5<{NjC1_}$zTDO=jrRB;G8Ss?E+4N*Q5*On;P&sFo z@EY*^*(`z*Op_DS@=Vtf!o^K8Dx+s=ZD`7z>GgUc#~AiPw9MEG!7hiq5G=Fnh05w+ zM@@0?LXG~z3%%S6nXK;dLRDdUyiirDelLVUXs;KlYTflh7?`%b5UmQX26ol;LV2O; z0XM`wa<LyGr!oVMDA!qiu%PnQo+#Hk8*oL;pi=$5C@(WT;Ec+`3^=3G)I-k5WZ8f- zGKCs&M#ku2XJi`lj5DfK-Ev0P;!KP<6D++Yyh?Z&vI;20G{j&udvbadjxsuOo?+*g zzTF+&zwrd#P2fnYuOJrT8O_X*SNl6S4erl@Z)%KXedQTZUP%ONu#Dth0GYr<(m+@o zB&1mOdWh*Ucm0Fr@8DY8h?|K{Zts4#TjRMiMH@I7VfY40y3yf-xoz60ZqM<RbN4Ma z0aghGp_B!sM5Ux$O)i!(iDPN5SsL@Q(iBCvG^BS+<2f%X%{Aq%D6e5@Vs1@t6H4PJ zM&mQC!{xA{74u?2HtoGt$lHCi_aCvUbGO$mqASu1WC#Q^w7VrH?xYGc*4W3kyx+cI zn%;*$?$^glJn-*bJNJKXF6Xzar{sm%rN6Ri^Q-KLl_?B3-<HeAHm3<C3DQvVl9Fqb zsKYnpSD|E@C5sAGW5K0csO@5X^x&tCy5xK5uBecoC541u1vcVAD)*^E?ntDDBGn>t zV9BB&50DY$F;`QfRGdJ{EJ70a@c8}o@`OAcf0#1M_J<dzV{%OVS({ZwAAR}cb`6O} zRgKyD@+{9=%lDR`NGO!2r~olqC;`(LP)@#+Km$4efIxr0`4K3L%^-hDMlE9{F6I<e zasee1GiifV0MS}(H0NmIV-a#3sxbow^TgxNk<ENRS?>1jc;Ame3PHZb0S5a4t%VEc zBp)8z)7bB`?Lt6B>C=xWwFbr=3Io;a2q8T5Jd5qoZx}g&TR=_hN>(3sHj+t3=u7Oi zfws4b$dw}5j%!E{uQ)Ak5^^CkfuLLJUQ_pOoZsP=<Z=mxC%GomcSn~WX75==J}|t# zneBh9m#v7^`UXX1IW5Uk-{a^X<HBA#rpoMVX73_=DU(KrYvKZIlHzn8a5fP<?r~05 zFg$0s39sO1IwTLvO<-k!(RTgSb`ZgCAv(PrAJdSvK|Adl^6Kl+_G$MuRJqrX2Nf9f z`!%Kh)F}%6170(E9$FKMPLCf=j%UZ%=_at!-&J0K^KNwZ!G>6`j^C4;gB$Dt;jG!k z=y=QlP3g~r)a%7=W?$i+^ZXb)P)m=ed9)3{L(gio&=~gil0hk+!LcwH?DoLvhQxD& zkho(eA#ttwRVO5_Yl@qO#LJu#yE7A;=oCCArz*p-!nSg#J{nkwK~_IT6N8}^(W$<# zsc)Q1um2b7yYl+hx#{Tpn!2p0OAG`1F*Px07evSH`tXq`9WRBLEbD94$Fo$aqO}U@ z)K!KNOE+zi$Iy4-@r`G2ia3lZ`9&<Zor;L(f<w5tqWBtZ^kqH?ol|^&B0Hw!c>4`W z95Aq>icej!mr74t4U5du(&ys2ji18};Z;yh;;hf6=Tm${rPTl5DkX@@(lsm{28=_n ziUYAK4@&Se<_r5ytJNA$&j5o1PLE48*0A;FaoO5=14^_zCpVxl2omkOiF2Sh1;v5$ z>qBTF;QEN|g_;1RZxj^EgXiNP=WBYuctPtC??1S!npV;7P$R61`5L!4c{`};WD5@q z6Xt)1yeS;($KBC)e$nCAte6@VLu3z71)x(|mtO>a+qm1hs4=DN^;Wj5ZFlwSqb2x4 z@OqNS5|ivpW{*ZW05SxjDGHo*Ha@3}ew*R?;c?R)Pde%$>{NQ)8x4AUq{*wweA*PD zp$M+Mv{+5pCW@*cXp*25QK_DT{7u1WdsoNHP0%q*^M-=)cvYn2C|}KdF;edVlmuX~ z?x7TMJeizc%*GVZKUe(HDLCYj6qs4f%$%`y*`j5YVQ@~M#ko-^;szE8KprR52T&oY zP?+gkTM*ES0c+l%;j&Fr-*CAdPGdqe#~px6!%03vN~0+aYN5p{$%6g`M3FxoPd=QC zkFAni0V)17^>DmiJ$5Uin-p`enLG422xG<MSrF1!%;~x9I%gJ{e39pI!p{L!NLo6U z^C>J2v;tezZr<AWyw*Sbz%ukKH#7G}9-BIQmz!(Gk3;uzV|S6btvBMs*~Q$*vOcke zLZbWa!*9!v^X+OLeV~!yXnP-Lr;*=e>24)(vvwhu$kU#~U9UET8f5tCeJoq0(9ih- zQyZGv2oof?Gh{@4lo&Ox@1p%tbZ~dcMk>(8yM<j(x?je(>wyuk;_$$OBoieKa|ZQv zKexAN#LvT6;)jjhy^2zjUW4u~>HTdveG0Wu8PMI<l-V*+YYnQ!*@MUnoJ}OFQD8Z1 zPI)TxnR6A3RG;<5%Ekvqn_E~+VCFvmxASPrgC%yaWZ>vYm2Top?Xz;Y(H(E-r_7p6 zOacg-q&SrYTwKF48N-RNU8DY};s0z6W0B8SW{G>?sA$#${f^36nGv%f6JZ>}CLLT! zoJ<WqT_r8nzX#H&<@(O9GQNF~8L-09a=Z~}Iqvi)r1qb*Z%#ACpXqL}4(>jH7Yf@c znnuB3ErUZ<c1D;j^NZw4u}oOFO^f6rS3>40Ub60qOg6U<+tXVSw>`S0v{()G_~WNF zV+vdg^$fe>hsXNG^Z8{?#6BWLQq>JrjW|_@A5MTEW*m@{KBx*%)>_gEi^AW&nAVy? zjJzsLx7L!ov<z>pb7<`QU@g!#(P&Vkor-fdp!zG$6;yXC&WUW&iX+F=0~LqYx3f+y z@dCx(T5>F-(^_JKDA*tn81CU4@-dVra?%H_1N1N)y7I$UhhuOu)EUly^-sT1gEF9_ z_P)KL#5h@0A_g>+35C+MGQ7_HQ#1!bI1$3{XmXsp03c)k_2b2|XZB+0;`_OUQ>ch5 zwD3j?t2?U!nE`bAeosy2vgiPWh16v>tI>Z&t9>j63#?gSRDa4X$;D8YxJegS1z@M@ zBb~YVUTI!3Uus2G8j}Q8s0RjCf(AS;rZrUj8<y7(7nDwnCn`+C!XVVriz#VVC7c)0 zq3HH7?DWK*yPHVSOEoY9;Ie13z`NMS)({H3!VAjDRmn+?l(3+LilyjcSo?@O2XrXK zY&_xk{~ar_H2qUCcgy;(8}12bMN;CZ9*OdoQ=n)VR`+B{F)NCRo@5wT6W4^|1be)) zA4w5RhLvfn`ml|-y>$w&D0U{4e90mz%bnlQ)Lw{pvpUY`P)nBVzCZb%p1-45UVKC6 z!zggfQ{*A?OH`;S2c3QhgBbtV@@tk-SMRp=g6`E~$NGvI&v)!(15u&*fchh*a$VKt zxL<yk&ew#p22ULXWx42K5aaEK7(&nk5!}LF6I%}^7a$EGp_g(k!iJRJi}I=rZS@t( zL*bZ;<WsRWE7WF}ugFJ@5@~_6tIO$M#`b~N^a~xQ_#ChdNk<9B028Owi>N{pv6c>Q zphD>UH5Qim2U=GgYNv6fJ_6PSH3u;$XG1yRt5bFzP8sJx$-zzY${LV)-BRy@+NQgl z#w(^$ClS#Ymke1^sDeVNAj+k^+vK2J1aI|gEbukT-Tl7yF%yuD;-;EZ>#p5W>lBbh zpoK9CobnC%XtN&4!oE8>b+0srLnun(z@6guskkLzL#v3=qy#h!#DDt`4Q->zgN(s8 zPS5S#E?0*dk!L6V^EJ}3Y*{>s^Q3^Z6Ksd<184%!eG_Vt7o*ej7--^@diYgHhzgjT zo{z7lEIlizXY|q@xS%BRF%xf?IBKHJE$|!z{()K`&ce>7A1!SBi9i)6)59-9LM+4C zX!aLuFY<JM%|`u-I{aU=zX)UNWOot3-R(s{CuCDYP@H0f>^xogBPJCp2o@iOtm6@X zOy{t_O>SC4|Cqtye@YK?pI{L*nUW?0FV<ljvf;!8NZXp8oWA{hJ-xK|7TOJxGufsG z&`{Tinq)Qd6dy;(?N=-Ya-d`lC1YC{#^!8bc^*m;+}!l-+u1l8-~*?I8#}i@Crv(0 ziCGuS8g6F*qzQr(^Ki;{F?n}rz&RpwI(tO}o?DsG5Pbqw_X<XCHAPi??=-&99MS50 zYmZ2}1}R3>S%0G~b2Z#((csuN()Pwi8@IPkqh*upHrkrQm4s|`r_nYhZM0}@6fA9Q zlq_j%-A2n}R1~hoDcQ_Z24_jZ4rnnoEe6xUl*_h(JKKn(JxwQ{PcBE-Vo`|QzsjH% z?D0Z}Fb4&xsdU!>_be;4lQ~{L-yORCniJn3my|)V;ULuA!`I}a%@ElxV{TYV^Xj4c zV;Vr2gM!qmo>H2Iy&+549lFPou^g;Pgot|)tj!_|C2iHF8%#(!i~Jub=X15mii7aX zOav<w1w$2e`33n{kRVckN8`VpjxPx<<D_~KCL|V;csD&Kw~D{-vg`C?rhYXgq#2YT zV06|^rZtk&d7MZuLWLyKDh$S|i+`XJ2aI*N5`%qdwj{(qdl9T1#6XE{EAjxY;^YP} zbx1I-%mcrP)93+|SvLVz)&Z2qsSKi2J1Levh7@r^1DK%2R@+S4XIZ{>R=c@)SpR5O zZro<+aU2TwiR>8ghS%vf=ellLLegYQwz9HhNxPVe7@SojnqXg3#5Qqyy%3Xy<oXmB zT7`LaM>U|j-D^}AJbo0i>`2Ix(2@*V{}8Gm3SN=;wr&pSGEQ>{WC&_Gl_($zCbkB? zMuGpNfat<Ujd$&-;GA(%FI?YtLuEKkWb`yH77I@k!`&$Tn2I)rEujJ32454bh7$~! zA|yzSUyf&|e~We?g6q#(zhnpEqO(y8ww5N${Am_=O?e1p2*Tuz@F4Eh^m2T1Oi^ou z26{xjT(0Ntt(oKiOPmHXWK}Q{nF4Co17eYcQljaH^Ap)I28@q4y>#cE4e1>}Y&UXF z(5UD^(KvBRQcx1i%X$EsfH1y1#42aUR?#0%$JZBAw?bk6Q0AdyFW>EAWvoCKSJ^y} zB$JMSaRmY;28G40UI8d}MX@oQd=6O?iIpOL!%wd5y72Tm{-DX?q@Tg%Az|uER;uFj z1VAd-+zXBqpwMY5%#T&c$lef66BlY!LWL*xgR61(0~06w46X_Zw+lQy`nQ8QH}zm) zr#Js@&sz5vn5i%?HZg_(yBN)QqDDM1phE%LU==4gfGI+P?E<#EotEh0OT1kuUPyyk zmCOo`Z2)8lf@33`l3m$@tJu>ZXXC*i)V_W33-9l7<76abH#G{-Pyi@x2$r)V5O)e6 z1UX%Mgf)qfd0%_zE`_H89{mN0FjH0*BTij}CIStC*hD6RO`O~SrV0s0rR(0d1<25O z6O?dt`|nS?JvIjVOQfQUzIs!o1Pvu%g$yAT>qO<D@Nu2kqcx{jw%0nbP7{s_SoPYq z<d=obLmUlbC4eGIU8lh|K3Yl?W9HrXSW)Y4e9YBmZ+whFyqknvXWfuoIGMJ>rVTsb z+mNn(o{kjVLPJySYL`_~uu5oRLqJU+440pTx;t|Z5nR5VjNZ*yai+gT@%j9u!FQ5j z#x!sQX$Da>QB4rf#NwS^jqS>h{Y#`PvH|IqXRG~ki<gbk`{&c7BySh^VVab%3sMAO zy`AtNV07T<bUdSw{)zOLcy(_PVFcS9)^c1kKO9WpX`^U-(<cl|P_hK<9)^I1z$z3~ z$3;E;G@g895o_+}>4y7p$Ii=kCPDI$HU()Y2s~34py`lw9wdz&Qaa28bZC8I_q%_3 zY|lY(SfA)gi~<xC0L^b0r-?)B;}`w|4g({&iIW{fRUy%yGEXnx9m-rkvnFHjG+b@E zYck!$m~F#sQ7ePEl9hu!Zv3KE<`!JV$qu55kSLSF`NbAS$0-eg%8*c`yv~9g5dNmk zmoCUbcb&ADE$fVX(FTDvfpCcO2_?O{w0-pZu(qWQykYjo;`G02aXKDJ)LCaF5w2Kn zRSqv;XaB;Dd0m7e0-X!7t;+VjI_q1%HXik|>i%y%sETc{)Lru}tB(27qC&+5MYCq; zCa@!L2xJHf9i~JRM@QBv9`*)moEY!6QlEbSGuej8!jE+U6+J9Ma{+3RN8@*==P^>n zN%aAWkQ5RapP$5B9e>_sm+g;_C)3&Z?ddz*Z0s2(PM{xBwG(+eai{cKGS+b-{g9@e z$o1(-i(hAP5`BRDkO0SvZhrdioPbo5T||*2G5Uxoo@cf++2JONw7bS9htMQJEnN<x zVs)~A<DTcpBJ07)Jp<R#7{8MUGo#vTh%|s|sC?|0BR)*T-EDnDsyMwqKygUwF!P83 zI!>V%QFfAW!D_bwG)9>?onctjN$hfZp~$V{M7r#z^YNjFIAl_0S)9ysz&s=vhbF9* zz(@h<YPgFDN~TX39ZkmeR!Q;`9d`ji#oh*8JK>u;9)KxkeZTKKlXSoLPo>27xaP)l zlIs}?<;jFv5_%6yI)Cut!T2FoVC@Twm&?V&_HdUxKe(80=lAZW|KtfUYyAiDSw7S{ z%3&4IW!Ge52uI+gi_Eit^o{lWeMeV$jv-$5g8K!B1_6%o))i0a7zuz8?_1^=u5agZ zsX*mht5L_k@%r4gJNC`{`Q~;lSVxv8RC#1A(ESCs8{0E4wksTp2vy0kU5Cehzk7(k z)ZD4;FBj&F4nqJx)jM0Q*DF?ZnD5E9VN6`z{ju|XXVlo?apZV2eYBU<Pe?QzSg<bR z`c_ikIS!fjLJC4OjVC{}A{#5U*96isN;jz3b{_cM-oAa>EcR(rvGj|%o44Rw)3Y51 zYNyRJGs;Dq$C>CZyCxepPvE4BR2h-M<~t=*uzB?YlSh%l8nn?t_uYJ{dqv%MAq62p z_p(3gy*({qds*k^C?a+xJiyI(V}Il6J&M)F$q&h*gqUf?OrftHKurKt>!Fa!Ic{5s zOZ(=oNQLNFY4-QsQ|0^n(QXk=k6Vf-o-AXk(VlwhE)U(z*AwfEad?SKZs3l;ce(JF zlF#3l?jTfrh&?wVgLS|iUL&ILxH=~$o{HDE=OGtW8WG%vFZR|PZb!RETL+(_$x0vp zb11h+f@iLsEI3*2eOztnlX;tLGLZdc+igw_&e3)`|1G9h2K4BhJ-j7|;hg;~8I8|& zw%<N2emfkr*O|{ZIR#Iq&$@jIU(54`ky(fdG16Hg(%HjT<YOL6<fIR(12nP0Yucc{ zyW$TUe3cF23^|N2H?+c-VQMgFhb>;M!J{RT10w>5wixWB-xjsf{kB-BXKYbteYU9U z#1^k<K!yh7I+7lKMLxDl5jp9DHV5c0U+hfmWRwh^bcPV#?YFd#3|&j;Nj8V4rD%g2 zd+H{9NYmRcFvbF{s9<t(n6D*(i0A^;lq85q;jmf5Y;Ua<dMw{zIeNOY2TX-pq#cUI zcpHo|Wp-?x2p}iCl0584Bx;hvssKX+e|LQG#qLS@Fu9rq!D|S<hMjQy9bMpUEr*9* zwLD=cjO}eG7CN({b&vPSch4&`;VCE`yyN+HxxaYW5dp;uYdzoXm{o2>h<EEBk6%Gn zRcPQFQjswm_{MsKx2rv=;WR~5bZVyz^@*#$`VjP`Wf9a|r<$a%EcGiisj2}@_G$2S znp4%kOml3kWl6ngYA!_>A`ng^_RBlFd+)t(`7`RxuRi^Hk5``T&ZbYTYZMOj&!iX1 zGamOSNWA(13$%YM_jtKppKcbP@TNqV0tWhL(zW)(<XAM8qG2guAw3Ag5wOWaIlYBk zAG=G_Im9%$XYt!&^6(9n5#HE3R8S6!_p->x%!FfEyy}<mG<jH+B5IPtOn^Z;6vf61 zC|)Hu_+NcpwcfS3TaOlt<vRARlzH~_=q~75-nRGgUE01i*~YgO5_0NpbVLcGRYb~0 z(OC)DkC-qk>L20L0Go7hD&SE5zu3D&PtWbWil^*es>02{zM&g$g)zR(?5ucm+m2wY z{$fWgqkG@YWbv~AQOe9)GjCj+(E}(6fHx=f%UiondP4CkXFzw``Jye|-{-iO6Q)e- z!FNo%X4;ia(Vjq7Ot8UvB5sl=GQLZmq;Q*jfVJ<FCyhHck%iB@X65)t&|(f<FWx>2 zm@jsVDfX3jCPOvuTFKSJK0FH)JcOlP*^RVkOY2=1VrB(u#0^~>`>hQWI2RkPWCGRS zkz+R<-YmDgDaWzxXeV?0yWMQLK5UFC!t#S>a@0|92?F#T#!l-8d!_1Xhl=6iR?2?b z2$vVUb7&`zG-Qlfc;5JI_8(94Ewc;<!#ED-2ZoZIEMt0|QG|&dCBB<KGM&0mLALqh zm?M31jVAX~!fBZQcHyq-u?{+nqZ%1UJ-7k-B9@Pby@VCZ$n#$0wdCZxSztcx&Q_b% z{nP!0jaVM|B@6PnpFQ39KvU?3OF(M$4Q&VyG!mqA9f2N~+rE^FTy;U+w2I0IZ0B!Z zdwAMM_RBYd+5o=gM6Kv5)DVXGI~$~1`cyK$7Ssi#sg%K99{rd<yfMSag93N4Z1GGm z9o#FFFpHq|aJN?AF^1D^*7O5(jd*)(7*-Mn2gwg6&wNpZFZ$dH$82>Cw_;xGR*ZKm zb=Gk!Wv-rcE2YW?-3r}D*RAO6S+`QDez!u`G3-_fGvro+A&e6D(eG9YHQ-i^e$K5l zrq`{&bqu=|lMTC-x*l>X@EpT#rBu(mm0JJItylwkfm^Aw7q}IzU*cADR{zAURO+X0 zg<fOWtrX@3ZpGC7ZiTL6*sT=m8Mk8euv_6!quZ?6`Z;98s@5Q^;rIlLnc;)UGhe9i zg$n_UW_E|6UADdaGP|;m0CPrzOQFq%y5!4(+;SO>)ix75G=8!hAx=-ilY)K>*GZca zXi5MFI0!2VgU93tUwD>hL{TxU%)ZC3cKv9LXoHgqFLdp<?T5ymRwx*8@eNpvt4PCr zyhUTy(P6S65C!LW6_-SJxZ&M=gcXRJ#6Zu_128JJbNe8wf3(y^@lP%FHN`C`u41WU zt|k|AJmMx@pdrxD^03j;Up#a&o*iGFUfA7z)Pb-0P3PHXt{1i^Jn@EMDrtpvG<I0L zF?oS4U%Y^icP20F3j-0Y&V)Amy1LtwSUVz~9*Cfg3Dg*zXUNPwOAx^D^`y4I3i;uo z^%$+{KyJYc1Nvg|bRWaD4&-)m@=^s(B0tQ4yi{6K2UbV63NoB5ANOBlat#?~`{ib_ zTE~pWi}3W_M;v#pi+NX*`44#$l4M+j%|+b!N?u#nK!=+c7$UNakE`A4X1$DArSYtj z`F;C>h+yr#W=NB*X|ibV&mr0Nai4kkX7cPuc^*Cr3$J$H$N1uu2a}9kc5=^iW`5)2 z_<MV0;|B?J3183Nx^gyUH1&-VXZ{8AM}zG{Xd*)6&iU|<J75++V-Kd^$-3@&$A0bJ zv6n@K^f`O*LdYg?!x_OOGYVIUaJXk<08<l#Ffh@R0l3Nn+=B23Rba)>Or4LfJ7ECh z52C0))}vmv9`!$JO>|?67J8zv%XH%>a2&TI%H!#X_qOL4+;ifpQr@*CN6U=0ZGE&) zHf9{u>4#`S(3%OJ44_RwcWs`76;(N#|6?D(>ummi<Qi;h`?T?3`@z14ZC~pl+vicW zwiVJ;YnrO-r~4u7pm9-808jeSMIO*y+aG_T$1fCK1hw*B-M{f^!uqYWP=^f>*nMx{ zR0@TV0~~33%(h^*sxRAXW~=>9y*OXY<4jif<m<@&`G(?_%vbxN`FJwAyc~UIe*Q}3 z$N48LUB`|5asD~bLL;}pct9e!1F12dbouV6HQ2QRGG_`_Q83rVr_7p6^zDRAQk>3+ z<3_L#XVIeyfM6e3X<qlJ!p|R2`13DuW|YTT4Rf{9_8|%)G)e|+Dm$$~m$>O&zwT*) zm%Jj-lAgAr4P`4SeTt}vsDt!nD*d4m=>~gr>wmWH9RmR>au7Z5R?DIJl^F$ZShOyN zo}pBsa2>NcG}RK<Md|vVUpb+8WZ{hm)>}&!imoX-qBH%Nk{E;H0quRl|7Gu6o7={* zZTknE4<rbJWX~trRyw{-KaTC#o%<!F$a10^TXM;AJDFd9!G*mb5Ck2klgyl%IaR50 zguMXl7ajyQfD?Nq>#IK~7w)V19Bs~h;qTp!qhw?8HH$~z8xh$>8+6eEL+lqq;`iU2 zUGhW2puwuAL0tFz{^oOkabSiNWQs4q6P~~=J~V=ggeg;yDKypufLg^KH=*PjcL6a{ z$Po>`=;rUko$TwKAXJ^@T2AbeNuHdH$|WBa`9L2y0;&l@mr3|LXNdM>!tc&1gMGn~ zqILO;w%z5D;wv@|+}k}QE0PP;4qy~_(PP4$ZvJq0<D)Nn3<ZR@A#b4c<1d6gD$&vz zfzf|sJfOTCyfr@HlX9`q;KH9#lpzXHC&aho8ET)weR5CUPVHTiljG@Ny{u~R-TlAo zW&c6zWv92Z)k_x4=9`PnZ1r$I+wkalkp(ZhCcKKhMV-+BySHhc1G3#CV!~%>pUqSF zJhlt4QRw!WfH%j%wJ^rrGQW4bSY4moi%6aLNTCDsmA>=!<7U3F5AZ!~XR9srFH|T2 z2|QF0J__5bn5?lq<M#L@!VrPBOl+G5*B)#oJ;0*V<#d17dg}%YN7sMSe!ZdL&tvOP zpBF)EMe1c2Tl3&LwkGQhY<c-N&b?(m5L8P2H{NEQaZ>>H)(v`VLfa%(d+cy7ba2V3 zUW2Ks>0ZH_t{(5~jOfPBh^8_;ml-;(GQ+gTt`jUj*zRk-U2jB6ZVZ+crf^XmWW|sb z+-f)istCdqmGE{H-*|jVKAG)R86Iv?WAb4wR8{r3e4wV~lNnlt%_FId@(n?XAlQ!Z zb`-C7_+M~0Pi{ymvF@371GOEZ><#}mC*^f>na|-D;g{a0Af9fPV*bmW!9thHM4p)I z`qEumgHcKvF%$D#b{{<#<gg<1-ACepT9b+?4{_}Pm}ef?%}MO-M2Gg;l1^qk11lou zZsK{l=<Y|%5gJL!U7BKAp>~M{6B%?eD4tBvaCvTJ8ATOD;ro#Ic05DrGla73F7&Ig za$mo>x7+&d;%3_u%*KT-HfLNbqihtzm&Ceg4lK(j5j7Do39)SwtTGSode6i2ZcusW zt{$2Q^D0NX)BQ;`j^_2A=LF-bG(y@%JQuaxca4uOJMZ4|0rB7wLzZ}Wz$}P~Kpr9e zzW72Kp2-8v>M3HIqS4s6MtcNP5Cc;a-HyRa4<BfYy_ABfbvCLkeoz+poE$2v(Qc_u zWx5_JOO;JuS<Ir0l005no~BKuKpQBFU6i6*;hLurOic_Ni|BR)USvD?FYfMxvy*)i z+0Pb=Wp&GQH&#en<k73HCk^46@Y2JLg=60y=L82iD(0wtj>hLWX%EmzOCH)+lVzPV zlU8GyD5ox%N&8Ht&y=jjFh@o}RAfbf9Wd;H>_GuF>E04$#ww8^DzK!wOXV{ZKErSJ z%EL%~rDlfGXQ0BZIlB;<gM&$!p<;&GXJ~>9r>~B!d+biRSBAPaUe^Y?#*#EM>`zY5 znW10??K70f(8;j3|9Wypq~#RT&|eNt_79I=oiJT^%rjIF5o;C?of0O)xqujRuJUdv zJfcy@6?9Bg8^eknEI3z1sy~<4by`Dm$;?<lBCt&$s~z%}zUKMmiwLQR)JU!xi$nry zBUGL5Q1L{H5I?=``jZh%K@8M10@46sk{CQ-N~(X*x0_}U$!uu&knq4Zfvk7P@YoB< z{xk@*Jp?rLX2g>bIt)`ITuFKO1{y^bEEFD3d^?_@+-2~AMx+_361SbkM0yKm>>kz* zaE-^IX~Y-8*1Y5*cdMXDNG|S|p`8%i+dLtZ9-=JZG>OnG4E+?bZ5nKL;CQo!5Wgi- z^jw?dTFCCmT>{WZ6^K;v&;aPG%Kch5za54U#nSMhA>e2TCzd@ncBs>klEtC-Ah;bt zR~~JvY=2{CpZ}L-y!!+5*}uDS`{K|(1GmFzhbsjaj30I?`u5x^{x~SLa_CynjW6}} z$;t0Q<(b3fxd3yH8n#>uJN1L5;0wWP;!Bp?gI@{U2)rV^PQs^uu>3}}kx2%Xk7SS< zl#&buGiaY-dT`j?CwH)SHl6$)2%$>JW0<EBWhU~lo?7xWv{UBuTpb_mG+Kx~3q@eD z(`fe|OBY@`4e(m<CGkcCK*1s~!Igk(f*TL+knWDa^T25`X0Y?XljB3X4AL)A3%i=^ z>YW1~PmZRM{k0Z&Nw`VEuLNERye8c9+pY8belc*cQW(}cMzGA19NV$Q%4^jb7ok`L z0dWb%u7q>D1~xf=d%WM#h0K;l8N<2S>#qI0d-v-F2nhXLhS9Hoa|kJ^mXaElRM`>^ zu1;Bi$%X|0;PM+0)xbCoZ^_fk<C6>fMwu_ANR~pFl%=IC-+{R0ugU)Yv~}fRyT{yI zE;rj?3G>t9OMgXves|3T23eyJsYguiwst~7Ed(e72+zRzdDq$5f!Hxpx%+JA@8h#1 z>D_>f<=w&tg&dtP=FuHpy|Sfa6rENWCsF_<0Q4w8IzEpNk0#wxDW<uOPux71U~_2? zKulIkyMnujPBr#QkqV_dayu+3fDu4Njx;!O4{6(;|IPlzL^!HDSE%hN=FP%ZjtiXJ zq1Z-P`*?_D=Q$W|@a2r;qs8hGNy-OiKCP}#cPsHK^LOzw#5-4V2_k=+Fan&xOQiD2 zRO}J^fF+3v|GPh#V6eKuWSqukdZEM#rk}CXOgAV+xjlu5?i$e@CSVCbEgcSCk{~it zu3e1)ME$EPw<r?IMf$fXS2|LBb3idvZVb=@K&JzwQ|{iyI|sKzoVYHYys*l}5i!^W zI)$dJTJ758<Yv3rP+h)7^~;iaIsHK=ltk2mXvmovawc|fvOZ_}uW%+B!Bz&!BxeJJ z5(N4mK*`y}Zq;0R9Sd{lgKm!2j}I`JA#+!&>&YDNt;Bo{N|K68sTlpx7{~~yB6rdk zwcTPUWa+bqOFlndEmzm;C)W(L9fR0UUQ49m^7fh?D7hSzNDdm|04;h9m1msUW;r>P zhJA8$Iysx#JI#;CsKdEuV)nP#SnhS_Htp~r;E%T7F7BvY-dt{z4i9o-8^grzp<*Pn zWfQ9e%l1t$(tSJcjuNc9Cy@@XksfS{4&<Q%3Mv4ta}=ftLmOoVDC+cWcLz#eO9n&p z^;7U1b2fOwn>TXsdFH&@jma#w&qXC%U|%E+sR?O3qta&IoSoaR;@6YYsc@OQXXih^ zUT@Fu*W2Flq#%u)vXdo~z7OWJxrp!V_siJQ?r*hso8pK}@To3PFyK#Q!Plx|6t)=x z6anZ31PWoVPVFt1J)7hjF^{))OBM$f@U0=YrC^Xkk{^wpc4^)$cZ-Ma8exCi1YH~n zD!iILte?!5WLA^KK7a5T)8{1{vQnss6`mW5cxjAhrO!u2KHx+#wI<d3k3432Fx`9e zTQ_U>GrO)H=yZ8~@zD<Uy<KjmVXWuDWx7(Naia%f(y7+hoEv)G_81Yi6<tMjd#Fi- zA_BfbY?}sa4~Fb`rDxa~suJSAurqW$S!A)OgN*t@g1zi9BjneR-xA`dK@~yx&Lq4Y z#Wx<0#h4CY|JhZW3pT)l!$*Nl)EX13ei$4cNVr~H_hw7GNm<QJ<S+Qe-QziljloZ$ za?5ym9bdI-#Ta2xkwtI!B8NONP!m{wyDal-c{?PhJfC~=eCdlLM2bW4B57g<X=FUI zL00?F39+@uMu;mSnjT_*Sf8eGb<X;_^^Z@~78-_Ksu?s3UEmAgJDNq8HsPHG(HsHW zlTpKnnh}N?q#x{eNv2C_<f2=TD=N$nx-xu&i>LE_`KTC8#bDVtjVX!2@)^-1;A#i% zs>CX>org@0&WWgrXwc=PzNRl`@7u-d1BYO$x7++bnr#p>iF8phw*Pwso-}r)9BgJ! zt4Pmq%oKkmeWmoiB0<#l;-TaIKwPSB0Y!hjp3^qq|7N<GadPf&B|e=k8RAy?JBe@X z5N=~^1WU`_*a*)z_t)Ya#?SpWAAA&@j~iE|k+AWAJ&ICL6wC+{0Gc05Uxebg=lO4x z(IAAsHy~$&aeH*G5s#2OH)WS_`m^Kv;F<;_?*dpZ$Z17R@r4%<Y7#KY6A~ayMno5+ zak$R~9Y@UJgg1xt^(y?D>SmG;m^B7n<Ck6{$G!J=Ji1%L^CS_$sZ8}w$Lh%&yL7zL z8WU+gY}pcqvo}Yt56&n7`gqmZ=hbG-euFJZ(r6-1M3}-kItpa9hSj1=?vW~zFzyoc z&VJ19x0Cbp33+O8L>}XgRK?5uZdO-zA!M_j<I}p>4Lk4mZy)Taw3+#~?UF4#Om0ka z-G#j;?O2t&o^$_k^8iy|B7jB)6K(cveD;S8FS3-^=DAkVeY^J7s7ljYM(NRbV4I5I z;8kT*7&cA^<Xp(u^!C6ZuJE`(+gGCPO8<LlyC_DqO<Jt&E2@bjm0MXIkPXS0br3kj z)gBjU8;62iGQ2yr4BRt8p~h@rbkYWmN!ftP9vZ=9LnAb5Xap#F+z6!^b@{p;b@@W= zYCpeY{eHF)Xic<QXVfa2LJVMIK%lmVrjUh4_6)=ZQS1Kz1F<EfTgf*Vh;Cn()GAv~ z3@`+s{ScZ$)*gxRs*9-Vri$I*HldM5ThWb-ry>TD`j>klDVROeG*5>I@pRf=D-|xr z(<bll?)N_~=ARZ$&2HU|lsBt+Knrj2I1DG(Vj7;1Lb_bQ%h#gjA9r&2iaBjB!|8db zBEL7DQH^LaNeCNFBaMdO{Uo{|S`*!r{0?fefvwn}8uM>zD^-23t?2SiMb%=0nuOGZ z$W)c!{RCQZJzM$pY?Uc*E7z{<v6YjymFX-Hxb5?WhFTp3A5y%?xYyOKPGy2mD<N(D z(BGk2U2JTp6(l#JryYBgNmC|#ZVu@s>GG*b<o*y^5n6j_1NESuZd^cYgk1*MpSov+ zLBdM0*0=aD>}v=c%{>i0d|W^6-(B~e`F?Bl#@pQdH%nvOlaf}2q{ZJeoB45f$mf>y z_|x5LEaF*Y<?69=tH&cCMG#hp2p>c19h&~^*PGn2Od?An(Fy$N&g}7)#^5;L8h7n6 ziC5~zWwTV856?QAyX^_ywuzoWLKnf}kP=)3-ZU_iuO+U*dV|Dpgw%<URhA@Qk(`rk z6`stm+|iSofI$hx2!M1=I^I^9wx>ZmR^?bbUfN@1_Rxkr8pYKS5Vo7!!|Psy{@8V2 z?qL>g!!^<iN-^ACV(Z4XBARmiElv)}z7Yeuh1Zx`k&4zyoc$=@JNaXO(zbh({ojdg z1Y2ap7C8fOn8z*AQ2B*o7Oc<3Ye-y2J9%2gyR^eun(^Nt-KC|$1$~@Y&ET0rfS#a0 zuAE9oNciDAz&5I<?AMFi`*1&x)6b)a5B8YwzTI1RZ#&XoMJvIO<u5zD9^4R?RF9^5 zO0Q9Lqe-yw;J&i22&f3Ce}b}$BBg8)Uast-_{S^TtB3BZckYWep91ULgVF5YoKMfX z;{*E_e0&^4_ng072K>0#xYc;WL5d52;p*bZqvTQHWT7An3M|-L)$B!>zfa%#+TF?a zmj+{9&6dMRtmVPtcJ{?5`$g}w#r<Lic(gU%Jts0>gajUJ_xyPQN(!J|*LnEcYrAlE z(cS1dp$z6*0?Im9lIx7l?QBv$a)YO|dR35(ifmvGmxR=WV8Tam#PgN#Tz*p!T#{#1 zrFo|Nm2^KBG@XPfLJIO+I$!NpC*>x930c;-VJkIEy<TtrettijW3sqWBWk3g5X zSZ;3@SDV>Al6|jm)4O#A4x{VL3K;T3=1Ve<PuLW~5K(#YbS$2?NbMe${zu8Dl#{P2 zOkX~4oQB+^he;qzCJ3AhA{O6uhc?jA-gkQ-IYdUIMt5N(2!g^<YTN-$!6-2keM_Hg z@OVYM;~jHBwhOY2or*D(CJN)4;33?J?d*a+%(zX97q+FPowT3dFTw{o7-o90j%bbX zldUk>k5ufR^ROQa35o=MC6RY8Wko5`u?)yH$>>xBh+Tn`V;3D2wNgaa7K4FX`rYmg zorI;&=bQEIEeX^L3A`JvXL1?56R|TS^>T3>zY${8&KrexzC6Dhl*<d;NsLRbGVMwx zIV!s<j4QiaZRoR`LlhAD%qm^GGCR_sOUh8*E!H_6A0l#PNIr5~W_`L+I+HFfwjg`0 ziv6|=VjhJl!q9g!L&7!K!(r>7%>H#;Ln*ihy2!L^G^&2aH5!&oa#VK1vInkFsXFZ% zuy5=dWVMp==o)>pDy6rNT!ZvN84dc-HQ3=-9P-?r$0*DY=Epq=Dz}rw!%5q9FuuR2 zzoql+CL%8G^mM)1?q*J;1*!Cgz1idS*)a5B*+H>V7>7urd`S&@&VY4_*-%UjkV8Pt z@e$$Q0*&;*#!;*9(}Sw|dSL2L)C0|37ZelYX#$`Lz)&hs=;7qe@xi(EptH9VDgrA% zFIB|y)p_@EH??;I&4aD-m=b*)MAY8ZPV6m!`E4`13CgB&NQw%lmPigt?|&LDUBvPO zi{_efNQ=u3_g{LDgSOqh`j-uhIN4k;SF_tVL?=`|?NrfDm<*&4H4%-sq=_v_mu|BE zwd7y1q^kb1CE4N{j^XYkKnkIV!0;_tSn}d<|M$1S{I-b>BIRi-k{h3$HI=LhgT|0< zNUuC68k}65{AO=%2|201g%imh)YP!1dN+~pLRiB%t0Hs3xj~2!7A3=&Bu3u8UT!ZI z_JlzY<iaIS?Aac!Zq|V(f~&aFt*ev=J2Mz;1f&Rp%?KYuYmau?JhRK7fKD%`$6i`Q z^q80Fw9^6hUqVFy`+9BH>bq|k!83|Fs+6o5vWE5C5l}@CmURUVNluU4N*84q4er~_ zr=RDykJpYZ7X~i7AHEQ&F3(sUmf;6v8Yowun+Du~XN0ghdI4q_uoiN2--V{N!LAR} zUNg;TiC23`uska!hngIA0h1&K^pbS!cM;j9pp}QRsDM}p#CAY!0xGw~PG~8WMe%(v zJBQUjKoOmvAdyGfNX|{L(-zNS$QaG5XkG-u52%V%G(6(kAy5-2&m-*H{fGT?ySnhM z=dsvwDb?n~M&dxCN9@(#oWDXlwYEdWz1=1uFI|!oV^BW%sK^Hz*eI+ftnqS{u4_Cv zOdJ3$3Vhw0-pNTuyZjw%PLjqB0}J(TJBa4%@A`h_K;k?)kr+moD>aDt3?9UdB@mGd z8oGc1$54tW7@YW_Vy>td9Vx~pMT$Y%|2)N9QRI>$W0)R88KNq$7|kWWqsbq;ZN)-% zaPGHUj0(n6?q2uaRWtgTU2Rnhap@ue!ko|nv&K|NE)l+-MM~39n(m^N0a<fMKqS8h zwh5&2NP5XJZY()|Bihh~i=4f)pY4Z`tKsdvNIS+B6;gx2mZ=<TX+Rdv>e=leRz5*5 zNk`XDWSfFk9x4$!lk+#xfku$=-LAj$umTo6hG!MH<k9<5<ynJx&t||OC21%Lj5~rV zY2y+$CcYidpnL{7%5ieq(@a_TG0xq^IvnZFm#a_F5cl-zuK(2&9)jdU0o#Mk`aWtC zvI%Jy!+?+0d%<0geNFZ|R~eE^lHn-?wh3glLw5W1xPOSW8n=2$Td;R89okuVhnY}E zO*fIh`xH+)?>^bP@NSn6?tVq+rnViZO}zi;jyY(&5^cYBarm)Uwp4DsMZ18`B!XiA zuD<ZtHVrO3cpwgYf1_U@j^dRTu|Nne(Q<;RS3FrL$%3XtF~SgmZkgCN4X!;{!a*>R zVZ0<L4Se`1d?i2gVto#mXgN^PZH34Wp=cO;I+{fT+2+IC-e7<LA5>jMSNPf+eCg3p zP{=Lst?~BkES>_e&0?+EL)#=)du*&7n!76hdD<~U?WnN9hwM_KiV~GnPXwq5z%-E1 zHifM-kCoMex9zmo|J8Zd7%(3>x$T{8McVP=Df&(iieM$QSB*Q|5`cmL4UPc?Ka=+2 zVzL)ZL+UaLBq29A(e@A;3zxh<-mRF(xAN@*On-;L!d|WCk4)tNWr0YJW@?|iiu$v) z`IjI~DGBw%GY7+I%T6RpZzz3d&>^`Z86VCBwh3fIq`$pj?_}>JoW)@guT-)6cp@<R zuC}RrkK65fHF#e0p<7}mjjLcB5BJx1@7KYAm?aM<7Nuf(i$0a<{2C(rfrJgahNk<j zO92!C=o$!ZlUVJs!PNkvvd}RkeC;M$N*M;_8~VV!yA?VNifhCTq_%(^Lv}hh7?LZJ z;RXb@31s7uJ}P@}5(uU<eD@{2U~jgGo#0~>SWT-TnO5WRLz^FsMxu-)K=p4oabjr` z?eIv}$h_vtnZ{CBg04u1fdxr1Lm73n1CvM5%rsscBgShT(0Owz8=SD<*$Q+ManRU7 zymj9x$<5>{+-%`{cCt&kO3H<SKBgK{WkNvQehjP$YzXXD!ahkILF9MeBXIq<$x<HS zc4iZPasByAyIips=yj5xzg&E@QN9=J`(8)M^u4vs67`oG`K)AWY21K`p5|A_WdEI; z@^9>U_zYMm88yON2sLgVPa-rC*v}%iO@j@=vUquT(M}^>RtOVM=@Lr^LsiCNLXRR7 zDu{TXk#QGp3eX4uS0j38o5HHxV<C`R0}I4aYScB{cE)hf*uP!kvZ`p%U_0|>OWq;H ztEF7wZtI)0Qf^>zG#6#Ci@UF-<tC{*heOS*<2gD%bhUfX5|4%Bvaa<edR#^u-BG#B z7%Gp>g{wb@WKA+Wi@-L4G#)8$;@FLq<I^`6p&>fIO7FjMsXmy7^-5qZbR4`Vm_*QX z5Kt{xa3nWE2K?Z*3!QX~qxEWO^*Hp5tM%qn>=)ddh(l(j#(=v*kvp`{1fU>5gMC0_ z_Hi21(Mmi}@{=TZ_&e@{@7>a$$$|SmJLKMwdkpMpOhpW)0Yt|VUQxmZVTk&ti|DV` z=M#H<c7%JKk$Zfvr7`S~f@?<I$I0(|c1tzh;M3ae(ERy{`*!~OWIkI3X@!cWZt?ca z3wHY=4#+W^xm$%B0hI({DTeSdbhShO^2)Z<*I{p=Yf{r&W$_-<c%=6uUbzhCIqXi> zkK0)K(*YwT?TO_!vg9{ok4`S9cr8s#RVu!#65O%nKiMK<7#$gdQz&jm_NyRA1v%<^ z<TOMRf?k>6b_8uadM6mVO$t?E>GZnyTFiC-xtP1|XiTu6XLM|k(aSA{8VDCl$&BZ= zCbwM=KP0nz$5Vs^qHRsz?j3|;nH;uyy8P5TSoL&1pS|GKwQsQ_tM*(PcJsK|Vn{AX zMkg;oEbdIs4z4C=J@ep>i~7+X-2gwm%f#B=-L#VUnu%P)W2rqJ40*sJObSsEQF|_( z2Zh|p%G_4wB4qDZ5WBUrN2TwU?q}D(x>?~TNinKR!8aOHj7`A@CS<}4GUTda=Zdwp z9)(KBqMFCFeUSE`?!Zr?<Ely`44Oq0cQMiuZoab}oThoH$O}v$T>0bcMDYqJ7a$u^ zYxZym`t!H}OzmL7`FK+Or30)YqHE?xk3?hwXm-HfQDV~lNn%u#La>8i$QQBu32>9K zxT1f)i*&{%73gde0ICJcF&^3`v3iH?oj@VopWVTyObS8mAoPgXAjFY4hP_pA@F871 zqRh}s5*dVD@&0kjUxTFtK(QpqPiVLmOQcBeSV{p(7G+Qrp#5uOi4-SrOeGOD%YqXK zHrgW=tPiA-Id>YAOMwWdA-uQyL8RY*=^Q)-&@2jVfzURIH9Ks7!byOiEgKY(g48Sn zx*#|>A0t4;@ZS=%^8|oOP*4J)aac9c1)UIj9YblB32hMn&iZWkV8pxbfq*v%L$O0K zh7$Xcz1Vbfa(v(RBEak#<z}&BcyPD?#y!V}$$Y-J--f4I_$^+j>E|V5<ATXDtFtFs z=F6MqoT#|-#x)G5>*Z=2FOhYp0ADjbSRspK+;%cr&31pFvJ|~=bW99@i&gawFG8G) z%1VTJ{JW^^`l-8#X7TV4pIv2*(R*ex{~A#c^l6+v;qlMmDu=5@?`5a=eIhU3o=%;< zZ4+BC-IwqVBTn{TmXm%Kl#KodSy5#7JVQ`mo})x0C(9$ArO|<`XMh&D$3%)P;25{} zqBnngQRc75I#@p3+jFWr3Oz%z$ifwz7G9z7VqU6FVNDBb_=tQ4R|?M1$&0isS0YQ5 zmPJ)VSxEWIvRny|weW}`=owt&a4MrL6=g|!8|~vBM%3SLA89ZU%{bBO8lsJ}AU%;1 z*3lQe0AC26eUr+c6_w^wB}Dyx^Zf-;#Y)Nu>*xkvfUg8!Q`D|M`0qE<v$sB@9X($i z{zh{)U+aglm&)Xz6P|81>y7lpLgKNRz2$1Q`Eokjehhtp_XV`;+4V`cK>VA%FzcRF z-}PSD&$R3K(g6F+b$9XYYQ9`NNDg+r-aKG5tWYUE>X5z*PU=QRv`mzViQ#j=+yM(k ztv4fD7tbn+e~8vqHL7(`zg6q1dPeI647E<$SF|oJTxd}yI^*Ynr2yF*7sWv9?aBV{ z{qd!!<d%kqcFhZ@a^If2G#^l^gY~<PaPYX9F_tp8uwlGL;j<P#(IbBqE&a02C{^{0 zRP3sB{$i<A^?g!__O%i|(FuPQT?m?8u<p$xkL(?{@A$^KC_<N##V||7>t#l>vbI{X zHk=e?yR4o|8^O^|-|@&CU<kMwAKE+x*A5Dke%mKmF8C=$S0#lW!xe(l<U3FEdnNpq zNq$u|&TsuJzoNgAb5Bk_$8eS4Fxp54JM()zIX<w^cfw_pc=yVqWU?z=t;tyuj2xqs zpb9~mtg8?HCJ1d2c*r7}TldQ;5mgCmxb!pcLW1Zt(BN{T1m@lJ4}n#}P)&y9;k3|h z2UEM7eR$es6hFh!e%<x25A)4(cTrL1)sxCA(|s9hDsc7;P6>{>s<JdsSHhD{@}#P9 zo_u@5$|K4EPvbZvxQaY!_h~VKT7!>^s>a6!3HB3xYCkJ>31?Gl*0YOW^IqEC$;rj9 zDolEFY{!hFBWu533w)J?RS8p#Fja@VI5uiLDTHCzK}8w3C#N?uvuy7{wb;q6JH|vM zL>i|Kjq_@9*xG<;$-#lEcF%{nD=D_8i_LN!b@OM7_v`f*%k3Pz9Kl9~-OX0llFTq0 zcfWnG_6zL8jOnPfB!l5@)EJ{8oDt#Z4bNdK!Pcxtk1IkvwQjyi5vm$00?FU1h_A{o zUfyIP6S}akV8u&t4=6Jwrul-F@gaw1$6;Cuh4BPG{_VhA{M5iI@z>$796qj+vpGR= z?t@nF46YH$u<pwosaXZ(1X#4^&XRl;tyl+Io#ac5Zp4ckODN<ST*-0`2QM``Lt!3h z5A%mqze<#7&#hBFgM;?a=a2cOAi1O?=hC0YigvL;y?;18J3BeEBxN@x-0+EH_k8Z* zfupF7f{FOs!)c56Rzbk(pvtj2*!?YckDebLT~5!=ZM^_u*^31C+_X!teEQv8w?p;L zZs+}a(NStleV+!WXC8m;s8%(P_1!}+I$?Hqf4k_viWUCaF6W>68Sd;VBTCCLAbhl^ zQG%y8@0Kh1Roh<=i@AST%Kp6BU{;0%rMrat2mF*X8P|_@cVCboXEE+)=%31Lca}l+ z@0Qm~#{`yO9@eW5_uI|=I%E}C{3(<i)jH~)%@n&SX9XPN3Dd<oIn9Ii)I*d+bT6Bp zU7mH5J0zIl<PHeBN+lU<DOw(LvIy7yT~re&4c{!=KMX@=c*4I+UZ6|vUzi=xC%4Pl zLrCS<Os_g|)l4|+wqsND+|jY6Kwz6h79JT^gq@BH5HvRQe}ZJ!D;ouL94~YKEoMXb zEQL=^i3bQH2u#of+KymrVmql1FZl>I(i%rAGAXCX!`GEBcXx?`s03YvA9zEU7Ffwb zt-cd5Lzs2dtH~w4Ly(Yq1{es*SWCu+<yTU|;W5k5*{}>^Tq#=I1|d|E1&HqHT3<|& zD25;@M@u=B)<rn=>oS6=h{=fw3aSOv5M*uIA^K`7r8&4w;sjmfDk)cK<$9X^x%ha! z+4aRG7Pi#xNkN_YC9S<jd-ujhUI^mcSx8^Di-)ttyo(!+cXQr6EH<HcGw3DWvT4`r z`-gZ13&%de7`rx}at-31qo*379K4<ayfhk|^6OKKP|!yDq>3bTc4CkH$?5q-^i<<8 z$kWmCx*y|n$^?e^{CTjkmk0T{SPYR=oV}iCHM?V!qpU2K2n*`2tlmEK1AFbR)@-#} z+`42J)Qd{}?RTDFY8PH~{%Ft3%Tb!(d`KveNZg3T-PkfD8}TlD-xJrSfQrCKbC~@r zc}2U{KT2~FJZUsyCu7Bxl}RejWOZ6`M(LE|jLrs%yApx52u%Nq$fb}mw-j8P0#*b< zaju&PJkGc$r+<{*ev-#QLu6b8YeX=3R!ptLu_`#0z}f^(5!Y7_-Kv6HWj{(iKgX@8 zoxtps7P;U)18ON$c#pu^1g;{^_31ZYch{{~m}6@Z<H9C~I$FhY<Oa#-m}fuOFLd76 zL_Mu0e||upAJX`o!QQQ1mA3Pp4=a|}n4R>mPR@=d{3d9GZMa56ti>}BJw{YJgeedE z<$ivblD;lnJm$@>EL{V1C0(;kGBGB}#I|kQHYc`i+nCt4ZQHiZiS4{Q-}~3<Ufs7* z`*fXsYIWDGs#C2Pmi7DnlBVSkkVCwNl>O#<Yqfx}CgtDCr2G`Y&@Rwb(m0g3<s4Vx zX?9EW%C8g53yn{DJ5CP~CS(y}YhguncYd3}Nw`VsR#q@&P(oHJU~<sjG7wx1L{uMl zZzngq(bwMzZ|A^*5#@!Y=^_{u`fN#7>2-|kT>}PT?{d=)qflfCx#hwV!gZwqA_AOa z$MUS%7iMbeX_Qg)$tLQWM^Xbiz<!`hpe%>oAjM>cvKaT9Xi12ukbkK5p<{&(!rUiV z{EHwoFI~x}&BB@Y64}5?)e{?tcBr$pE;d>Z8peL_WA>Guj&_yX$^XP<8!g&ojQCs_ z(tjq8I1)f&X!_%YJ|--MeFi+s=jib2RF~?jwFdLS>$Nsy*KtR;;!<<gSAq&&HuCq9 zFdNA3^zYB0Zl`$+Nl6tu4Un8h3O@p%7)i5?!DU=5%cqERYoGl?Ce=!5<d6s&EEFnK z$58b;x~#;IfC$=%sCKi`RmeXuKn(EzUNM75Jci!d%82yt&qB{w?pFQ9C=j{zf+~}Z zl76Dh!JXZZ5pEziKFx|-cp%A!sT_+*Y~2@&o3$!ZGhY@kIY=6cIjv(_V&b}I2A~Gj z%S8io0y$Bo`@HrRCA+0R<MsILra-?KFs|)sf}p|dx6UAS<{(3OgTsHV?=yYx)|~31 zLLVL(tAcHXHl{OIE{hEgBV`ey`O>Ox@Fy7$i;N6ix`Y^(D+JA%FbrrbegYL#r-}zZ z*-dA`0PVxvIuYwIl>zQwhK<2(&gghvHd}TS>Q1D-pU)7gUPT27ku4VUCSGykxVr9g ze;lvojgJh_3JcuY$jEMo3;cVOLx9#9fx<TP;C|}lT>HVa8@RNFGQD7<@UeRnzm!z@ zbE_9}6d_0_&~9dH|H=pFPL*%qcPP$YrDyqhkjgyIrl1tG!RkdFxe$G|kNdsYDi_ux zQ_9cz`|voGfPUf<$j;uBD5d^@UoKQb3<?Qh?u7c6K&IR=<4|1oN}q$lfwvR_l~~iz zAq8Hl&rSm|tBc4L`8FVgT_yb>y!zHr6%MfjErWP&?W4X@%46_I{pzB9jLd(_^+JJb ziD%vP`Yc?XRSTT!Gt-ZlyRjixgqEyuoUatBoq<rAW8X@eV>9B;CN@RStx_s543PIj zY7gS}k&#O*p@r&6F{1td`>tJE8AfTkWx^VivCu@KB6|A3iA>BZhRwQ$AA9%$-<H$k z5@u}^yGoo}&%i&!jOKFTnNNd|77N6^=DL6z*h->f)Nw@a7O-&g3U<V`3BH+)!r@Sj zL@9_EkZNqjMV2=F)7f0Mni3^jJ?RcY)}65XagaXOi_mlG3!l;&D9h=lvH=UM`dnL# zP`S(^?aQ#?rEUfGJAbH6O`j-hUp2@~6N$56u8wVat(A?Hbcr?3T>69>2n}Xn%FN3n zG|x463T_l-OkEov5VeFAd(n~B$dS~xk=yVs&8DQ0ZO4@K{+n;tlvy{=7-1^$XO^Tf zG|md&cG>KZK-CpUtZbUbvpX(lk`qS+j5~CT6Wmz3k<%f-&r(Rhcsgod`COPaTSHm- z9_yrQkR?vTi(_$t!}461?Kl;SYuh5#AxOOfIX^P&f&8*w`|Rh*@9(+Abpda%hzap} z1d(iO6PsLdv~{5EW*($X_j<7){A+ltwKMFaj^`)SGqeAu^u^K7ZZKCh=`k>+WwFig z7}Sj^2U_eC4)*LETR^$-PyC|Kk<iO@wP(i9HO%x7HN=Oh4rdjLcA$|y;DGIrS^QY* zh28l;2;8A;=vzU_&zW2Dq`YUzXC%%PA3~?HPG~L4nx288bi8ZDwq>Xs#WnbcvQ1=) z5`&)ogW_7{Y~k6<8%V#AX7k#o-LF+L_O#&pTVouqWj*NvMiHiA3sHC;IxKtckQIz9 z^xRXQ>ucVbmW++=gRL3jBx{mZDHD98;2Lsn)lgA=7X6oe{SX&!vA9=k^Q!tT)K}d( zi@YxmO_eu}s`;W?T$+A?3L<(L^bkc8vz#$~ub&l5vl;NkXsp9enUYnxi?(M!4%!mt z{G0#EZVaqsHq>?hIWIPVN8MPvdm>n_lv|!#5)<kx^$UUS^<#`!aN^7ITyjvyn8^1+ z^{|TaT3LVO@5u7(qXpJ?Nosd#fdOPt#up2cj37b#I0^3Gj*sGRfw@L@kwc6~QM12y zUQRHo@!qRF_6=7eqR6M(szQzk6)<4?h!Ck6#clh!{?LgpDAY~7fjPF;P1bmwJX?OA z&W5)rNiduPH$ZuuI=XnW@AJ?2$(x?yJhuu7;|1JJj9Y9n{Y0WcmE$a2c|WidQv#7# zKFm>#CV5m}Pr42x;H4Xkg(<Zh``UX8<3M?g-LRN(kSz~h-0l;g{GchxlAW<Mryf@4 zDG?Hnp+{q4t((}ge)L(i0j?(ve8zGngMOLGuexZP<VjoU)6o_6dhsQ|3JcVm@;8AC z+SoLq%Md~OIBVR8kzz9|yP-Sa(Rl*ppWW&EQ|sc#gd1ve_MO=Ymn@m|J8Md(egUhh z&CmJ*?ZaLSs*P~AD0rWvZN~!}Rg{FLcL~${o2~b3QykM?-A{1+_8_an?zK<JVv$+d zE3KmOT<Y?iy91^-DUNx+)+M}=4S4!gdLBgUh_W5lPNi5|)2{+LoV_vTU?IwvQvc4q z&&Vq=qP6Q#5D~{bk99p7#WWKBi6bVf?|gVvO{FFD`4xx?$9*~2Ps6bk7Ldp&aLUK> zS&|_zDC{E7f@%U~X{eRusdXBJ4Q?51-Y126aln!;s4vQoS14l$SkD3*%`XBQDZKx% zM*shs4A>q6R`3|_Kg&h%^VN0m{e^Y#tmQG@2o?F_F!s?A-Utoh-AIgG%*d@dIx9pr zsV9^$pYm4Vwt-88e1lQTr`2N+K5imt2Bu-3@u{T}!lvTtT)k;HS1I2uU-epBb~$Ke zNs&~aKTKQuY2U5?D2B0tN*JVy1Jg$*5VL0}Hwft05arkL=obtWtV1pz;vNsFd;J9M zqZKnhS)+4*yGy?Vx12^`ho1NAy=D58hC$8Tp{IcyZ#B|HhzGVFqMDTE^%<O?pL;wl zAxoKCI-P5#f=Kqu-LGXiWn^bvnr*11qR+KZ+|wLv63Sfz_H}o@JGS!8NsJg_(shNG zVQ3njf(#Sl;pE=)DU%Gz1KDRp#efGVfJ}1tIYa2Xot8#axhYf|agLf72E6mUOmzGt zg#eB-nH5;@>_;O$z8^r^G!amEeJdeuz-&g`OmS>p6}^_Q@^;fY+Op*RJ{63jw|>HP zxlRy?y<y73Hxr-VvyA7}*3O|ZSs@PZiF0bwut6(y_w8s}5@$wCfn_ShqsHS62IbuP z=dOuI+0vk)T}ky%aL8tKQk+)e-QJ>E$#0)5wy@Vu4_>Y?;{nV@J(w<BDS)^<+{%5= zKBzwe2rX$dVA#TZAkzoxuK)JjrD}6|w)53g+(1#|<>k3(FAxlW*P9FP-G;H39nytI zY4AWq9d(q*Mr1}ugbNS*B&fvMwTKPWF>oL<N~%LoQle|S*uB8(ez*4EZc0&isY%$6 zRt8FX_gK#X<XfI(40Kn)J4i&A>qTqxu|&)Z=ZPTg#F)}g)*8MI>agwdBh_p5m78aO zx@0yO+9|qp*b}2`Y|F8%BbBs7b__vVeiyP1E7=bwpKUKA`X&Y}_dEV1LQk*s8w;}$ z+ZDOm6B^RHg3f;<h@gmI82W=r6>>%t(Uy<=fQdbg(`RO|%Ou=lXm_xu!%%X0XgxD> zq*;@vQ;1=^>^et%Xn-?>^fY07#LTS9ynwK-F)$6<V%|8-vo7VxoAtGwAbJq!Bb^$_ z4)n+Pfr?Tck%l42Oi&LpU<0x7*34l#L%^f6L*o+t-i6v{bI=}gYu$;NXz*{tT-j5r zD5Giu!>SpmFjZ3Ruf0q3?n$0)sg1{xPoHvSLz|IdA$ND8*cFhIaeoL==RXMnnZ2w; z_%aC65-)zYRE#z{)2-#*(YI80%5h}UprZUN0@0?MpaW~cU3!B)N{`-?M!R3{Ua(dp zEVCcr$0x>XGr%bRtCL2_Pix%kCu>cGEhj?Hj3gfKXc}i4&w>`$L}I*$1NwPkTra6q z^)oR*bo5aJl>HVp7#ET;CuUwTjXI}YDo+kwrRS!9gR8aXOmC$7*rgG{WA#Ix(y-T0 zAcv!1Ao3;0=ScffU0l(bEl?9i{u*=tdKxE#58<9Y{UIy@dLaV{uw%o$5LxHSkbOJQ z`_$sn)uv_pP5ofRO5^s|)3zbi8<Y2G3e&@Du@OVZ8@-R*K#x9ugQ1m_yEd7}8k5<& zyI3>U{buUUr4G8d4EwC0UcEp+x>g2L3Gv5Y1VBhS7Q7r}pUbKd9ZEj=a8PbShYBe# zJ!gQzVDGPg{d~En14zGcm~9chPoY6f9KwXN3?i8a6p>I5ICX*Dc6*VB)D$%JUHhf4 z@mnpq0Td5J#t@mI7If|sUCXl-ZGUoDE)yz7F_F&*6)#yD92Uc`d_*2afj)Y7?B+<| zyW__pc*9oDbe%SHmo9a6L7I&g4#p%CV_1QQAvq>OBsngC+T>m#^6U4JXXbL6)Xj?r z{hDZiY-XALe0Ae7$~rT~5JqAB$Dn_q{+CQa@zOJw#FaZgEJJpprwQDC8!g@`iAY{j z8eTHbp#MQt9G?(@i9V+A%4V2b#UlT7nA`utr;Tq)smyx9{DBFg&uH>5m*bsVhgoZj zMIB?FJ)r90nbyzic^qM;AbUfpq~fogT0nXfNiI%gRR6rhu%A=Bpu5bxgy=mo?@TJ` z8FBCzLHfs4QK9V$@m4W81+}*WtQlmG9HZ2`Rd%{NVGeg{^8$>$9$<zgf`jE;H+>OP zqhMU7h{6f8Be0^0C{xN*io3KMtRGIU(%%qXhO5z$?;~bP$7hH3RN?-vur;+~GT%<6 zcR}NYwk_t$bV33F<L7gpwu$oxXgj6zQJY=`=k01Kq<NzcFInuj{ws`}H<Hh}GJ*$5 z%(&~lfS8LA)Lz(2CJu`nqL<T;>pZ1husFQiJ&KZy0-RJO+$R{$sQcfZfVtYbp4SFk z>fFa(y-Jb#2L)3wf<>jUgzA!#%#8nK&aCzau(XZc?kN~}QO!}U>}*hd``t#%1wu%E zxiz&n>*se8@EiAK=u@PT`$*iL6&Ugh;ddr#tef610u*IaQ@U{+din$r<+fAv`==6V z!OO!c1Af*rdChOmOS9|%cfuYVF9?j!h3>$7=rK)+<z1x%b|Gx72#)oW`o+m#?u)yg zqs+c%o~63z6;+I?Fj6rGW}}ks;bx<C)L;$5E>1Oj&z`v!gNYCGFZO?zzP6fplpc)| z4vOvlZy=x8l=;hT7&YS+G@Y?6AcOVO%04Bl*H18422oh%KI~*x4^LS7iq%Yw61VAp z76~odL7G_f#8>E5kCI)qi~9!EJTg^WX1ISu@PI}}8WfRG1$&R!hp?lk{I7W$Pg7@o z#OXCFS44M3zr49uuj8dry^{xr5|T)Xs2aD(<BKg5Qxb}?W|Uu~b><T$o~#X6=RT-r zNWb_zb@2>W?6+D9c`rvPqA9B`At|=T{rANWy`SF|Y$jORKJ4g*;3U#q_V&;0pJ|>o zY@d00o|Eya1Ac|cqlYOXl<Kql&rwGI!3_SEhbgkdB*Di-bB5tUv?!4OJtD7(CJzLG zAiv@aOmNlK!`0*NXnK4_n<K6%Bb~8+#L<(+<T#y{#$<ZDZTTF&CAaGRCXYl<f*?Cc zIMi(Hpj|A{a#FVOol^kSA?F3<)_b+!nBnJz;|4Th9A~h>h&Z9{V_75EyZNOunlu$c zYDLadiIM&b8qYA#AXKr9cBwM_esS<pHyC@3S%XSX=nQ^J-UBp#x?R3bs4T3AI;XTs z5NNUiT0=#_Ofaw3mWh_+=df|OK?fm6<RXn_77&O6jbH~ygZ^9F@*J~?7!RYequ_ch z)R`!L6<WUswW8H;(s|?bH%Yvo2ingp5jOQTPDOuIjYHZIQ-47=)Qi_yr)3(SyEIKB z0rCM{oPUBPgt-|1Y(o_95Ur((MBYdacS<Ynp0A#xX{jIxoXXQqJF*5X2JNr@PjpTa z!_Ksv%kMfVmX3>5lU~P3P*h$ccA-0(D{wV)?qKv#tcv>9Vlk~f;9@5HopX!&*M5Rd zncjgC+M6<jXlm|R;#7fGQH8(?-JdW5KQr3J?Odew_5_BRh;{YERP&8?^JF7a>d~?N zOZ!8Pm{L7r7WJA{KHbzhrexN>kweI;?fmy(**%GX)8gXiWC;fLhpC|(kkndxoxm%3 z;H7x+B&>sx4S^k0fd-H?Uurez2ij}Y@x$a`_dJ}4BHH^z$fN1fVFnvOHhBGIxpNLg zY`oaO6rueNYR&2@>R&6Vb4ZCIXEgSNz?^kty^n8*^P#a&r}dVXED0aHKNZ99el`4Z zL+%s#!I_m;g_SLQ3X^@~%|~iVb3>EwzA_c!_!qkf{g(`RwZ$r{rPrJmemY9+6&_-q zt+hZcT6}FhvLZ^W8NVr0qw`z{q>lH{&9l(UEs__SLLdwpoV;boQ`QmEa0eH`)id(} zp(>hCE2V;!8gUxRZPw<m;u*ua028g@bBAVp1DN!PMpF@PcgKEBPU{$watyH~1GNGv z<PDT?6Oj)NUJ!SR2sO%#IH-!ClRD`-?>sBj(Uuc3X;bdm2or1+tbP=Y{MBOd)pV5G zYbL0}3)EV;=+Q8helm^X)oyu4s>2Ndgkh-IgM6rzI!-r|e}d=6sd^YUIUF7a&lY^e zc+fGxUUG{+{36HXcm=~X9!KLiS*vSlZeo_)!~3{gil?REw$BXZ7Sq!Dv~;+;8>x4w zdDH|cU2N)(yza-2FgmPj`|3T=Qio=8k1>0SURJFWw|J<ieC^+&E=u{~Cy<Vv<hy9b ze1=!uuMurQasc(WJ2I$v{*vCj?1OQbq@)n~<AODOXueW55)Jg(adUvyg-QC&wXt&l zH1js9rXGGS5%J<g?#P)!8rWMXr5avy6rqK0gV-{kk<JMTA0JNbQd`gKLyU8OVdg9b z2eRhLR`ZzjQTFJ}I*%mmd7GwsoOMOi@OT+_XQ)6dU2>Hc<UI=3mugG_2TW0ji!*s= zH*~XKr=ON$4R#Fk_&zc4Mfw*-uwg#elQOjh$E!VP-b$NPSuKI;xXtj1RmVH8M=ipO z>Bip&-M!%=!KVN#TXZ-$MYhE8{7@r&G{zMb#$92$tcdJzLIiY3;8CEwe#6UEWOSvL z+~GNbbcAC{`k+(*A!Ixv)lkc&a8;ezuOX^3L_Bp9m59uij7V&53WH<PXHisDh($UH zrEa(5Lb}colfysm2&$3{RgNZ01=Z$2TVl!6ed!4Q0EeEtm0-jT1D39I2~agovdWnO zt(>-ECQZR*sb8EXNCkX)zf1(doiiXtg4)qUf|eXxLsPj{yw48hx)^7v*%kBmv?(qt z&fkd&=;e;3HK-N-Pp_nxMagR~-}dUY^DH`Q)dyC<yepy<4v#FITO2O!9czE>=W4{< z!xeSL`KhYUUOEGep_6wsa6&a2V)}frPT3>UourS-9+`iZ9-P;qKyfSyVz!JUrtV-i zQIh<$yPx5RsMfKOa+!)`Gajc{Gjccvt0BzZ)VkCzlj%ktS%QBvw8sDYp2zag_LV47 z%8N=6Ta%{G5x1T5)NywQ?*f}Z-$q`9(RO5zs<nn>NgK()rjl7iwXjXPEiFr`V>E4e z&a$T@nz^xuxr4v|B1d}I%CUMhQ74+>w$)_R=+H?p;qyx0qg?#nA{<$m#yL&fk~JcW zD#e)QkUNs+AQ<$6m%k7Q64I|QC0k7=eUq0iI^VjBdD5mRC1g#;(>!(RtVrSTUXk9W zCq;CQ=6;^My-KINc${5DHq31pViXw&F<Q`NP)sg|%l+aYQ+9(LO;;BMrtzjLe_m{( z$OAOIdU$<@xSGk7?o+y<TImQ8gaq9`V#-QITFZx2vPBXuhj_hBC9On7|JXc9QS290 z-)Q9Oq%cEW^N(P}F0ZH4e2ZVa(nvcOVaaYci*_ih?9^4#=SZDf7@-$oC)NT5XAZ85 zSeEuLUtST<t+6E~Z;ai;Xzxj;Vitvx5_?PN=&E|^Oi?>W1)azD6I+p84R`z>;#|HN z(>1RX+H0w1K0m)}UZ^iKCOFWSt^efFIqS=wM8}|xoJq9RV>})6@^^p~0!OFMm5$HM zFULlENJV3c++(W14KgdU4y^zEAq?%;gf==}id{;<y2qAPGS3=a1U^zs+@fSTvfT;1 zLv34?!dWYLG36*EUsVz|ctwgKDp%*XJX-e#`fRtTmNKxUxGAa42iY*&k}c9VIcYdB z=w%W%+3wp2;$_rgke_KQJmRmprLY<)4_%`o@Hs4bO@2x5eg><tyT&f3bo5Id%G#tj zRUOP<@vEOB_tVh#b?!w9ndKb@v1L&gFioAxZFoC`A=7UZq*yToV`3i^$tl65VBQp* z3dvu}AenJ-iuk03f{Xf&Oe$a>sI{8S0(tBFWdpdOSrys)E<pC8rQ+yp+-BjScx4v! zCzSX^<Y4+h!3ETjC7cl(FQ92k9Rc<{BSj$ax{oL|86*hH3xAp!b(}M8Z<Wbz@8APC zBgJBU4j)1*A|Yrh@vFoTk*QtNG8CEm#6r+yt2JW})Qd`t%@G473$1xwl<V@wpjF-M zq3l($X4I^ur&vSQY&P7w%egBk<<>+av(zq{Er=4&2AV*?5=F-y!6Q$2yE~nh=Z(uI z-GYE+tW_@^pi4Q+dKCR-QpNQfQS*jLodg><q{|zUmeVmzqNj{jlAv$X@=2wu>E#PS z&}2^O@io)U-wQeUB4mCP_%BVaV_`ubb6Lwdt1Z80@FXM*?{agLq3rUWpV}EqW#iT| zHNT`kJ)DQxeOhcZ2yUm7Q#L>lr^`)BVuc=jJy`HK)^cY)JgR{?kMC~Ut>Yw0trlj} z0hOIsKHU_?w>s+=@PW0_&|*LnoeaslI#E7DOFcWZ#qIakAy?k){@ORAT1e}6a&3lY zT2Vb*Z6;i6Mj1=4f^4w{JKxw=#YRk<cYyxAwy9;$(2iVbXRpAYX<i{8P34tWj&fmD zxxrAIjV}9csixs4G{JVLN6%XBrQ&SMh!Io8d<VI+dnQr9L2llS__K1dcrJ(tXQa8d zA9{+ZRi9Vhlj?Vo>!_H3+VJOGqlM7uv)BeNN{eEw+>rg%Z5cbf^6M?~PDTyMPWEQz z69g$oj5qEmO*vqSZv1CY9ZZND?t*3Nsjjby8QfGIOa}oqCTL!WV+W$4p{RVlV2Bh1 zwfp(|aj6AukF(2EMGKvAi6OqVmo8+jnv{TpM@732opn*XE%VC}o%4Ie>43C5y2+xS zY-(DQMbN6Pt?c;I5A&rC^XN+Er!Qu&$)0TV&htB}14JYW(beb$6DFb&;eAE&!7x(D zu)w=#M31ACvU3;npIPM2%2{g}64&Gpva?n_3SGalDfWu?wQZ_f<vRmVXlbFs4ACb2 zh|D>(A(?d1*ah4~YieM|&%^5l6xVx?L?d8`$kq4yNCxX*jyW?6M_+b+QB~>;Yw2ev z4}4#s-C{+{%S<XG=~IPfP|;cy=><nh{n)p_IU24Cj@kb8d&^5KiAK?Q4jI+C70|`` z0BYNX_xI(S%KA8+Nqd_WnI9a_2rJocCJDat@>c`V`w61zn4uzAu*swmSh85ZoSUg+ z&8vZXzXHX9@Eb#GyyQXUsV=Z1*Eha(lkvS<(>`aLIho%p`f_hFA51W_CMz+;&B->g zx&OQq6${C*{ETFgJ)e^lCowH2qfdqZLj?p2$Z<kThX`8NQ~;m&&1Fe4*{KOUQh`Em zRrSZpGB}g8irzinizKw>1pwKrhFpImgd|8)B^)V9g|6SXF{UO;<`Jk6z5P=KmhIfS zI^r~*qwbluB*XztFKl;ayR&q|-dO5o{l}FaHkI%L*-?fY?g-2%3Q%_$0C)W-WK&hH zSHsr&8no*wn>pBgMkP@74z$s06@T*%^tkVa1$83>s+S+Y1&aDVXsW@;acFcH+Y0x4 z*;ueP=-acSIxPVl8<|B8<oAoTI)k?sOe(iOlm9>rMF?Q%8c{$8*G&w{S<Ei2O88C+ zhU$=BeYnn?xEv3FhZE3#AqF6d*v<LLhBZT|)Qejdxm_GwGMB3^ef}LfbK2~wWx3?g zy{U*;PM0pIs~wUC6xj`bI*YRChrAVZ5TqA{r2RNm&7EuB=8)8^%6jw(6&u4@;M#I@ zK?U`F79<qhy#_^tI}I}1*irJ<2~KG0nMGWZtr%TzJkLNLX|W!lyiXoBI270#SEN_M z6OcWq-&e9kn*t}PDkpnsJx@6BFCMAO&pC}zqjMc`LrdN_F58!gxK;FZcH!WH<E|4g zhrkhIn7;V<lZg;z5CFr+3Cq0xL>jYS+tk3ewWsjm^82q%99wYOOa}k6Cz2blE#b(u z%!#?zv<$n%gAk!0JsYAHb1qUeZI6=sTX@2W><>fi;?QU)6qp&#vpaS{%ihDm-ji@z z%w2`tJz1u+M+HNNq5cNh^IxXqaH(PF<O!$wP_owh{Kl^jX^zR11)?e-R?g`j!f%@p zqfmaoplG~S*=N<4n5De!3*MyZEeo#x5Ih4Dg5<Ib!qBl2EZ_G1i7@QmoX_;7F?y>f z2Wp8wN(N#L7#AJy1WrKu;f<ut+?&8ZkmaNBS33W<#q-R#Ne`s$Ia*T2tm0?^n;xNo z9(8^sshc2s*Cr$C!ugTqEKQ(05vWTPnQ5xCOhHu=i+-}{@|t66AWPVnMMl7~Nc`5n zrkVe18Z&;f&={k|di|T+z}pJ5?RTI1#AnHvq6e_UH7~y~ke1(Uf22%U)dpYwr;<-; zoy#spDN3yH!UM>q_BqB$u9HQBOT-L$c5@>z2XHM(UNC$H80PP580)kqmz5Oyj<jz1 zB#g@d>>hXoM4%1?O}Dy6nD~#@Q1ZW@^GI^p=Uz^AZVqP`gztsJCt@9eRoP7ZYP4qU zk8h3xKQQp`x@iRm%9+iQrQR?HR2MSEPi-M4p@K9t3IX3fxTl0Z(X-?369sYf9SxXy zIF6iP@vj@eL?C<EfUjLO;yIB<(F-@aksFyR_%+WH(`l{j-x7Ciq>eJjRc2De8A){- zb|8GDWZ+L^?Ph*0Kj2(FBpX_Ocl<455W||*e@s;Nl{5EajgGu<`awzv?n2UT7C;un z#R`YErbLWx&{oJ;tv$B>y1lmcc(v;KcT#6_1J1Sk^iDY;%Y;0HO8Y#`9DD|a!3L@b zVpEK<t#%8iY122289MN-DwpFb^DJnw+UBA3k}}Qq2=J#I&R@lu2<$$&^A-=(p`S<h z$`d8xu|Hx>Lp*xzU<rwK{Kmrj(23h`1_tnF?M9f~ty#=oxtS(ix-CU#8b=CnT-LHB zLN3#YH?k$#XP7q94$^|&c@nfXm?T`e9b-IAe08{$b`(w?%`^F#0i>Zf{iV&^hXmKc z!<27mP}7~&?j0RNj$Z&2MM_6Z1{xT?+aGHKhH2fxzP$2Sp|`}AQBakA#s}SnJCM2* zKhQjjFCO<F`4Ik*FMm(=dAh-~ti@B`#5MLI<6_&r8BmE?kL#a$hlv2{4F%qddHkhG zrz}vq;*q)PV%>3`#qSXPWMw=1J8mQW$PQq_EPszW9$Xz874T6YWtn;`+^Ph8%u!-Z z%Fe<4iMHw$9_)n+qfOrp58?92#|kP_lhZdjH(!yp!+I=?&Z$$nA^V5+CG0c@6bsUi z<13kzUhY-eW&ha7WSqrJ_AB2<To|%a;y+{O5|u_%p9CpAarhc67x5O$H%8p{MZB~R zjk@=CZ>(yJoT`A2d^vJB$Ui5H26w|gYgYpAG}`J6^Tt0h+$ac3^}>M2K>uS-1c{qq zvrcH5R<Euim{nupS4xAX1r~)8A3%rWq^&mv34Uf`E7nWXg-!1+%^EZ;5y+)@zYsx! zfBk25Ot>c40%@~&esggF=QHeG(}_Z1kjOVp&1TA%rUpk`N)`FjE-iw2xURd=?*dLP zdPr8W2@whAd81OgkSEn9o-HjA_4@7CNx9@}GNsnc)l73OU&E>Xt(i2`Y+}`vTgJmE z&6X9=DJj>vXi9Qbqf;a9Gm=lhM#s$U%p_H%9W4p890UL05*-$ofg`8jTc_}$Wp<89 zH&a5oNxtmEpvl?0wL+zGp+-A*@NuS+F-7dII_L1rF49<?BO0ihGMA~_N^2jFGIgbn zh?AZ^@c)SQrdgVo{L!Pcx*k*&UHXd;-~x*cZxF82j?+Rz6v5{5K2BsgZeV5Zy<*)y zq|X_W5HjPh^mY(x7Ttmg+}>|p0i%;e&@Y8Rh4W{Ykxkg|@Z{x}0={YDfureM6*p9Q zu6)Ihbv@Nd-Acd8GL1Bo^75O35C@bOg#w({GK6E}ZFjP|9oyer6M3q8V{cAkGZ3p< z3hhe5G4S2|t*u4j`eq!??F@+57Itni=kju`K@|DXtk1t6c?=RqyL(0|vlg>u6S7uy zLAtbE40j9MDXJ`q3@h=^9kc?rX<Ye%EK)L5eHUpIj6Dr|j>qF|VCjU}wjG|dO^4^g z#gn{&QQT0%AZ4vZt~)Z`lDWtW^4As`69)_!OD2JhFlns-$iy_w;9U?AMx~hVb1p&5 z(jLm~mWE5Ng`^e(Dg!u@%}+5v&#pgG)T{c|W@oy=_VTw&v5l1clo^;6IQ1$}{;eiG z?w$w{FX47`#_O(Ilpd_CIas0#lxjw;=6WB5Bvb$nBwhM$TS$jY5r*cahtfc0S=k~# zdaY*p5=6eHP-)UlJ{0cM?(o3Z;V?>z5pBn2kg*b?2*B@Wf@uZ`HCEJ&Ke*S7!UnyH z2Wju8U<qE?qZ{m33zBHi=~XUhyG<|(BV!_eVoW?pp3{exo=%VPcT5CeaEUs30`GaH zaPn#x_NZihARmzj1R!ZKX90QPghGS{B#a^Abj123cE|yd;7+VUSTkMm6`f%7TC^;Q zv%m32!ANP~3K0sR-u5&h?OPY2Tm}YFaP=5}q^}H)7KaKKp~LeT+Pgu-1;ei|%S$q1 z#n02s62RxIi#N&TO7WT%<`ox)S$POaN}%%T+qZ%Mu1lZFeT3kLlCK6*&;e?SpTokR zh@8^Ilrn#e`8y&*Fa?ooVuuzy+aD{#oIHP?buvs9%8ci?-q$e-N%OJVJiJ^q1l^0H zh&As8WC6iNEC|ELI=|Z97zFet4rI?O+)uenGKlJ9Ct7<%MgjZ=!g2VDpe&CSBWSe; z*7BRF_BtC{zjF*IbPZh0dCG>V*S47=Zc<Wxg*<F`66E<-h*1^fn*iWZY+=z1Z{+4& zHeI_R;1i~x6>Y8l=cJrBlQNP9EkL5K^AYct+!g=#DkWV&69<L(h7Jg7`qNxq2&PL2 zurj}CqML<Hgz2sNDEC5zD?w?6|5-T`GvAnaejBzr3#-UUb&||*<A_U`Cez^575de@ z?bnp_+nX{D&~{9Xm)tqnbF04aJSKf*Hvdvi;Z95)=KThY?QLqr{!_Fa3Cmu2r7(Y% z_M3u&WYG;lA;E{garld|dGiQAEuH=$ody$y{u~dEk;9D|u7D78SZ$rty~M+|c2Yeg z9J5nO_*qGJkuoKpnMmh)5zU&7P8&Vq;EV6p_|YZZzPoZTK;dIMc1;$NU=HR{i86{u zkhR&li1VPfH1etj&$FD&mn+x2y!=Mxy*8D7ZVfx4);AvfsIUJpd=fIyfOQvb_=ib` zmqzT+GH}oM&qDmBwsv;R?M&gD=^FM2R|qzT(bmP!S!#JA?Uc@!rpa4>OkPT?j%a8W z8ZH`E{+%I^{69+he;Sk|-mH~372jVHlaLj?xiszfBMj+TS3*#z%E~LZRT%m@9G&wy zW-)NEVQO$F<5s7~<?Q=Qzz`h<V(GYl_)YObk4eeP!!)ovbW6qa?&FLvNOq~rD_)th zjo<H%HFhwRudmT|;A<;q-aW~c8Qf_4&r3-)Rb>LL$d?c1#8;*lW+Ahtt28=Ez*ddc zm4o1Ut;&;>gGfRsZQ(Cg#-h4BY(>+wtrKN;bl$@J?xJZFn!g-Z=j!+p)oqJZCODjM za4ud+tAwd<Xx30o&SQK<%zww|##V2W(%2Q0(_!6C)5?0NJ_WH?!B+sA*93O=m<%ut zn!&W&EB^@n=-h8najx=v!~h$VgD8SFjW(%(n_btltmhR93ehs3KOS#C1jKS709)>x zO3y*j#4;8+P647qO+inZTwLfDoz_*SV30YjmS(8}_l%bR&=X@$&e_qY-sWT4YLgbq z)?hC(30ERO8TS$1z$2f@b`CMBP@C4ds8G{NL0QeOQ7=pZi3xxWlY|g6Z=NEwS9EUP zpw1e;adZY8uHomn|2X9c_1HR13R}x%tJJO&<avT)Qmce~2IWvuZdBeu44R`f_`QP= zWX%sN<jqjqC?OL0P}JLQ(8odxzMiSR1L2kVmW0jsh(-A+iXF_jQ+-ZlQ%qtIEPZ44 zV)hrrBoP#%^z!CbgW$0a@hJzXPXVGgwBfxKWiBaLibaAi&6;`0%Beg(zHW|jnO>6a zsW>Z6x}KC>O)uu2-LIqUc5K<XT;*_<gTK6^v_jpP(|h{f{|t01l7!_%ZBg<TL0hJ0 zGE(iqr_C;J!Ko2Oos}yP7qwEnW3_~SB_EDpJp&U)`qkrhDyf1zZwcla6{_ea(hz$n zw@#jRZFwH(bA56eT2@~neY+)O<{@`H?Y*kfm5t3aa9Y&$t})<#fJ589D|&3`rzkvH zCigL9+1x8|)}FCUc+#xB23!XA4QBa{iXGC@iH`(!1uZNmT06SN%cO9!#T~-V<ylm* zN**Yi(ily&qkVe}c&eI`Gkzf|35(n?&3As7?zqoiUG$&FD(vhm{e5Lv&oXEbjCfT# zLvWk81H6IU*wM%wXbwWmsYwEB$`HmJ0gR3Oqnu`C>J93K9>V>@Fk49_RH9l*66_NN z10`=6BQtoNvpd{wyS;q^-~D}&R8$bgk3DW2(D0%V`#<!@X1}j(t6`f}Jt4>zmcHbf z?KQylN?=Xnb0cVPc(1?Y!Nto8ShquQgBumfMfFWZ+9=69tPQ*&%ZAB+aLC)yWY}Yi z?@t=WiCAbZ(I!fKFAz6VK`p?&PWo|TD=Kkt=X+^;m*ui1Mv&4~Mu#v?1(ZLeb(2_Y zXJJ#9G=`f=GuN%_{;o(wWh7QY!VjYni4smgcQBV09c@nRmdj^t6+rqONFtsFE`hS3 z2Gb-UMP;OzZtW;;0bXe32B)b*z$6g!R#Diz1{}By4HQgg1*>NIIZvxtklY2Lwwv%Z z<RG1ZQs)vG^W{$`GPv9@{>!33R+OzT#C}2DvAnuiK1X0$g4Pt+{yrM6YZ#IT_BNU| zO;T+yA*`i&U!sZ0gP7Wx-*f~_NuIE)K>^hJA{0+ub<r!@vl(cJ^L*!2=M16We2RSe zOdCVO)1#tEp`oowA7vk6`*5i|LP*r2F~2crGX4Wsw4y2nvI$l>#{<srJ5yJ;a2M=& zUHI*24}D5z@lKeN(7P*t$RoU8tt%JB)Z8GWm9gpxe1SHZw~LvevYbvLaBqC!D1&JI z97(LIS>4dYQB;2E*_~<tOKXr~w-^PD08V~Y7syHBDculCp_U~Jd;f5QuaLLV=XFxq zTX&kgaW2VOUn@x;u|?9pN;9i+yh=iV<rg>AFa%Teo2!|!OCW;}HWZ2t#Sg(uEor9q zh#QE<u^`4YNho_1{aCdZODJ>|pk_~t3CpIxAZWxuWl5pQ<lR*dR0HZ-d0^LrHF<9; z?eOk|{GX(jdat1Ja<800qW-wrY0Nrz#90o_{8+-td&Y_jBrkf4262Oxi9(SXjnVZ# zOQE(WFyG4=ia?f!yRsQWZ4#1AAh$2HRlTMmHK{)WikdE*<BE%uz=#Azkj(tQNS{jD zCn<4D1T9R0My15hg$Bpt#x)=Ue<i7G{gDWkp)W=i0)OI36tHOWe*A+`Jd3wHLA@|0 zQ^1uX*GEOE+c9Yi-^an<=cr2acZcAcrY{jx5l`fHd~MgVToblSax01T!RVKSLZM~3 zRW$oysnuHe5<{!N5oiC<bdLvXWx5X-*Oj%?d&V!US$MYMhz0GWBnPuM!-~7MxMm(w zIw$tNu-zKY<sqPxVkpX?`gZ@~g7n(-pEt2l>!>YEm$9m`v*F`SQgfeD-~ymaT1{7= z$**cHltZcWg=AgkvBfOt%}jq{rkX_9TCNT!6%C0VvelW!_^B(&*&pL9(;c}ndYcg% zb)2ac#?^Xitl_{z9I?VFRjbJ$1*43ThIjF9bW;<WLr?smFxtVH@brz65p>8KLd*RH zG0-b?;Y0~7NO0O+MK_246wvIO4Gcy?b11$q2#s76iL)wUMMP8!peS5U+olr7!Zc-C zhh%gOO;wy)RUOCFv2a&2itR4Ycmcs4S%6^31W^WHu#iYdH7r4kD@Rw5G4AE|MEoQ< z(?nXvGzH%&PqtE}`lH!Zk5|e`%y-xWq1qX)g3UPUyH_lcq!PVZNZH5GD*+}eL;tBP z#KeE;MA^pCYOP%8P!`9RG;UI#<wBVBf#Ag!E$IX5L#0ZH6vnJn3R;Xpuhfgp&*cqm z)M240PcVQQr+TieZkCzF4hAuGS12<UOXX8^w{<8DmZ)OvkZ3NO8qxLx-}`KSFo#B_ za}2Pdl1W!8k}xc0HkVE$waI3_EtEi#OJ=rDC>(R)m@lLdNoO_{&yz>jJQ72)^+2Xq zZ%W3F{%D&M_U`XFWIh&$dN>wOI7TkBaaLs!<A|c;lQhB_Rd4g!T<7JW47;g16eY5? zK=$4;woujt`aRgf%7D4m*J*Yr7b)tZ%G~~1XtqBSt~lT#i+moH#MPW0U%*d-a(?Vs zsK{F7C0#|O_I4by7z2$Ce<R)M*vY0+L&~mE-S8Iml6p$kjPMc^{Nv1t*2bpFiPo7b z@T*XI=8#eV6<oBMp{fW|i8`0WWFv~m&lUdwlEP(}LFAaW>Ih58*(zHwW%Vi?Q|~ia z0wYhw9_i_i=7e#q7!bpFtu1}!;@Q(u$SK|KR7mODYVos<(4tcn!QGAp5Cof)i)RTz zc{Q^z92;i-hJ7A^MfZ%KJI=aUp2j(&kkO8D7`GY*f3(7S`zV6@HG}Xl3-|;LPYdd= zgLy%?&U+lNNytp7`C<9=UG!bh-4OZoSy*|lL{c`0mgoo<L`j&C%SIvdJE5B``E)Oq z*g=Fdm?9`?Dn0OAwnWl;Z59fkdX7X?R7}&*`Q2QNZ29z$)_pa~9T{?(+)B!X0%=F` zEY&=xbGRZUU-B#up|eFi$&#r&r*(A6l4!v3kohvQL|LBy_Rd@Y$C3Y?W=4h<s*vY= z44L=qEAN0RTG$GiH&-IhVhx>dU(#5@KBDiIPakFdV-Iu~ljr2&DR}1eoaa<7cy>6F z*9ef8A$ZnEkSOblB3WV!*aAculWQOQQ(X&`QVFBr?m`Mc)WU>8AzK6A0)44q`3XuO z0%39jQ7ETbM`!YbVF=oCx9JWsBv57=3G>3(@WT@=rME_@<vS=psKpURRj8Q5%pgug z^;O?Ui_KiyQ_{qJ<h03q_HwtEex;S$3CrAUedQJiK?$W6=Sf&Y&)>7yR|b+$;WO>W zIpYf^fgEtO8w@8D@99fbMzoe#8l_dRYt9#MBW7p+)h<&`*u$5q4?k5?5C5UvhY`~d zw(XL2D$5+3tWvUIRt?QZbihq4(3eo3^Vb!^N*!{)ZCgFR>T0ntEAE|YJKY+FwlvTG zp@TEckYwV>L*!sF;crkTU6uG`@K<6eoIDu3NcmnxeT@lk7D{GO2gAzD@vPrlCB&5p zawn%oy8%j2mpp=jbLdi>xoc$%<<iW^kNemUs_}=M5fvY7MGXaK^fKj+ZQY7vEjtpz zJ#rozok$**-(plZeo7hzd>gK6M9IV(3lv|K_Q>UG)X3Ig5%X-4bu_D8?^uCC#1$yH zuNi$Ru)zx7YugXvO{JOfEWwPm-FlS7r|8K<cT4+5i;kcS3zOk!h-&5#%Jyv9@(=|_ z+BDPZ5#vN8+2IG5T4vBNz3>(0EUIL|4`{Hh>LWu-A9mP9mW|WOAuQ+$QtwIbg&^!E ziR-W8<M&8J#PN<=5%g$3{FtydQ#^@-h`#0;`p@$kat+u_cGz?&)N08qtA&FsN=COf z)3!?ug!O_L2nQb>Fo9(+k&S(ZdoUuIKJ;se4`gFw#jnHDm`cGU3v{l}Vx}1B+LZ5c zudVR)3^;~<IY`H+;Tz0qa3XrR8f^}Igu$9Rvs2P6bwlW$CZ3242mLTMFTcY@*|NV4 z>~2gf;K5KEsCZbFlaTpinhf%029FFvpj;HzI4p2AN*L^72lqnk1I3Y_8m%w0&I?3s zjcH)_9Jmx!EZJe#Lg70SN5xtG-q^^HE*X11Xy|Yyi7A44aWpR|9hE1$)V@6|-gGtM zYvKDdu}%8*HR0}g#;3K`&VJ@xua+^p*=RQ1_ez!TnfgL^wPQqg<sJ4y`{fexwL?yc zbIUx9RL9LCwp`4ibzmyqNn7bBq>-eCaT!k!3E%c_TSpG_@||apgR_<3G2s@R)X!*d z-`J}TCoje%irnp2;je9em``u941fKM9ff9}E7t23Yn$d3;H~31<dVJQuH;D%ehwnv zK+K}blcW%z+Znp?of3<p?1UcMT4eH^gq~2#R9{-(6jK-7Y?pDYsc*L$jdR`co%bt7 ziXJLoJW{Ztai_x$iL!?%R;8JoM7-+`Fb^FUhI%Jm`JNs4Nf_M`^4nFymFC%$J~gWy z_9&gxr^&73xFf7?Rw*f!jC-CtUE2&b6YK4p*O?x%j6C<zyH9tSudm51=pW<XaXmAO z<k!jdcpW2!ADQxB&e3-*!FP|CN6Kqgo-*SR@?Tfpq{ftqHOu7R^5i|<Jrb{Ef)v~4 zisNgC8!Y2$L3eSkX^FOwMN*Q^QWyNSc2&oF-$L|&!r#=7zEWrJ;{H1qDBe9Ag&&FX zK5e3}e)2!R6D7ui?mjV(g5-5Rs7Q|v1l><`Stx$w9bPj~eDjm%c+^O=(I$HCm@0my z$@_ekSiT{SL*Oz}d`pmjqaw#F@FnBzkPaQ}`AS%P6yR`sMLZgK!td;y?$vzwKiS#0 zJ+CkrLL>3ggQZ_$f&G3|kjMIg<6PeM!L+Tw4{Na70|EPZAM){1gn0yPK3c&tJ_B`B z*He7L>FnaVTDUv;@Jq^^r-0{FZ7m<7)1$jNGVSn<)+GL@ibry0<q9eG{``im@n^K7 z$blR&k9Rk#OU!6&$?U?h^GTH6*WJ5JbQR>$50>#{c@LKH20@Hv@*Je`CCno!!B+sH z>-8_K=sUb|*1&#+8=2QzI*UZUIK1y_(O0I|+t4PDCyA18spz|}4zT+b8A-~-s~viZ zk>L7k{YxmyvUxU&(LY{KKTOKViWW_MnpsVukK_ahOoYg7edLuEtv>s5*eH6a6PaSu z5_M6=uW^_ubdkqBg%a+#1UWF4oyZe)YZST(5@$q6k75Bmw`z5t1AWA1h;(mq#$G1z z3Z+5yRWXk~5`0Jgaz4|8rZC=oK$!g9J;6uo!tlNM!aOnrV-OhHbw6{bGtKAgE4T1* z-^PQ@wMp?C@sVdf+v`2<PN46jrMWC;<T|b=)B=|zG3V=#1P5JWBnyB`q`nJ<QNedN zJB$=7L3bO_LQ@r}`6X4J7({F7J#~>7XG7YP;&k6i7GDYsJ93K*QSfsneXa8}8o3Wr zvjb~w??%qd6k~f`s3c#rxRLR^c61bpU+Y@)e0$>mmUD4<>@(X*67QwB?hA1`?6V2y zGsvUkxUWQ_F1x}UyFxsd!s`sFw-M|!F`TndoU?bpauWabW4WNncO)4_D$`nG=DN8E z!coF^AnuDs?5zSOW`=7Xeul)mr{EO=dur#}>`O-M?M`cc=Rmw?Bd&W_{5zfKv#hPq zcV_OxGUm9aY1b`_$eTIkAvCjl=lbE(rsR6ZzEBr{8bI{fA-kjN`t}7S_V(CT*mGs} zl@arxhJ9AEV=U$CLwjb+Ij`$l2(WcJ?B2fiv}ey;>EGEzpKxMt4KWW`juHUCuMmKg zn1?c=&m;im%G^gq%md)I9jA+bdcd=L`}!gF_Kba&<NWqDtTq440XS9o-5d86K%-6i z=3a>BTnI63bzjP~(diW1&^<%)i756K81vvA^YBj}0A&z}y%GKQV+H4|PitO|ecn*a zW4GEq=3&550-)12A|4ktjQ@0i=Tu0?4gm1_GIsUOk@C0__g#(a-Z^_`lHCz=l+bl4 z^c{`M=9>5274Kn9c>w7A+P;wQR6G{vYz2T+OXQtH^a(8X#w+%A?<m1{A?~{v_Z3F; z2`2Uy=_mo{OL#!@5B_x|+i^TD*ZecrJf1@#pU4>})m;WBRsFKJCggFBbK9e8yb0p^ zx|6r%z4_SerTu=;09Q_1=TWEdQshlsJx?#U`qxUR#Nno-{*_HR+1I)tQ^=cpnFb$U zMEA%9*E1DIi>sJ)vkxA_wbjM@b>8)PX1iDXwq)98f#-PlwU;W_!px5rIll5K-39C9 zXAt-G56kD&0&^#PAQg#|@NzvJ%Tu)P53Ih6-<ereu96xsM2aSel~?cIlyax(@3Nl2 zUD`X(EKi?&GmM!D+so%Sb@p<&I_VU<e~o)kU7OM9|2&Gn0<5$yAg{ybqF=|-QzgUS z{S#N$^U2%o<ks2o60z`PCZmXNhs0~^uj`i7*%Vm=P2U9>c%tERKF=`4<cI)+x0MQc z%@Tdiuki|&NhZOzTYY1?Sk|u+emv`C@UEd6IK7WH*W;xmR=?LzQCki5^)=3#%YIH< zW;d8`ukOt1WS6IH4bPYf-|IG-%egs5<2Dwo$5qSc`{}Ef_68xZ>F{JerxYX_0B1<V z-e6)LPPPCMBmbzLf^(+pQ0O}s_mxTX37}!msrYv%(I<eku^jU?fa?LI6%l(&+3XC; zfCG#K0Ojd8=5?J4`L4zP@m$xju;)VjyPoKC;y<4I_Qic^h`l+pA)Si*8q=NuDC|2F z=K~m$5&zu};Cv0|e9yl4cQVmuG+-p{i}&n_`>w@(CAB+Im*0zjm;Wa!1^djwvTr(M zisT>sear)Ztq?H}pN<mW@kF11Cjg9XHQTrcI<9|B2B7*x&pUg$nO{%8FPvn4QmiNu zmAGC!iBW9k@U}*No;h+|AMDRu82G-OZ)ZK1xYl0Zs-d}DsNFSXy=Qy>)iJQU?%k<r z<GyE#G1YP8zQ-70!gClN+G{K1I}!I?j-zEWy?|{a@^+^^n_-_XiFt_Y_;u+_IMY@L z;5y);N;Z)g#NNzk&xpj{+KB*G><cgwn%W8h`q8y7l)7|DUXAndrak)$xD+tN?F@bX z8#ubog}(i9Ukt7!4uw7JDG#PN|HRj@&p)@tooM~r5sP{7C;ALocvd@(=XL&v1`q+z zP7Oda6k`AE;mPI}YSCYot4HlYpp#5=zxpW1r|GJ|y?$B)KS!>bz}q{(&h<4Rcx#|{ zY|fSl>`fZrnYC9KdOI-RyPvBsbI9JJJ=a`KZqgqb?(c<dHTbBG4zm0CWHm_U!M>6k zUmH|-&S_75k;fxlrJ!V96XF9{6YhGhkG#bd4}XSn%8(v)J>OnoQ^Z1nHPjV*z3}pK z@sHC%9{C?o2T$BjexGiXA9V>j(+*%&3AQz_TnyDfie$;&`LG+MUA|`32RE^P`^zK1 zS&aLljek~_P|~d^FHMG6dA$yP$sdKS_CtUb?4v$ulh3TY`J8^86SU)f{Yh*Pq_C*x zr9d_>@OOXmd6>`ThL587tGhMBl~DNc^_i(A@hX(JS*qWCxp*HUAE4>EP4e?yKKicV zx>l-4(7iB(gC?<66a&&&^S)iz3qp=e;`RT?`Uc?4qA1OzW81c^j&0kvZFOwhcE{!) z+qTV)olItHcV}j|>eYR>PQCkhUe*2XIp_Pj6nYdER$+uZo783|ggCW|d_b<4tiOy4 zvVTs)fO@p|u=KsMx)d_3Dzc}IG{pXS58;n^8AK?Gy}+6rNQ{&80I@($N{5D4X8F{z z<>F7@nU$GLEb5Dh3a2uQQBt@sElBVo>_e$kAg@%60EPwvjec8Dp8s;lak6dCY<^tx zWP8J5K0W!G!P401KBEceT~QCN7Ph<wXCmq72R)iqsXq0jq{RzGs_fL=z_qx#k=ocW z9VQU@9Bv^<7)MFf1M*X*_ejHuksF~uAB|)p8tES#8a`#ekUfQ-mhxPq57M4o{QRq3 zx4JFt59$r}+_*rG`lutJS`=o~x(14sE0lz&<ZVxh=FprhiLF845HG3u3z$Vsg<jgq zZ0Y5aWap49y!WRaCyn;z{D}TxPO)!vw+K5(d*z{5Q{0U)_gVmL#fvkf#QuJ|37pv= zJ#p3{KIQci=YSc(dP<5uxYN&bfQ&|2@ezPzsC?an#7{&X*YX|Vh&Ql*f%%yv&Cg7& zzR6K_?sT(1EI|a=D6!z`OG|Eb05#;lOagOOT{c6SNY=s-W@O%X3cyok%F_{q=rplL z-rs5Y>AN*-)T5p(UF5TcY=W8edgff_3tX!wUTaYh@ZR_$kHU+xAeaa`@_`(Zgmi%% z7KY{f>S8Vd!0)mOU!f#!bHcx1iwk{Rr@VT2r4RWCS5Wha2+MNdV@M5|0#cp>k6o88 zED1AOs1Uo|`4LPKzoOYFUul!bj`nH;O65H#v<2?oxx`32w`(i(PA*TSo?ry{)LA~z zN6|t)h*>rTs>eah$}e3{LT3j!KsZZYcwi6ZLu7un3$9&Y5n`aq;*EMkb3z?<3E#o` zblsE`GX#`YdHJ>k+!%LuZ%7rW^~DK9w$h&B{Cw`BQyiQ<e(FS?I;Lb_$Wcx<FR;-+ z*cXKHs!~s>|85f&1bS3_^uX?dg{Gw#2wqJ{cKqGcVt+G;kM0P_(R^2w$-X`gM%lDV z+1#1{28gZx`Vpq7s1SfBQsUu*Dk(~Un`qv8!b>==h#){HZ5}Epai<E);73R4cm6)9 z6=2!@jl;5VR(y5sDe4Ty>TAX455!qJ+;Pi(xfOYgPgs`1-U2j7Q3yr&As0MXc43*R z8VZhjg33A}HIMPfB96;=L`iWUgm4H4@Zdn0Bo(#;^s4FD1AUk-Y}ar2Q*?aceM>w! zy69KY!k(wv0#7b>H^f8|l29q`(;HE4%H{mX`D$-ZTrqTKWAAf%Xu3gqFRi3P5)ZDX zP!0=Eik;vC&Kyu!kmIKH=$VyG0kK}Hrb{Gs<Xj_<+0$ha&pH?q06Bsdun%t$k8c{{ zk9@H5Km^B<n?PRfi2{ttN@<UxJl=$NnO3}4_ZNRaJT>Mv&vy%BNM&@sDzYCx9R>oj zGSLGP0_r>-@!!0MRk^cFdEh!BXnKHLC^U^XBx>4Gz5%PjURLF<n30$HvYED}ob4XT za=g5rR#{gF78FxEAur({LZ<u&hlua|ZN|<##9+>MiIb{OlN!ZIG6E6?6SHo}#Y(t_ zGb95!o<J_eT%bu;iu*g+@n{E{yi#YXPZh`fd*#OVvIwJB(e_DDr;G`w=93!Av$1k9 zN8V`>Q&Q)+LYaD$q!&dL83i&Su!>?JM(t$QH_p66&%a~r4Ejkf&K2o|!FjD?qDB#b z@e$H}{OVSC5*5`WAt}K|u;h|vTke*uC!fafd}KZY!tbqqI(9stZ`#zk7Qvw9&;*|Y zm{SIYlT{h+YO`>gB_FDEPmyohoRoB&S&80qK5h%GuoD48?E6)cHwY)llG3+U@>R;o z1Wjii-AjUGh`v_QzdRAP+FCZpFQ+ZoNGh-x$2yHB$`DUiJB{v>GIDWvm^qBf#s?@Q zW<E0yez+6Wo}@Q!rj$FfZY4@UP0WApn<otUQpShDuz{ah1)J@+&1i2lgp>!QCbw)_ zRT!Is#m4g``J;m@qp$PQodz<Emj@K?m=T0n>KAouvH}6ou&sGEWmpz&MgHsPag3$f zHx8u!>uv=q;7l0Y3PsLF=%6g%GB`xa{<a7~R9Wsq5d#h(hBR~Kpsxw+e*;Fja-;%z zHVB(w|0T-6ck+=3&(c6$SurydAmj1tRjpJ!#P{Uvqy8*C!^dQ_tKsN*U|uw3u}?<u z0Q=O)(M$?$MbJf$WG;<0=~}DO9qdt;$yN15S43+*)YNlOv=(-Zsg;rM+v35hkO@MA z<xq3;@ZI6X1=j-`Jzc4V4jdQOAy8A0;hqVwz}U!&wMYq1qU!QwN)Ujzt_So6jC`MH zVQp}9%rhYP840&dxXncVyO?D0N@l6w?X}(-CE)S2Ij5P?%E<Cz<xwS4Gvnwpasx~G zt2UIwK3F-RqK!AR#e>DA)482EfAGwVvvDu$4~n5?S3-2(U?Q7(%l+ElU;hhD7zYuF zQdejsCoxb*@<#GQo{;wWbM*pit(;z-+0h+;7fS;SG7#raLW%_@ZJhxBeydkg5KHs* zw3;{e5YWY0unl8+TB|e!lU18$&a{;*r(b}=6qcfply-RJDQqJy!(YB*#o&UX=S;X@ zRj|240oOy8Z7ckc4&IXhEt}sPVY_r*x3FURu|~k{;(OgXA-Ga@E%%^7V1wF5%4*dy ztYj#OkqkW)Ni8P!rVAci&V?uR1Jbo05i1v)G=ZuY8=ULx1D_q@u3e;0D4C?2s^c6M zO80?%bQ?nMN2>3My^uw>PMrNgv*}Y#+uDXs%C%)O@1TZR-V9;k%S_z>94`O~Hnb6w z?8Vjo<zN<RB#F3Ft?VVW{0gAKdo{Dv(Wx^@-2p!`O&_&0P}#l}AC%%%w0T5Lo+Bl^ zmZy2U!8ye{VH%o2OCz@nB&HPtPk!U&*jWBjvfO!XY<xz39$hy0;Er7?dx1<|&I=!X zNFKkjncribut?%2aQM(v+kNKVYzA^KPfeOb+lhWl_7ezap#uo-C`qp7Wbsgw+O7Q# zajIGDIg&-0J1V$SykfB%(D4vS`29;k8Uz#-2nYxg=#MTwC;PC=vnwnRkVO^{5aEy2 z!QRQm*3!h1LB!O^)tte`(n#UQBKu>}H?gsyH@wQ3vfms=>&>&#bW;^owOLCw9ZJC4 zxGn1<*jyTqI6#n$%~`)4X3r!Stk<-pvPjas_Ts->rGzFq6^}#@QN*Oo6ix_2;C)be zK%n$u^cpW1r5f#nAn^G|G*SpT>+~DfDNGoifD8oBQf5~&n<K9C@Ly{jOWb|^^P`is z<7-SGO43K_w29K0Oh-JOj9lqu(|4NPnhLf2GaoMKA9>(VcAzc?e1jJnY6kq`hAUs{ z4M2XwJq`7Nu?jh}$`h?(#z*#e4?_hmX8zqdY07|l1#Y+G(F-p%MNetsn$Xa1NwS>+ zrI+mSF@}n4>_VrvUnz}%V&-=Q>U;Te9n7M;Wl!p~YbDQj;FNt~YV~i?qc>&h8+ZlJ znf$xHcNIUUG^sOtm2vrUmCy>>oPq|QuyJw!0wr&$5+;Eou>h%e66!5}#r8+G6z(Dw zKQ7TDa~PHD?XtTw{)&&nyzyFk#n(r36~FuV@f&!h_Gf2mz&B0GdtCX4Vc<By3=-8+ zCCrdmm2<mRMJjc(R)tl{1$na6gjqZCWbk}-rD|;&*HVY37VU}^%+XNXjEPc<XY)3# z=rQ{R?S##e?g6H0(FT=jWmJyU0ClU~#+n*0*UCiQOwYO_KaCpJ$H(a;xqG5s;$>53 zRFqk#u2#e5=AT4T?PAJ}2{*wGcHojUowhBejT+hFc`FUGe~SYwnI9!lV@F~eJ@INq zrus7!cu$grdOU=K%db5psg@m2dh=^k>eld>S8{99_fj-GahATF4zfcw3@w#YvA%_m zcNE*45ni`Ios`t2{^9Au$?O9$qR$TeSC^{PPedG5QI}RAQeG@}&6RjbfcwJjmEW!F zY^aMWb3L|n^sU%xkMJzfiz`<I)%U^`X<4$3rr*R_wkKW#je%hyYf+(UE3ZuKop@F> z<)ZhMN7_+ZJF99?W%#KixTIRnW?wmGYCWM?uX%lLQ91LjIEoxQ(uq0NIbsV--jW^4 zcCM3=X-C#wp9c6-6&a<^0e&4C4BgTWZEl^sGwJY@pC$-SKd%JVjGJ@C7GTB?+@+%@ zuCy{aoswl{U9sGDv<}*A_vX`V#tps_y3$^;cGO^+(L8bVG%_hONmyBBmVs83M#_ET zGF79=D(m*U_Fn0vvpLhc@1kqbr+cmaDibtW&uRKez8bs{c`?_h#q{k6V=>XCelI8X zXPkOwsq4_|Tw6OZnY3P$56aKAF>EpP=~jHi5fu^-L!90NuUbwbHr%Q~*%Z4h-FSvv zza<efMN^Pk3b(QkC>XS);Z_tDy)#RkT9+N6159VyAtYsACZke69CrHoy|z09e{wdj ztVh4H$4=g`8~8U)wH_9_%3AZ?P@BcFd_(idz0EN`2<r1frN+1K+AD^kJg4~WF{i&} z__)WczS7><f34xK&fi?xo@Z66jpy9?4M=vp?F80+ZZ%Ilu5U%PWSK=GX<vt}*5~AM z{RBjfpK|4Yh<6K~vpCwYzq#3!4An)He)2ot?M1HK>JpvUU9ilqq7AV4NK3>4X(@)G zx(nsnq5fv(q*Mb8LK6yI6bM3>Zy=G|tTfeAjEBcIZr7rDjU&^TisND)RL`7lCL2?} zMV|>sQ(@s7d&su=H)8Y~(yZMOp}t(&t6L6M)iy<M_BL4O_cNPz>3*lmhiTi!+HQ>8 zW4hi#d_ilH*XzpKvB4Wh8C$`0JE5Cf-}r>z*N*%R3y5>0fy#$=znOP6?8t>?Na|L! z`F#6tEQ16F!~#P7)DQGW$e{>OHg6JbC^(I_fi)~An6n!NrBu-6RisGI5d$d&klDgX ztxzQwb1@6WkP#oj9q1fQsn*FAT*8Y^S%H}63605v%*m6G($^>$N!CaweT2VA(mhQk z7z45TcQN~6c%gjd-Z!Yiq5CdX1JUzh)ODuF<(*TDjz*sJA>z<Rviq3|QA=)7EiXOw zAm~L}<#^;xAeo2ncdd)sWu&-g?y*Hc%~S4q-a%)aGmDPIC-46<V$$7mw_~vi54#8& zSn&7X_(1#yu>3Iy-@Hcx6_&TfiZisJ4A|j>q7B?p>piJkfy$kU*tNnDpF@fxcI(QH z{*?)vlPAH_+ug1BCw7T9!DvTrELWoa>|~NKol4+lqpMjzD#BNr%9Q*&8w-?WVfNik zJ)~@w#en?n$`zL7MZ=ArY+37xXCRY-@MogAD#Uo7UWYa?iCK7@1#!F8Q>_+=nis_@ zRPCNga%8KfFS!~fs8-e|9_?Clb^OQmLt$@i(5v8YX^V7hT2cb(9gW!Sa9)A<EByYL zhsZT#VDw0EJ|?pm68;cSLEOxDOxVB9@5EhMCtQRyOoXuxCdu%=5#N}=Q|TYd52LRb zQZtambRv;%ve<N5@o1}=T&953B3!x?OuBGB8)mV8in=*@99RZ;-vS9IaGV)SJoclv zPRxmecFw=Bs6er_<EwM4C78+MO@0(W4C+maiT<{hK_>^d`VE6g-Qkj@0jtfot1hE6 zBa1kgmp0q-m*to7*CG3nXXhu3wt_son*kYdb5B@EA}=k~=6e4M?%9?4S3mDX-_hy) zkTfoVxFB2B6xA#vIH~}2WJJdRvpDInh>FD)F~T!C+9&Q7(;wZ^ymQby98vzRf*l*Z zJ$KUxAoY5Yo<yONq*dQ}`DWS;g`tv$X8$7K#+4d}<%`Xdj+(?3W?YCfF~c02#7xZa z4cCHA%_u^|<u0uWTO)E{8FFMnh&Kt(PR<3b-*(Z`_KFp75ZKc*JzJxnb&f7FM+f4! zQ5uKmJFjXy;e_pDD!u5t-wmA~KkXX{az2Z8v#k(DWS`V%ZdojzP4$X7IHI<et~L>9 zE@lgf!^B~sy4vRGhTe>K9!g&$V|30oHj8Bn!jUDAl|(0in=VmWA9{utGH3uk>Y4}^ zkV+*vq7#!!JVPbz+CAtSmJ#IEgBLL9fI1@f?gZ1D$7R64WO#XHC2it~1Dmi|L)h0L zIY&w&M9+3n`l*1HH0pbMO!W*&C^CuR5VX&D!Ez;y-X-Z1BdWzCdGGaqFU(b6qhfSQ zH$H?lCiUYYgCcrqt4-hl6$;HGBHAH_dPUfUJc}bTfeDQ7&M$n%G&B*J`r1p{^M(s< z?G<-)z1HS{a@l7ReOsPO()8TndiLPNdcmxoHtB-BUUVLh7nCz&Gl@SqGTA+-<$6xp z0Qs5>vhJzPw$T#xY~srz+^=-}PD#_zQt|7IJ_jJP4V7jm!t(7`vXG(l9+T-pBnQj3 zVhcm@O;<WIlx-<o=H#krDk*elM~0udmrRm|w^&V1w#`hg=gAg?r^jlJ%Ow7;>X9$f zjm8RjFWJo%LsE7gQ3#A{I##l@<(<Gp?QWk`B{!`S7#EC9Rt8G1ST7meC8=#+jBfed zb`wg-ThrU)ODg)sChk>1)TnP%c9WJE6t{4GY3(LZZ{8i$d}Cca!8wQ+6t{Cc&uQyB z<wgmf)}xS`ne&T{DmIe?IFas_=!ilvS^ePUn-cY`pHfQ1L;8B`FVB~JT-xwA%S(98 z^h}|x!lfpfI2f1OGi@T>8_I$7{L5+0^q@_M(G0cZMR0n#XueUnC;r(G;yp2{H^!7w zDyGdMy_+H<6$=z`H+Gx^ZU8YLIJ3XndNF*E*s0(*757Vc?Q}v0fk1+`x;?Lm8DbQK z)L5T*fU6w^Tu|p>A@dcf6LXa%MZ!VJRk2H=MQx93I!3;G`&9GyF_RmoVg-jM{>cy{ z3n=eJE%l}`^oCNTo*sK{I;f*wO!wq-fjj3m8{a*GS-T+>%gbubG+l`xB<=KHku6hK zI<iINMI|?65q}m<+mp>t{9xMUYDWG}P(Rq%Jc3`O`k6YziqwKK8pZ@oAx=%?nEh{r zi%yUKIU<ZLm*0v7bmd7s4R7&7v2Vh059xvFfixTiXaA+-S70s@Der-V*AvNEMr46G zGcYd*KCkqVUG+heo+j1|)n&*NH0hKhsjq-UqE04E$|PxMEoi+7Ng17fmPZf07BAS} zJCAnBfLdo<{Tol8*EI5dw5HyL6vFMlx2F?+LMvUaLBY4GrBEDi^PQ+-akUWzU<5(S z8L2VBshrMRvqJPkWg%9KO{C#`)|=!T0u~vzE_5rVt!U)n8{`+=xENXaT%mYAxLPMn z%D(X2&0^Yn35=^u%G0K8bslG!QvVXnbEtrY#@4_}PBKT7_H{y~Bhq4v5B>iqWHIP2 zv=RCR1VjN21Vr%vLze%6S4>RJY?G&A*BKH2+@!q0dxGA<Yzp+cajMLMRdkDzV+A+= zz?JD=zHhOzb;g7vH#poZ2leXyEm?7&*YB;609)m01fg>abnZF>AwgDY9z?tq>6b#Z za*I^1o?rl;3uY!~(?0Jw-Wzb+lLS}kO4rq!@A8C&S{LM+3s*Q6g3)z4fhcPh?2wcc z(X&GzbE)tb{o?Ep3B^u?6LJWH-&93u@SOjj)mDRrU#({(vLKOIJ9YN`YK)=1t-EPw zV?w{?%vOjGr4_UyX(Amd)nu#Sa)V#08$0ENJHTEBS?<yNfGUt)#@+HUDEc|;@<cLL zP0F_^7YGwdg*#q<d7A7;Z>F_EtSQ)8OZvnB$eN2G$F5DvXt4NqtF&|xcdQqVVu70^ zN^>oYQcH{C1!8FN8Rv*4a90<=5g%MtirHAQL?>ST{Dj%crRLROEM@o@;i@eqJ=Ykh z^~yt==tjK<Uzh^j;l%a?Fu6TVMa#T-eP_iUam<S_=s(=i5ro=y6)I_J<&+$_J2jaZ z%@^+O9G1k2<%PDUDKFyMY^9V|Ol|FP_BV}(MM8=l2A`29YW4yfZpNHJkL^E5AH;<; zJr5~Mi55I!rIJdU*$F&p`gj=YK`6S$96HB5jokg!N?POva>4PFN<-hqZMChmEUAAd zsJnQ!3GH_`RI8ju0`1^r#NnywhQyV2q%b;SI$I&WM9w60kZ0|#gk=39aFK5h2eCP! z*2(5!==p9tHScBKIBn=}<c&W^$wPctjr;yj_k;d%G$5b^J$%mp)%o8I($D_?B4#C1 z8&gAPQ-=TYRtGJ7&NQo+p>RPUpz((P2Vno7!~Yw^rvHK1SH1{7s7uY?HVwVRQJn^h z<$~xj(AfQUknvOB{y2f);iO0k`^cle<~}qVIzJQx`$$t9HL|ptdX{@I7F(W{dctba zLA2n4#e0qPMYI%caOmFHL(NIFM5KNsQm!X2FE8PQ?!UhI?D_S~t}~ox0N&T_CqJbI zCp%m8gV2EnB3RhS!E%CMN6;AGY(+YJo-;@N(#AX4^OlsJ&Qh<L*m+YMt92dqmD4Q^ zl|4Ou_S$>(Y~bg%Y>zGdA*L-Ip;q#DFSluA)T~mvfeJ>LB*i|??)7y#h%JKYe1;D( z2e3?*GU29?4r(RIg}bp^BcpM!u%fS5$uw|)qLGKjdbgLb&yj1?y$SJyb$HzopO{2E z4}6-Bu<yjrTsS`+ZD-T~Csneh9jA{p9o?f^<WX`Ncg>1^NYZvob*G}}Rl8&y=wfZ8 zu(YhM{*$72y~2ZT0RS>@oJ_4x)BGHHa-!ks5@N2=fE!q?&+k{BW;hx&Z8ype`h$OW zA>Z$xX<yWXap*g$%TDvOY#G|2u&K*=K$Lb;tWqgzmOYX>sTRmn5e1rZ0ti4c4lOs% zF3mYDHaAuqCjjvdWIGdE?tOR3q`z%Am^=8d)>w>OJ9b@Sk+v6i{(Orx#w_{vgr@*a z!~<kuoCeT7M-h`auV`B4;BjDU9B2*Iy8z-5%TRvI2Or0o?(1=1vw-tnd$rp<GL?T7 zSB90m()+=r6uEjK{%`j9*w|KSA+R+lfwkL05^02a#*`0PGUa(_R6Ejt9ytCOox*KC zLYe{L>3-S?1a>;q&eyIAe+<TH$qnC>J|#|&rVf;nMTpI%V^)eB2-BIvuDG~POi{aq z-9C@L1V^zmf4TJE#MUvq)i!)1m6t77R8TFlOCuK3*b+KeXxVe1Djq53dY`^}c+snB zl;Nq2BIvefYh6a63@#YH@^iDZlKP488EqJrfv1pD8Q5JwFGfH`6p$h!Qyl$JNns18 z75yy5YzZ^9Up0A<H6xlMY5IfzBTM^$gstv`pnzOnDIaE~m0^wg5-~naQkkVR1wB~r zc!CY=<{x$>J>?{M+IF@#b^lkAMRK*_2@NSj1vQyYA(uAHP}V8@RnHxcXd)XwoD>~f zV-6L@^R{6Cl7Och)-hJMp{VKzWcKTK?C%Z{vqXm~sph3#!4g2a>@1Yk_gG<@j0h`5 zkfFF6X09|^sT37JVSMTmU7qE`qy7vR949m%^EV0DU!x<8`T2ejW6&`|-8H!{tLsE) zf{?k-CEJnDXKB+6g+}aS<}0zfR%ZKg8CYKyT|{`)X)NUO`S9^35Wxe?`~=sSL<VIU zS=g%#Nuhw$k}D?2P33q=CuswyZP}B-q?D~)rqEkR4Oa(P9O7k3p1#2F(3+@2&uvK_ zD2jCGp50di^1d4-&$kWt9fNpoToOy3(=I0zByDghhQeE#m0c>ZoPeHPdS4$cCCU^{ zyfW=+=&TcIFvt0z;Q;HQ1zs@6U@@S3lCt~1OkdWK*=6iIsTY^FZ$Xe2FM_-J-gh#v z?iHFml=N)W0ma_(l&QGL{pf?rwVyFb!EB~O0?B_snOKMnDbW?q;90UOp`9ea$WQpB z>);3QAj!l;f+N&}phbsCzHq$nV$6C2W7>^s)8~_BUY-uMkD@Yin_VNk>8ck51gPtz zOvQc}@M<&+uJmQ%A*%Zp^=DP&@mk)gb##MH>y{f&Odlcz$IM|fH#9)sttLBY<ZoEs zs+HWN0rf|J6lEZUCio6GZ*#gonex5`ItC<qI*+K&ZCT)c^I%Lw&yu`2u*3j<DSx{} z>Rj|c$pyklt5L0Vv@#4gJYHiqWr*gsJx`t*93zF3(0SA0S27eBcs#0#%!8)DhrfoT zF6#${;Rd<8YZ!#Wwez-%m3r5x_M{(1Y4!|`rFpz266)K4yGbTnD<4TG`qWRPsk|nV z>!%Y`3GWT!3jTpU9pMc`q#4P2vIecfwi-PcZ3`1T*SygpTh~~Z*<GJ!wW#NLk{4M- zON1E7Z)9G4K)n2s%$?r|Pq;9#xJ&s<&`DSQo&h?HY_^f4pdqu7gR`u%u%S~J!c8*e zJE8J*_m8q9-3#_<6&Mq&=8Z^Q!VFNM+7YQ$Y)uy(OCm59N)pvQnZksx6Es-KPp~z1 zTx-gjl6OgJ*t;O|AdAEU(L<ptH*MI|s6b|#bURF$BBd-3Ji#`m^jfLnO}Q_$T#ZTV zP5J6qjir#er18<?4UTgmb=uOj4I`Oc-?IV2e_jk+n@RX^PHW(P^zeP9Z{peh(sm-h z_c}riCNtk15-x{Nl`3X606T@sIEZYCTd}_=NLRfR_>1`~8cU`&m$+1AHci^An<)x- zjPaTV6)i*eU_d$61q|ye$RzalKbH7)SuenRm)df0NG;k}g4g>q71s?^s4Km?3m+sP zMe@tGf!qoJ5t?{%!#XiR&oTui%Zg^=O2RicSl2e|ue$7~^1+s1h_&GQ?^-8uhq&sl zgeF$3`P<C0zTzspgl+}MPoa#MbSe%7gktEGs9p!3Jjo8!vgt!2ccpNw24%L;RKMn+ zNn?(peZSaxa2#bG8D;DXHuDd#7SX=!)i>F1<_`}?tO@%`r6H&~#%yA}0-@*w%dJol z+Yth<JV;x{X1LcI)zA@|_H|4_YcsM3wnw?+hkrJYBs{)w={E3*nfn^4TzMsBjjDfp ztttu;<{x*UjYD(vDx*O(Qx16urDc74DPUkHQ6(hH`;MQXFuDE372RqwkcmY)UcUB; ze0@(mkLRjS7pDD%Z^o513icuLiXoFzo|Ja{Cm%lzc~p@HS4d7;Wh{ti9ut+v8^KXR zixY2#A(S`LWsmbzgs))KR63E?)?=fj5v{)I!8eV-Qhm8%A5byZt`y`0a2=p!?uKaf z_Yb85ed@7R$rNj3Qy3)ghUoQ`j-)g5O`&PM>=Kog*l@N}gpwq9LMh?eVlmnABw9yW z@fw=+exy68z#9i|9-p*V(<6eQ`(7yoNB^#d=G&lN_r!3q<i^09KNDb=17zm+J)Dk# z(Np7w6G?;o?@brx{t|Uu)$_Q4dPHt3?VfJO8J9P5Xi6}nLtK+`-N$jsar={P8(L{$ zW^2#S8>8!XYx&1-b{}ri!$e)a(^hv<5v>`(qMt;Tj#|hmG^+d|>}jMVad24x4u@=s zS9;KtoP7n?TC%9uJpN@ml~WgL1F4i{6Tu0R*%)v)p)L8|_65i`zpsBm?{c&MHW|RN z&q;~=Yc!--c449X_mpdW-evJ_7BjtnoOa%v7?1i*FX%SQTZbaJfvNxEcHDw!+zE2i z#rn_(W%SAsPgr=FV@hzP9)IQCw@r0R6~26^gFSWmMxe=!3@(kyYzLdousoLO>#kh# zz$}xM(yoVo)F-;w-(tCGbQjA*f(2*bLLO9FGvHvsWv=^55LRv^;p^(;=oO?rHu;qp z?s8-Vrav&oKiS77*B*}mAI^qHxK~nD!*3I<DpnuB>}NkjS}=G$eRFVTeRuj3^}CPW z8>!9c@V6@<jSpx^Fx<Sg9igk1-%lNsQyofO#z;IYt9PQ0qyXC{JOoo4xlOGFoiGlo za7%OS{kz)Q`+9wRL3-eB*ufA!U1b)k3xs>piQv1rtvu+H;Nu2?|A;z<&&9!GD}6l5 zd1W<KCt}M2&YR`FsJDi9or3%@zOz-BHQ#~O*!6W$r^!xb_KIR;#l4nS?lz7>rtKg+ z{Y56+0HA!L9$<k+c)gw93bECd(pa-e(LL*^U^QTYDkD^`<e{jI1zdJVh@9G~FG~kF zqfXMy)VcJ|zY%LzPsV~p4b71O<0`Dscsqfu<&<z=8bxqH!*BMdj~W}mUxW*AGOk7w zZCNU*LGR~?oqH&NgPAh=Fl;uJm8ZwAcO+Y!*}G<6lTr<7(t_O!U+t~cg2x2#)|oNu z{7XryJGS#gBejPO_6sKbyBc-Io#F(Hp-rIXCz#QjD0Jxgke+OB<~T*VC3#!l9KxDz z9SnFO)6X<y#0(pf3T$-Ojc${tl_uo$W4RL8AR=Sv(CQFdw_yIz%U)nv8FkUKNleWQ z1T$lrS)9kqt6yxp)++2t#^MU`;I$Z;p2QZ%sQ&d&{}8%9N8x@RT&slh5W^|8@zHF^ zgk0j0oRos301Mli4$Zf~Y}5ssowhE@`<=#6$aGv?rhJ}t8+R_KwV@9K;oKcI&i9QR zP5X?7RRAz$if3WzssPJL|GY)I?5@1pF*#i>iF4RHa||5Y1Ue5g)6;`ETr`*OLY?)n z7VQ6_7L9gpWW_nFj+8KtjwUtaCXSJs9HI2XXL9_93E!BY8?#OB_QKy#TAN#?YiKUS zC7G-U{5Pc&<A66^Uiy#{iWS|vkv1O>#kM8(siIRZC6Rv;=GhH%TxURi*jXCJ(=!jr zEA?-yzHf>Mj5~Mfi%g47Dq?tsK`jMr4@st3>&%sRv|4{hY@_hw8(H$9wXKj;U3%xZ zi{i_F`Rz-OoDHyT#O=3)6^wliRd>#m4Qzc<%bHe`fPq(h*!ecZTXZ7B06ewn5M$|3 zkYSC0Bjhj8>11nJI*6aU;-jcx3!r=KMRxMY>%MZ?m2!GXLjH<!dD)U#LMD?a2k}{o zL3-+u)gp+ynqQ_jfWOI&8aU;3E;1S~;(8bQ^94bvlLz&=r_3&KXdA2_54Vg>X3e-l zN?iTQDyE|k-Lk)LwEy9q$*bFx9i4JqI)qM08(xFhFBD4CM4xI0LS(Z6yHEUvJeZ#A z^CJ=C8)f!8EMs_Z2N5kV$C4H;Be_D1mf7jN765$ODmcBxfN6R`**(pb?fT>w+`F<? zw<<F5Yvu|S<{Rn7dr?CIRI@8)6X4=ffz_C41U@{*%}KjWl2@PLgMiv2Bt(*D=<GVg zl#<UHN{Z_m)L~GbK)oH8FTXIpG5?E2$N!XGIqrf`af2kOfAep#7(`%AkWILTMYxNc zVg#84T38SmxVino#Qxi&WnNTJA-8M_JXdLAEXR=0V_j@k{=o#KS;s3Ae0Ounm=9!n z_~Vy#3HN@4B1l#oRm)6C1`-YH;6~d&iv?V(7V3oWyuM~so##p15^}C1slp_87HJnQ ziBis@#gK7k(*h@w+<CuQJ7CLzhVOT1I`~CRXxXrTFx}?HU22N^jW9)`0q&*q{nI_{ zMy88s0iGO;!nGj(F2UD#WNhJwJ)iwBh5M71XY3MN?-I~C<;-P>aVG}k6~tb7tqx3W zor0japTCGgmto}<Z~&X+f_6W~ZDis*Haa0e{CoKQdWzQMj6v$$^=dm&oTuhX<us0& zKCXhH`n@kI3(olB(S`kx%xFl`)f|z*n4$q3oUJ5PQxE{I1%=;y3aLSvLgnFSP^@sY zw!Jh)rp4x)F{tOa?p|8u>3pK}#|JcEk<yQbqDs!gV^<rxLOp!N?i}vl$o5$-tLH%f z-x??(S*GN20|Od5w<J!zB6NYI)^l!IYt4A}u$8)@#nbWoy-%T$SzXiE18q5S#p{<( z6z1l<L~1}sf}XHV*yuC`q#YEW?8L$X$cpq(24=ge60offYzq0fhO;(2Dc6prmjQ$} zBm+*)pYB}XihKoTA|HQBChYVM3wu+7xmt)%xn*112gvm3n(x=TPl24HroI+L#QtR~ z7{NCRND+K@n9+w?vJ&~muV5sc^a4$-7vJGW4+G}5C!`e?j=E=6nSHu<No!Z1yn>ON z{rbqa<A3Fa3ER|gi9VWx=DVGsoOo||f@TSjpIL-*FTU_s6r12q-~Z-jXA8dAPF!AH zOuxM#F*Wt87n`4X2^2}O06E>;4)``5QrlJ*Yvy*67{3mjwV%ki5bWN%lDNJU+&#K1 zuKXPWo|dI8^w++b`xT3Q;$-FkwUHyNfCH-YJI%qs<Ihs(X%JbO;@hh`n#%m!CKX92 z#+IUu*zgG%v56<U`c0EiM~)1cR9*jJe1vmHB~czAwGl*z{h()T1xcXIP)lQE3+Ee_ zKu2A{1C%K-&y<!wK0vkntI}lO8+WN3%T}E8FJ%&S&w&|Xfyesg8`miE?l_+ZC3Ahu z>uw{*otRbE?Gv(=z)!l7UPa~YvOemH4#>QhWxvOcS=QU&05gT3a<9Jg{t|fa74-MO zg5{TH7mXHvJpS*{edFwgt=XS}f8!q&mQx$^_G%hI<v+%<(rh`sBP*L#a=MN#PlAus z-&&n<^7meoSM508$qa8uFK6&G>yIw;%Ds{+3G6t%GgIH~Rorq#a^8$5G+TgYHP<*D z$q28sr*nxONL4=gt-0ql1v&g@+F*IK*E}&Qy8y!r<8||cY7u6^@vo=-OXsm~FCg`S zEg~j2vzaRm>Ep;r+=$``(ZrBAZHuP@dy@qYDD2a|1`{nk+$*)wtDEl!k2Z(?D0S+v zO;;gh>y_8l7gPY#J*kYt5foR*NC`{?CW^{A#xqS(H55Iu>$uLc1{`?}Oyek*#}LMW zW|lyZ5tjpB@h~1VYy{4Z4pm$Dh-m%O5&z+iWbC;OSs|Xq>Mn$p<rBhQQji#&jad6O z@*ud}QYgWD#|X}wEx{tt_VpV#mpx?DIt3(+(S<V)V%C4u_Y8VHOx!If{&ItJmEo73 z8dBd=Z%@Fb`lpkclTla9hg|F6uDD)LROpq5y)-aHfD<<PL=ffzgs$o?|D4Eh;jej@ z=>UP5?Y_(*+QdUwCpFXRD}Yp_s@@28Ct_GJvNf*PG;!`67}}pRIzzw%;l<>Tazf$r zi@6CCz)$;b3~vqVdQ_;L<fefo#1sVn162Eay0ovf!UjzjeZ}d|RXamEC8VZ}iXPlW z42~1rxJOp3A>9^1ep6KL(+-1wXm1?Eh~+6qlt!0WCR{CYGJ(pb?!pNvsku`kAB2jp zAIOLah@txno<hWaI+yR4;N6fS<78yf5S&q~srqy8^Wt+%?83ixP>FI4tyDykeeCgD z<In^~{Pbd=MZ2{;#Cia=ZG+aWSwWnw<}AF<Mjj=_lri_}IJQ!zz3Vi;C6rvG;X9m? zW#FRAkHsxJ6}bnQMp(lxv;lk#`k9_}*>~o)gl2HNns)jvk-ntqs3G}OCA8&Z4^}|? zOXgc^ecMDJNk)^JWCJWlU(p_cu3@~^dE-lOYfTO^4x#WFj&&&T9-myB3BA%?8b>NT zl`P$Sl9E!_pIb6OpOC?#YqFt=xM``Ql|ES0!Oz0F9=H`qEwqI`qVLM$sf#rgwxLC& zgQdW<$#J(P^*)K91LYv%5S^cdh9hGKKmIr``OdlI&Yww2HvehD!QZTqe=2g;zmRP& z575-K{p)Nmjj-9X)n=GzMe;bVj;{MF<T`d?mT$e%mZ6b#dj824M3{K#Lm%r_FOWy9 zCFPVt7z-^|dv$!W%Ui*Z9xa!H+D|Mhsz9{CCP1o!c8?9ETGbyOepb-aI*6`1L;_~0 z-7;W;%-u@by}5A%`2)2U*AmB!MGxc`1-=^M{essW%Nn_3?cGBS=y~Evxp@}&8qQRU z_@TIW|G^7dB96;q#GkpwsHD-T_cY{|iNoLYp3ZC9<|Ng$M7TJDM(#74py;~SXfzOG z`end*wkKo{fP4!k0&-^QDCao@!2^a21X&f@Mr;zir=b1MtN=JX+_2fONiN6J=HI*Z zX?^o=;aH%-dK4K;8K86GvF@K2Vd-|fqB4}x4GXC9xdOvu*QW4g-gj%pMu+N{8E@Um zscLm~GlB5SbvEYtzq*}6d%`PzWBmPH<Tr*2b1A$!<BD5|Hi-0>XthkhR9nt0(?TP2 zXm^f5lB4QH1d_vOL-J$8Zp}61MO9E5VbghM!xwn~YvYaFkTvgf-d}top3Z@1hUxG_ z#_r~a@LW)RgowEPY9(6bqBa7Z1WgcJ1cp^9AWzyBmdnI~lU>9!sK|Q4FEK_G=dN>i z1}aVTCs*6ZcQ|j2J9bB8KLto$EuZHD+zEC7=2C>?VCsA(V#<1vLrISbow<Atx*d_X z0Cs&2%d=#^XE-?EeFJS&70W&KjoNY%4I`=#MJ7ulV#|h2kDV2}11%o8d-oJG@p=l4 zW6Vwy+#cFnFZa?jDPrp}`3*lRKHF9N+xk$&v%Qw)=Czs5f9~(li?LMlPL<!x;IT5x zqvtMcmQ&{R7?bW7wMmfVGzI%m_izvW!VOW?-q-J}Ld5&M{&CU=>)_|#Hhh2x+Nx|f zke+YOdx=aVePe>ap%;DBgWCq2i2&8hB9ytP+InQdex1gn`W)J~kt?P#9L~#>8((8b zevVk1f4+ZG_R9bAP(yehlQ(#QU5!0V#+ajh|ITW|WW&j-UOsu6%%MJ1+9)m{>L?y( zFl2_iRH9vxI+UieZnV@1)Swh!?nJf_gENuV984^6-lah|8+`Ql$Q{<j^#)U;jB_b1 z{TNQ$cItM39=JzyJ#3^crwHYxjgXDsbUaLj7#VMy3VxT}74t{<?VA3Tm}xWMw)Pkf zvS>NS{VnxX!2|bPz+<}5>H$cEuC8<1{j=^);4>TueOBbhgBp~=z3;%|niFu`f8||I z7e#kRG=ZXP>rH1nQ&fPQb*dfO$Se96W_Cay|BNcK=)K#VLf%tc#{jMtZ-|%$6pDPb zcAjHII%{~%EAp^)TU7ZdYSUh{!ijF7m(jWYfDT0JFly7)&qcQ#`4HtW!aTEUGs*eA zKg0185R@Y9dsF8SADuJ54HaGub{Fo3o8a9sLU==AMyeq5GC;_6B7V0Wk)6#AUy<ci z;0nOP#y(A6u@76_ht=#eMV-4#8VpL=O6gpyydm`FR}<rj9oSb7<|km?zwZkhds$Y; z+^_fUe^m;>8hD<rc(%9@_8lGtH{5V+AqE!pp@31x9Mai?ev+9$TVrOfiQ**kCQWG? z5sclbtS~O5g;)7aI5hs6tzjf9fTx+GBJfL34E}wZpx`>rA{CP#+&U|X%YSM6du&l+ z{=!mM>BRzf0bV5^g)~ryHW#%Xs%Nn@xVty(kA);nZoNVoId`~K!vVr2RL#P07|(A; zMoNXlB4BXXEa9_0&ok(Wn&(0HXFpS$HEZ8@<6@QV3R?iQN<=q@B3HWTw}uu05j$Y# zt~RL64y(}r6NU1^qxA?RDmm}rDdPn0%LIK7rOrqe%^&a_XB<DdO^&}%{$f2Vl;KaL zzvu@p2{utzs~fpL8h9Wxo=D_?nw%2P@1WpgJpmyTU3-`ut@o?d$71bmdE<NCjql&V z7xdjybHwT`<9CEs*C&w{Muas=Nl8n+N28H7r#&nWty*v|<0-Tv_!&zB-7Ul^3JEmF z4t5c}no`0brK3tj#%IVK_sh+!&>N6#_ymllsqjbG%LlR0I=!uLWi<vf6^oN0d#^N- z^aaIb77FbvrS^sSjR4B%j&|nXz@r5IF!z8Q;Ho1W-g9T^iz=53x#B_VfB-tUx|oBH zA0>mD&7oA?5Ei&pUB?w|x0K1~wGDIZ&NzX3Z~nSiUt@dyk5%8gzEp&)+s390%Vq^E zqh)<uahR4}iy`pTWq|ovLqaz|kvyY?zS!+crhXrjubc2du{Zad4=%u|dJjcG*1kLZ zmeA-k39J5VOvGp#My^^nwR&d!t%e((cW@?>wljLg1RmVa+v{3Ic=s7GpvztGo8pAZ zX_Hj~UhEqbc{j!z_V3IFx;$L5^#y@hi^xPxYtXU3TDDOEoqBfG?<cswkb^_)(id=t z;^xt*%T=(E^*3gUGqkyZKu~FOmHYX}Qvv?C7WJ3swm5-kbkz(vtJdiIF?)lBmL4*X z5#A;3%AzZRnc$}rfujXSJGA%<ti596o22aJ79yHjGqVqEzk!KZWO-URSizY*Ltm~_ z5vCcx)54Cm*B5vE|8>m^JB8sD%A?Q-(fVs+ic<|th&4N}=Yn7N2As~R)W(um?C);m z4%niF(b>lI78`=8dI#Nm-zt`B5Wh<vDLSQ~Q7ih(EoxAGNo(Lc*6sYgTwWkwFtB+b zSFYy#J0d{ACG8{cw9&sc^mfksfbgiQy`wLY-jiPy7fhuR%qiIa!KD_1ZH#KA$jn<d zws`X;?LiBWGk#^0DE7s^+x~6i9pb<K%nZ!3jyN@2@27Dg@OQQQc>z-#quX_Bz>Hkk zAwV#j-{N(I<6rmkHiFUU0|Suyp!+)S%P(!7D&JqWo`;T`+0HJ8&#FEr_j$Y8cG%ne zWHW5v+41GByw+3Tekk=Gh%jX@;c#0}4|vU*a`~s)=e}YJ$?h)xf!WfpPH&j+lk^|; z85(Br{+i~-bkA99;l+l~fvIW;aIZ|4bA0RM*9>J$dr@Vc{)EL7BdgB<pn%XK7?s6A zYAgTPmgCrW26L@_ZC@oSMmMUB_ipj8rjrfAUq`FY7;R)7Q*HF7@2*I<$<2yfWP;nq z_S`kWv)qi{+UxUF$f;`<eSX>b>fvZXuhYy`C6Cf71>k&97&~pg12Ga%aNU9j9K_GY z+VhNUd?i`&w@)#7U@?8pwD_<}cET5HcO%i4vWo=6$il_fL5a6R0k=a+=Onzt;wE`% z<CD|A2!{5CjOiWR7JfokH8?#y0(g6X7W1ZcV~A*^r+J?Ji5dUETxS<Sl>wY-W|a9c zhB(<Zim-H=MLJTR6d$N~DI}JUCH1*ghm-M*YWu|Xd!lpWCdhA=(Bgeqn{V4)0s+M{ zzP3<s{|4Qb*3AAP=~nGEly#S+yPrr_j}C%+XQV#)a~mEpu|F;2zH$AOay<VK`ryTZ zGtah4%#8gRGuMvSDeA?gclxN4U)hcQ`mvzjZGICYt!Plwc69Tdj`4)&TT#$d(!UDO zRZK4;`Sh=Kp2BaMLIgmgG|T};Z%1FSJ=hK7wc!&Mg&xrtGr+WVu6?!3GZOR&I*$iJ z9WEj?0PzDfK*G$kwM(k!7Y)88k<Ru%=`!uJ96MOvRz<P+>aXA0`ov6>%6A)3N_t%; zHf7QB<BfaFk+wq?uXK4c{o!enV7-qchN~78Rh9ahzgnnM<doUhgm1EoB&Yr~CE~B8 z)4m^S@PZS5u+2_b2pVkm%;LY|bWmM6_N{NzQvwRIE)^d)%e|~rcv&j9-|2imWmG;j zR6ak;-y+K2zRJDyRXz<=cu`gPu~g&Y5?3%)<)bSR#G3Q4A9?62b5T_}M3+L!y@XV@ za8+AHm#P&X2NdsokyQDyRr$-Rs&2ebZ_t_nGaGXuE0>TlUsYjsawU;2Wk^|_GxKzM z4$lOMpNifD2fE?l=Aj=8r#G@6>cP)ZVf#Juao3R9!#3wRVeS-hPlV$G-?!(K6LI4G zy{7F-LO5GSr+!TTv>a9#@5hRB^qzds4~n}wfuosZO=K9#Ui$7k(LYi}?xT`k@qht# zTOQ@BTY9oL7!dm=O!=)Q7HihbJkgP^6Y395w@KsIj9;-&Vo%SmO7)JXAaCCBKChn{ zN2VV+dTiC0foL<_v0>kVj&PFzb7qJ9pf}OM^Z??4f(;Ix?XI)sllx!#(Vt{iIP%RV zCg8*2Bd5}t*IVM2M0Zdd90>rIeAC}1XHBX!1b5Z>_OH?k-bcZAXgu%S&F+QA=IC0j z**vs2L~ITG!mJ_uz)rj=VLP!oyXdeyO9x(=mAp0Z9Y5J~cno`jaTlCeZ(XpyuHqCy zJ%qyU<Fhq*wall|POjgv^ePGXH>)!>VeYslE8BQsYmeneM~dBT+GHKEb5<|oR;v+f zv*FXWG`NK(?809@6iJB<tC)}WS*gFg;Gr;t*KPX-ettLDa!=sbh!1gayjGZHyzZtl zB<YwEnz((v*Q8$`NZYY`Z^tFH_zoRZ60373WPjlF+w1LRp%aT~c7DjPM=*`nbI1M~ zR(fdhupbe=|N1>=_S<A~W8I6!x7+u9*x!^Lbz?cd<$%mhTe>ypa#^~ywn3YJ%dLI` z&ZRSN%dWrLsK9JUs5&#G1$-kM=DtkHtc=B^tU#dW0Mh5pD-)%I$Z$2@16n(DGg-ks zDye)U2yECqYi;Sl2BM}CW_O{RHJ>vs!W@JFz6-Ok#PaY(p=J8u6ou&WcVeDlUYM`U znGpkqn+-*%ZhP|KCv*(S#ftLGC+4@vB)@ji{=$Od<4NK9)lXY=&RulAQFzWEy7bdw z5LwELtaKMy;`rG_m#mA<CkoFeiq5yo-xABcJXN*`RP|9*Yhx?ZLNE4ibkT2cu$A6H z07s}~w?*E2fY%i!(Yos<D7BlIcrL}d%EufInC0UOpb_6|lfHE}yk~WwP~^29ynpZ| zmm&!lPTm))PMxtHy$9bNPeKg_S3}J-g|LMWvMa6jdgZlMZl8HZJKtx3eek@UV@n$w z3z=4^w)KVvoBNYAIyz@MtwX&!#BX{XQc?<r`{nkPmBoWV|BLfPb)}8@P_gfi%yaCG zx60wS%(tbpmL+_Ew`$SIfgR*aH!#3k)L@BP{$SCvxBPbFgUvP93I~6!Qtg#DhCOV{ zu6DqZ)HR=}man#hOJ7W%B@Z~!rdh9prp8XD;nfQNAM4*tE`PnfuKj+|g;F@0vix~! z+Xs&-Y~G>V%5#5&?vAsy25>w5sq?o=tpYg><t@s;`iHgOTwgFCUy)w5a-a%Y%BuRh z7m}fGk}Yg$w7)t;fE<cuZYod?<;ts^2fSQ*<ZP?Uv^4fKV;Wu6mf2rs!CJs;%eK|7 zG}RmD52WSfVy*Vq6b>NJ4^=v4hMKFNS-otUb5;Gsh}YD5h8yQvO09ArAYMF7-g3_m z9rDUHQYX4itu;<8byPR%zEVfc@6T6MmzGs%7H#jL6MoA4-)B3_Ok>Kn?W^t=*;wrs zTf?lXs;o?BnwB8W)jY5Ti6g;XDj}3s5p;vAi<0zJZSUC^5s&Nc5^no;PO7x7>e2Q| zaqxZ=H%7ZWx0*>}&nqhpdn$*Q3|MhX0R?@>Rl;#w#EY+LG$dB0!n(R3;AnMY_KcNQ zhUYd}IqeCyQmM9rqLNTm<p-`_V_hHZU|><^r84el^70vaZr)>83n!@<44HiX+kx#s z$~)6Cj_=F8ua(_j!)I%U=KtuHcF+$hs#bN?vRg-0f6KOwrTHlnZnacamZAqWj-TAK zzFA|R+fLZuZ8>EC37YQ$mT1%)8X5}xRHx3d*jN_KW`NSpnA6S-gpmwuM)FSV%e56$ zPsSQ$tNZD)c`i?SEEn>TT;2gY-*p7s-Y|d@g4CJ$an<ofvt&BTKR1(ucd$d&X)}4) zE_*W69|bjZP!8PCU&pl=L);+h$x3g#)Of$)d++9YfJz`=!J7wE9rAO5bx><zp7ZCj z1Kk=OMX9=fHBkt`>vTF?<pAaC9l}s%DFiorP{dSW48<9V>q>y*y$OpXn~gT(nsVpz zhRlO$KtystnbPGJxon17Q>~i>siR-tcEQwbDlL}H{~7tL-i6uDsq52A=1|xceuXqe zG{ybezD7@GO*Tq4rEI1|$ma>X108=>)D!STJAzAgSCGrk7U7Izu2Ds-5p4$>icO4B z3RDVkVvvFx*Gi6|%u>V`eT5&FSI`sWjK0GkCr}J#e*hatO~#_Mq$Hz!E?msF5qkw6 zZ&mdBbElk4pR8Zd6?X?UPL*8$L!4WsXqInM5N|%XJChpIPl-#%4*ruYhenSwytnxu z?VV*<8{O9Tkpe|Zfzsl|i@UoP3KVxQP+Wr+hteX21}H9p7I%u3;4Ps9r?>?TkYd5z zp77k~+~+>`Iq$dk<1@J?GuO;s|Gj3--uuc-W_~MwzjN&^mdf-!t2~eQL@Z`(X3S<> zUHDV?r|_n5aXXoo1FZNptg;wjbTC#XJP}+G{Kosb?;SfUJ6+{J@zTr-D}05}>%7a5 zFXL59=Ncd$y~hG$QRpG9edj{2TvBQL1$$z3bJpZb{Sc@T1Ff0ub5qQ`;Jr=MRnt4A zWBK9PFqZF6n>HbhUQ*wU^&giU50{@}lV171zfewxG}${fgy=_Lyn3V|rs1i(na+Fk zb%ouMT<O^VI6aK-Q1UyIadbv%?`MPW`lTttJ*o>TI%I+YWmh>K4Zq-rBEl{NQ|3Mv z9R?hDiuIhwZ;-`(3<dPwT!&})ldnb(#)qm8=Bs5tI63jju&2E5^VXQ~TqO`X#@qV& zQHWT?*7;RX<+l;UEM4-&ylunN__X=6@;$S*eZBt12iwMC2eMYSDN`(Zfk7Np&aF3* zO0-#PFri~N$zSX~`WDs2d>D~>XddJ$<+`;L*jn#@HDm&nf)(1JJ99=Ip6WIVQUP+< z6)ZF`4&e(QA6i}FF>igJ22+jKMwL%+W=1|flVmD8arp)Lo+{^H?NeR$a8ZY3`_OR0 zU;kBpRH8Yih*fE1)ruYTUVsXM(%1Gtf2yKDtho%p7*09T`0`Dz$(Z6PmVq_r8L7o* z3Jr#s*Z1fjb9&)TrK9_Ez9((5rEFrOFxPH4xPc|#W-Z-{T=&g2TyC=Pp-2UtjnBX5 z;J9$S!eM+>isCO{FJ5E{t-(LX>U>;Lo{2o5?$bauF`^H9u5!HjU0+H%m|*sKr1{DD zoC>8%`>02*9iKZY`%|uoC4-1vEq?~{sM7Y4DF#Zcdyq<~^7WA<3$apZ&1#EliE9UF zqguWkpH#RoYbk3X>jY}Yw><C9-g(qY8w%$bKhKy}l~sZcZoNhB8+GWO<g&a9u@~^< zGu^8-)5-a6w)J%ua(MYpUb7M!@Ax2z9z!`J>L=M3R4NF0E=ta;d@ViQYNAlf#=h@? zq7lM{N<stW)!c`Z<8=kH<W#yVKde*puRRIYC7+QW)R6mMG&B41edG8*N!kBZzUr9M z3_$x8>o+@iej@tj*hopYP0pk4m}Fjt8BF|ji)tE&_-#v()q6TK3f-SNq=5rv`VHud zlmY8;#%r!!0p5?1Ue-o?WRy0Wt14I>5BQ88R3Et&Tt?YU*FU>5Cs+@xAizB#n4jvu zkGgxsqG%aj^Yk;RS!w@_8v6QoNqPZ-u}>+IpOhnb?vJC>v>uX9%U2J`go0_Fe8(p} zV~8JCIAPV>6uj1*FB~@}46{tsiJxU9UN4nk{eaO}e*6M!k3)M|Ta}XlBE*c;vtoX5 zT#mRj(7oh;T*PWnHJMLpTG46T$tYss8E*bGuO(TE;}EjEH7*U7z$lvC&v`+v)7}>y z!1m2E-EYOuovF3v2fn*a`!X;LvOdt)&-khgG>4U$bLbdfGCpQBruAUDk$gbk5|!Vm zPMn~dM4-ah=o*+gYvTV(vUhV+ls+%iyb03a5MKV;4o?lXAM1R(r3P}J?^Eh{Y2|bo z>TWFQ{^RPr_x*In`R$VZ&mejDl=LF%N#((txNG&x%M;xbTp$w^Pq`8ffQ|td#cx)= z7BCf)7A6;RY8t21vaLz5xfiu2jiw!_^x3ne4aepBLk3Lk)`x@a))zABbh314HPo|H z1TR;&wY_H7uLiTz5J5urN|_v$&j!=J@$4AQD%z*kjW*5BtPJ#c*m4dUW$YVu&kpR` zN+%o_S2)g0%!F^7&x8&=P4QA6`Y7fjMvJ(=eSa4Mj)Q~%nuF_X%JW^;KV{sE50;(| zx}{(L-rlL(Lb#-RSq~L^S&t4liWD@BJ=F+g--&W;86_-kOY`L(T&fqdmpIJ!8B#*n z4AF{Pdbe*~fev*MU~lJ(j~i-Z<zuw!w;C77BV39pyMdmb0iy(fU-xEQl)yLpD^d6& ze|ukg&c;BHV4YMQ<KgS|)e1*rKl{pFldJ}5XKP;_U!@b!jL-~KZKGYN$ffd(M4jbO zh*Tijs3pjzKLeDMrJLjBKD3^_yShE#&w|L$*7Uk3vF=sdBDEkrnB&CrZPBs1wz^Sd zu5q@*cK7S;ubbNIgzNOS;hUQ4xNGq!NDXoD9!nITtwkT+^mP=Qe;vC$C{xJo<fwk7 z{&GyXNGj2{QsDO$8RB?D<=5Kvk$*yPa5oOc7(e25s(pZfWxr&uzt5z?jJ2@qW_G>^ z9Owq6VSCKRu`W2||7Hm8m6LI(>2)$F#*cuA6~Fos^YxXgNyuzo{bR?EUsvId!v)um zP+YRvD97Sa>+DA$5mDXj^P%TM$3q4P5zw$i3&_1Q=X$7S<IxyP;qc30RZBD#N~?*J zBm2=sRS{dJ*Du3ucL$Bq_6Or=U$=hRSL#lTJLQ)i5XIdpvVUT`kk};ZrEjOO9x#2L zl@Z8)D^@3R_+}lNk!zdNFKB0;BgD)hQ_fJ%-=B0`SAnc}Sf^q8^R?zcJG}(6giN6J z$%pOk?Wj81;gDySxwWUZw7oaHmwLW0hq|(<Jas$|yq>I`d9Ai(GY=q@T6*2SneG67 zhu>=%%yGzd(tK;bHj6((#eAX@*c2QSoDtmAHrw89;e49sZZaY<x4m<+b5gvmnV*(Z zC*vOaqkU}QxFe({skJO}%^@v68#-4zf&I=%(M0(`l_p2KiISJxh5$0wEQ}$NI<Nk` zCXyb>F4Lc#N<}K(Q@r}R%=~>1Vx_#bBxM-^Hp_=I=Em^cT9Xs<#Ci_3J&XV0D>n~^ zG%EmdX-ktW&W%~kBk?!6`zuy>Eo@XSi2Gge`-7HmRPp+^kDaSm>vK6i5k_z_Ag1J^ zhdwWFUDo5;HdRds=TYa^TPLt+d-{mV<e?WIx741F6*?a?G<^8@?&__{dwMt9;*zw( zj|*Qxxm~uSp<y639tVWp;84#k>q9&$anAU(*OPBP8a>@*KDuO3&uL!1Xk+1wSN{UJ z4T&8^In#q+rRjdrBU;}81imxFf6>B5!v7!v$a}BU3f}#?<yXbwJ(dPasu?GGx<NPt zy_>8jS0Yh0`cF#S8H^qcn%5G5Tq4|a;)Z4hl2H{Hs)RccsGNbmgE_mLk=`D?=BIMN zx{;Y@wLX1NhbGQRP3)0G1K9U0<hGf7qJ;Q^t>{TQ{&_cEoBMA`NaZ%YuNj%pLcRwp z<*5ak<Ht99TP@t9l%?Ql5(av|m0C#x0LNUW#e+N-X<u_PSA}N}$F|I`Btnd+ge^O# z9XsCD)T!6SpL7eY_&rSb{@r>SBAfZBU0PmRRy2vBl73~hDk3PJb&HN?rB)YbCQ2=h z@PNZCfaUqg&z5mA)JY8^*rcoRZj$~qloDp-laPhJF(Jo~wyyzvm#oEM%Cu_HIU+}i zHbW5!o*;Xm+ex&huC$okW1#LZ5v0JhN-V4DJ~_ztE<fTb%%ez2K13;Vp{$O+*9&Di zRZvQJfHTU$Msnaju8MO`LNs^uqQ`;J<CBj8R)L>qy^IJ;$<5V%%GuQs!%cSCh2-vV z8quR|KBt${4&a1g5sLbBqP?l{zNgjKBtN>c4vwGZs5TGBjnCUMedWd=0vRVJu*+im zB#7q;NRZUxCP>q)YRih-0TP9uH*C`GUDaAu&ideLTO;1*E2d8!h~e?%@M|h3+}<k3 zcohM|;}zxY3V$lf=?FZ~PMGN)!BZUbR)o1y`$<5hQs4_B?3saw(cn2TWE1tNJTQ=< zIPfwW%;E{t6+=2wpYn*#ODJ_o#lUlV0mExxD4=<ln)tM8WCRxYU<4MAmyN6$fwiDY zbOB@_02wG?S5V1omxlN>g8I~k`t(!`DGUr;j0V%LgFA)+yYRb;A{bXflHnn5;ZIk< zJj-BwN5<tF5@@gt^qLNOtv|F?!ML)}e^)kl2~6hIJg3yvmIMz;fQO{R7y38cXo>HX ziJ;d^(BKEffyn4PWtm<8?JC%P37iIuZi$Jl-#05zUt(|-B15FbM_-a<Bb9(HG4PPc zv3UswBp@3ZLw#CGeM%S-f>M*#IF+kf>{z;J1C6x>E5hJn^TnRcEP!UegF{p-sKk%} z>eDyCKsIPF0u>q$Sdu8x7kFs}44jGv=PqB&cL7AaVCvMT3&eL$;8XiCLa*=1bi_xu zWYh&=K<B#wi{Ce-MH!F?(fL7YKaRUCWZ8_%Zfo9+0N5ijq^THkk{CcHiZlQQQs12x zH!9*&L$Q9^b!&4TvaO4=bCg?}9<YujRDEE-y*syd5n$RiFfAOMb^gD5Jz>KD7*^F{ zpgwY$CjQkMsEz)_HJakh<hbDk@r!;9!}F<oo4e3c7i?}#4~rnf+r>5nopU0;ehQRG z`IazBpuGR{3OSD=i%*A#T=v)Cc0a4jE5F}4CP9EUyT{#Tr1lz{<c|@x_?tJF3SFi{ z&Fr@EW|va7O!GW9MVfW-=Q6|69|mOb`{O#kQz)$?;u7<Fvs|D;ZzamxUbJ{+T0m}2 z#)h(V0|mC8S)7H%&Bfwx-H6?QJc#FKZga00noW61E_v$b)pA+1=6ONamR&-atqK8! zmaQG+gm9sh8ybW41-0MRRj4_eT;J|(4nHA_rt-y4=#(YPL#u<1k^EN(Bgu!(!N;sC zH^;j;0wpOQAau#YCz}g#6?$};@e`P%#Snj@1RL>ecQl>MFGo|nlV|r!RLE)~kKa!I zZhI$n_*IBtp6n>~q$2iIW0Co2=<_-k<R*vWc`G-vEmP8Kf4Ah8)W374wlB80Vq|&U zO-97eeQh1-YPOz0+Hc#>xYC{izY&DCMZhfv0c5qxooyia4K?)IA9(pJM8riACIWz= zdcfTIJTI`tRT0+c1<OT%JH7+l*Xq`Y0il`j_9Qr}Gh90Y?;19$J-frfs6ql_$U;=F z_yGuwfiLs|LV@u1AVpX%9PH-_vs?r3u7U%VyRO-Qm-y7DpsNs4Xq&$x4ArVM0kGV4 zFb_&2J~~hU8Y}@t6$(5LB|3FQwSM5G7qy?e%Mqok)xggwhdHp&tbyCd$;9hi8QpT{ zda#;NeuG62S5osa$)p2Mw^`7~6U&l7r!)`kHoLX}z&t`y#^fhOR4C8qsc1<r3Pc8# z=rF8n*W3ecjp`^o2(bGK7}Yc2XQy8oS1kGf)ob8DF{C*kOnN68jPQh|0bprfuxskm zc47d}>Yah17Yx-SaFn~+vf;=z@TC}%9@vr~K!VJmK4qppwGBcI42{6(KuRd8K>NGg z7*XUmVt{2Q;M5By;sL{wK17X9B*05bAnI}1TaRW0sw^M04HeeN;cL;m80Pc=c-Fva zhaAB4-_);mnOD))%m}smcE{GQ(gq{gI#C;#$#QXY)p+P}&eGI+&~Na4G+o=?QGY&P zX&x>mM4-V@?Q}oA`ZhK$7x>9%%D0C5b#CnK^X`s0X^xrw$8Ti@VtM_$rsxlS-ve7s z{gO{YwLU&jkftr{g7ChM76d)QZ3?QtdS)I06Ez8e=gY05b>;!cb>tiM@D-5guXWSY zf(WrfW)dxJ7DP;LsGfctdIl4QDmv}c$iC!D6m223$dtS#cu}gcZWAUcBVIe90?Qfc zl_Zq7n6QdAJ;!t|*XZ1WviipsNziF-{3Zn^-V!)Eym+sN@u@UvMkey6;rWuJu+pSX z#MO1WLz@Lwf%%k#JBCi#)(=1QnoaMA0Pi6T>#<(12Ha3+b;Pv#NTnxw%tJVMBmO6@ zrhRVVca`xGW1Jpr5Un&uv_3*+7_HXa9ukViB&Uo(qbn8faes^})Q1^Xu;KBpW<)xa zkxtFKbrh;}I>jKHGpc<;L}SiDOGne(?tt~Wc<4YA`0?BF;k}XLDK}Yp@jiEqPX%Ku zjIu7`eU^$ksl&J)Edbim_xt=k`S~tbiVy%t=xm4CRD=k6v3YSI9vz@rdjn&&09cEY z01@v=?SGw`DY=vOeC|9dEO}FM`Ee&-32eS^`JM#`^}l@YgfTp+KQC}bknr|5t0wkq zttocfY?6<V1Zr8}Mm;NSaZq7}Bi@S^ZiY(CE-Iw1?_NA5#5UTK8uH4Z;7O&!@q6GD zp=^LpawuNUGnyePc(Q)h6A1cDHH5-_@;uTLO|fMtGARr`aeP2v&T+AZZas0njOSE% zxX=)G=Hs1-`rTo?opo=-_=ZAu^7re72QQ)s5xjK4;yt@)Go|@KnRMdLakSOjbMNSd zWi5WmeL}CHVzA}D$D~p0xc27U;8353PS;0t^o=aa1%jSK@t*!L?@c<KZe{2>Jgl`E za_-bxt2%mhe(?L;8&A&rBm?V3E^ufkjbqWeRKO&-frPo<fFrz4eX5K&LH$A+i^&i* zB&<9>v2XPJ9IcM9k)ab8=L*4o5e1x*&dcBWaf&8Z0y$?Ko2RtmOTs$%ePLb8JR3-J zcQANpVqYRSYkK@B*Yv|$3n2TL2lc6sdz35g4~nbPVrx`ZO~i&BZ3G<?(G51=1dt_+ z^EGF`tN*nj)Q1<lVckjUTwl~1CRv<2g0{c;X5KNyIkQLzkLJMv8eO5d_#8QqTM3=N zWXzdG8NrJqhTelc7}>YaUnou$qQSqVRA`0KY6#sjk!=<4@s`CtZX<|BwL)7|XyNU+ zVVfo~ipq#6iD#@^wp=V3pM%zzoxf0bCzX#`%XkcJu-@i?w|)~~SdXiS1~3FE6kiHG z%D1m4kS&8yR0JKEyE#Q^tV@KCmBSZ!`DRU@GFUX%T)E1k-uFA?r1PEMZo)~(7w=Op z)hGAF6Y{g-0-i%~U&Qv!@JXV(S21E8YO3cCSKn~8Q-y|B>nAh{f`d;d7FcpISZH@9 zzdEH1=Nkka078)Z4f^F+r&xqxV+yMsw?)2v5hy;u7hzczSPxouu3;s;|8$#+W(p*e zomS$}@F3w&-7li9CO9-VM~-q5NT7x=uq0qVErwX%x2wir%CP_x$?|AqQ&r#roiY>F zXKLo2g9lPQjY<&f!!Y;!;W{}i2NsetqMcvz54toi(AC;XE|RWb7mSxMOE0vd%Po!X z-sQ@)wJns#zqmHJu8CvZu4^K;yX4!3VA|1?IYoZtTvrL4)i5QWHjMFBMa<2eC&5m| zfnXbn`4NO~bJLj2{7BTtW}jl)<_Ryph8BKfpX=}pw|R=sZrAjm-EP1deyjeVTB6#+ z_nHbmTbg0sTk%oeTbgt}${?Oip!BP88bD;31nRXCzpgK3Zr3UWZu1-Y$esul2wx0? zb^#e%jlGX6<U^T>pO9<mZ#j;~2~!Hink`hA$Euv+Y6i<0MCb3Pk7g-zWhkmtm95~8 zpe!1Z_V5>*8c<)u{vjkG9bteJ2XQcpmnQrrAoxQ|IL$po6+WHGvpHL>YgNr!R5lbG z5%Z1q#X3H*_w4*Z&oouX(sTS*Q_$QRKKGM8hC#A<R2^d3pCk`w?RuuAHnHQ8HIp@| zK6wIGTTe-0{ODcI;=NXchm3yI=1Kf0?;*a8=tyxJab62HWP}C~LQCK5SpJgmdI^&c zub+$?ug<5M{viat%`?4prQxKUQK3)<X6(Fo-)W;7mBjW4QM6Vh`^1`w7JI$QGs3|< z{kI2BXL!klXiy}bqu@6ByEk<3GJ4p@{C>w9#&Cm$VW4w$xEXsYGFea%*jem9GzK1m zP>$=*M}-_=8JtaP-?$Ml(i-)xGuaA{J2`Cu?HN1$Co+E%BeuVkeXB||b?)4U_CB9x z*nHUn6Z}Xx_}q#;2&d%XneGPp`EP-Mc}Q+D89g3NO3$O`j~+xdMp0eXYU6E5-E2WW zILm#R<UVleGlRNRlJ!=%5rc+kcFVQ2M4tJF{-TAFjhHTc-5c4~&zyCP$uvAzWf%&G zE2!F4m?R!=erhdp#$e8~a<#T6IvJT}k&5p}@7GyyQQ;)Ce!!k9i4k-_r$7>Zo2EoF zj-}`GFqnW6xre~V-#?by$AE{?qN^s4WobxU@@G$$$vr{i{)Mjf`FVHAkD|u-ZAgF{ zBwJk7(|i=YSXQq@5rm6pVFfiRJ&2VSH-$t~>RXD0<R?$$w$r$ZU*l#I4?XhF=D>8O zDY_6MBh%Y7E1_L@$6g*iX8JgxId|hJ@~cP4v?J!n1>NTXp5$q{_7lnwkPKBwnaeb* zkPoA%q`O1D@T^D^n_vL4{g=uD<T6IdILqp+SDeJu+&3z!(z*qoTHxsf?)xhb<HBdp zw|STFDPGcE<h}hSe8`SUI4iQfd*cvln3zYAQVJ>^TwYe{yNS`!^-W8eEsS4Sz7%k| z`C7F6l7szrIf|StH?P(#v{D+acNZ-xcUIppIlp;`%9-kg!8gXGF$YIBwXOlrj$&eG zioRZ~HuJS}$1?(zkSBxU11bw_bR^BXM?BetN;J__NJmhi5No_NY&Gad+<`pYA}yX! z;yrtE6o}EsDhc`^%KYY**@MkLv8wnD3mmgrI7csvay?X^h}jG*T`@^!k!{AxeI@hn z6o+4F;ryZhz$7yKH|WD(C=UMwCHBXYLMgs?ytk##I<|X&&)HA;keqkec0nSRR??R& z0@IFw73lgLJ_EAYnHG?ONWNkFkdP9UuSonMA@7Xn{5ySAcHR}bHX$nuEkiCRt*8eo z{~naJHrd<9$H&jd$1t=lHu-Jd&qnXy<Kvfp$L{S_7tK#wEUSG}4Hl@SQ&$>a3TF+y z9&5_*X1Bdo^AFufRV$A5-p#i{J0pGdn&vycJ(^NS-oZ);yQ%c&+GBhaDKU><OwN{F z&31}EWgMY*5~O0gNR(ozt4C;&=Xpk%lJ8eSeVM81`zYlK!2a`T$|yn)7^<@Nk(ixj zNJs2gjos_^bM0Pq-wZChd+ry{8{rf`q&C}PvFC=RUX^6g!2(gr>7kzVRal><n{MgV zN7ZBElv&o4wIn?QH|_H?9zDwV()!2}GcN6oke7wGEbLPqMV`*teVWCkS1yTtJ1u(B z*DNWP1Ulyv{_Gt$aeeMc-ShbncE1pfwbRf-&r|dinU~t<a7Ts|rQjOa<`MU}^Ra5> zNXhu1(^#0Q?az|Qw;5VZ79v@Ls?`gE>}nHAHZ{#hy}d58{M90JDLpXXBwGqlkqvde z%W+_eNpPv5d&b0&I>(%g5~7)6a%L)U$o?mLL@q68W?f@c{S(M7)Uo%sFGqh-5|!4c z*HNUlem~h?K%af~PKp%?RGO-Z(aYo-yPp&AMk%Yqo3Ckf(}Zl)(WhdoX~ZU%Y4azh zyvxq6DUv+WX7||+$f?aLVq{0ZQnInW^Dup~4u5Jq4yjYTfHY>Atyu6FRvC}QF?y~o z(5lcyomWrp#w8XN=onaSP)FEgU}<egr8SxbXw%)LxB`(K=XAGE0Ka@L`hZmTax5I< z-)c;^Drk4ScG#g+t($eDqS+#wLC#K5<vf<;9Iy}+ygZ4oncvkmmE+2sQXe)M59m%+ z6+Qk+y-YWfDR77stUC}K=(!~LW{T9WGKv;Icl)$$hHRJxE~t-!oQmzoVVs(9B+j9O z280*(@Mv_+ZcXYfWG!nRtJ_<4gE_bdE7^@d-4$V0bCr2~&%?`~M#Wq>fUKGVw5GJx zZ1ZSbd_&+ka*dpt$^ucaZctX_D9EkXlFKW=7g54Zp>Gg}s;_lU<U(nNcY3*XNFB5x zLJ7pG_R_^4^xZA8A<=5?_3xMQF&R+RYWdIvTu!mnQX5@M4HUog(}imN`K2;^6+4;J zf9UAt8yXc*omo)Z>>jn8tjZ_*^7*>dISV?sxf+sj#r@O~ug8Y1EOHJ{^p&PR_#S@C zm9*z>q*l=0bxJM2RvPBMmnyYO%_OueFr0A!k;32ojdjT0<X6>DOn-TZoxA1Ob7NNS zKC0=JyYP0_K+weegu)_o8)R}6(q%#E<mk-tq{tMyDs*ct?S7lfwXRdK9vbpWDq$yw zIpSm?GJGSTa<&{fIH#g~YfAL3L&6uUV;<ztLQzCsx9S#+0<BK)6|2yUg-T<lR^Z%< zRC@_7_*E2lRz(-Mw16fTqi1(KxLn<T^AD`4%2O<`{6R@fH6H`({u?FnRDK&96E8F~ zWm1V8;3+(NYW;n|#y*a9E$9u~!)X*Hu{SvX_#c!+B9QXpNBJR56eZDr%Uign#cIlA zM(KFbh@XE6)HK0+-IL$L(H52JV&nU%<s>=?yDkaV08ORFYvkZ>VN+{=(A07}uYA)2 zx$e=BeZ$z#9jF}X(*IHMxBtD9t2F_-tDH$(!3r`5a&N%}AD4tZzMt3Jy}sFu>*iq- z-#8&+R7Hwwdy0k6^9bppF_^R=FY>w*6?Z<+J8`0GyJJj|7^dcNVLZnX{h)zH$M}HX zuJ(;xt#NpU6o$Yj_09p2)zEta4>>8G^D2;M%f9)d{AJkDJrFZbp4XMxVSoC~&k+|7 zp<>katIKu6zLC!W8#SY<HnwJBcMig5N#1)n8WBSv*Zt;ckZXN{x--JxA|iUJ!ZXJ{ ze#u|Mqy8$|KSv)spE;zMH`b0-Mwf(qHg->95q)TvfS#P;G>G8GFB`RIHsq8lOMXDi z*d@Qmdt%!@Z@0V{z_Xp&-aUoUG(0T%@17|jSVlQL+}%k(+qh~LOgHM*vglZ?iwWGf zQ(X$pIz5`Qwq7()&0v$Z$Nn)uaJGmn+anFY7*OnJ16pCz_H!5fH0iHmF*?LT9qWD5 z`*u%BzFDVd$c_ia5*@hF5-`8m2TwDP2iS}1ELa_<ybC6O?L!&VWrUb@LpOpxe4L|R zLDpyD)Ut}g(Wx+WSd+RR;07e`(&fbAtODtJ-n_W~f!>CCS^I$QX#c!ppD5(ilB887 z9KI|Gr#BXPhRb&bc5i38_~fdYkRHkyV;sd~cTd|rhVdDc81usjKm9My^!zo!e5{cu z_3r!9W#xy5&+seYi?s~HRG$3K{tI`+JEoZVC-?YA@AC`On@VLRzJ5vHI~`y0!@9Re z*2rDcXVFv>FPT(Kl^d<1$g8}9D_N812M9Fs?K<0zY37Q&k3{gvxo=p=BB!j2y*&k& zN?!BDgjam{FETS+X#>;Y=YD?iAv$Z1y1WG(cdWU_i1<lmn~eJVF@)-<g>047SNI<C zd+sI92RRzd&F*Tyf-8<!PQ@uH?fyPBwj`0dVqT9)W=bu0zq-AD7KLAG8v3LA)+S0p zCF2JafKQQ_!Fb;eJ8>Y6AtOVUzYa$`_6NTg`CA+4_%ZL?J+~q;w<l<y2ojS<ljtV1 zdL7h;>F*P;>VZ4X48n65sinNo&a9GjeD}01K~lqV_kn!+X*8{f9}fysMk3;I$oP$S zW_57rT+(ZtP)uNX(@h~@npy={Lnivfr%6(2>+D>0=hOBL{iVokj_v`%@Qi$Ffx|co zn8Sqw>b+$L4|>ofcY7l(M$!XTgn7|D9ZzaDcLAMGFN^7xv1lI-4X4(_ZE5cnXO*yb z_iKcw5kUKmyYWM$AK-Eg+x*}+Igy_>V=QZvdqIS+Azu37T{ctAtLuRN*3KU7+U~5+ zjW4g_#7UI)5|@HXOK2DazsqcCne!=q!;hn0B^T=@kIB_gk-smE%;H(cl2^*5`zI!m zB98v`qqhn3cbG(*|HULGF8lw9Nle4AU*TiEXcevdT-ojp@@mZ{2#PbX=eNMN-xRa$ zp<}6g!heU>+}k$<UH0u@EDl6?D4>f^{xZ}MuFR7($yFl)On`6u)CjrQJIs}iEn_mR zbv01PNWetKC$?9IpQJJWjg<(}I#JgwM<(G+^q0n^hZy#~eCtr&J@7JMK=QhdEtz<X zPc1`*#D3z`u|9$?-=l*RHpXi0guH{+P0EYsSK4QU)k>r_^%b~0c`-Abcz}&&SLVyc zch=)fFIDc^(YT|vZuia5A2<&P&r}F;>e)`4-ncAWU4qw(UuL>$omBdL<`y!tWHcY5 zk0cMe`j)`vu;u(sUJQKnzINP&tVG3YycH|KCFUWU3~pX4CG-~h<t3St_6mhQK*R2M zKQy3K@Fw@CvbRsj6W8!scYW%|zm4YVUVQtl8OPJRl;0x$sE(qqUH?-Kv31^)@DKFs z{sm+T1F>2sJeh@@eA6Z7+j*~a>_`*?gq|jfV%vt`3NbrzJCi3GDRGms*y7OcPl)j! zVzPQ|ZA#%MQgp3^>v-;IzXHvv<S%hHmE7ZVxrR2>C-v-)`szGWsW)5{AHZL-bUWM# zJtS|*E*Z~~j6bwar$Ar4D91ZZ@BEgWmzMUC<(XWzp$*Sr@E#AeT;6iN!9QbqEwXT6 z$)-iTF*%a{t7sjGPg+AmvX+{b+KdX(_27Cv$m=wasMe^l^J<&utk>)6iiqxfbd?`C zifi3TdHGpAIluTVeZ@n0E<+w$7CCPt_<6ptyoYP3&y3t4?c-KzoTqZM3Yu?40T$F9 zdh)+ek9^ycs0>>$NsaLx6_ETASRJi1+Yt%y-AYN>Z|$^jXp|k5R343b$JARWrq%n> z`b?EbZHTOX%^7oeN^H#VJ3BN*7sIkxtbM`n{D51%i^Czjm_x4B7(S8~@vaK%u<UWS z;RP3#+fiX4TijF4M+*4T*p&iYTew_@-2w{uO{DQp%6|O%M0ZgE$a10iVp}yKLX$SH zpHA+QH4rLBC@kkgAaN#IKV(yc?cz&WS=GsC_0^_myWis#V2m$$iE&t57vtS0-B{IO zq4>hCc7iAp5gL`=TeN?_eEBOfk^aA3zWg6F@&BNS|G%M$=oqAEe_#_G{)SD&{Rch~ z4UOm@Ykxu%wbbs+{>V>2WBycZC!t!97gg%03Js0qPcu5y8VhRv(~R53!_(c#*2ep< z_Eac)kDXn@5p*;(k^5+9ceKVoCOXt23Z?ol`+qb4!|S-edHwJo#(#Jnh4SW4^FNX$ z{I%}8+zNihO}X3c7^nomcxX@mG`_35{y&ZXas%NG1NnEYzvpTAL+(xsHiGeYNB*Mq z$IXbptNnF6xI?J^G0~wG@eBW<ruEkZ5GbJPA7cM+Am$%pcW0Jx`7dJs<X!&Nm;VOH z{KK3MwUGL6=6^Z1zsKoL?e8~g{-uV=i21KL{nMGhsQqW8?)3f|sk@Q$UwWN9|3&XV YV}*sH)S{u`qdwS}XlM%js4ukt0VG0eF8}}l literal 0 HcmV?d00001 diff --git a/pd/portmidi/portmusic_logo.png b/pd/portmidi/portmusic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..17a063a6ab93ce6976acf0de8fad8c30f23e7394 GIT binary patch literal 753 zcmV<N0uKF&P)<h;3K|Lk000e1NJLTq003A30018d0{{R3R2KTu00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyFi=cXMa<01 ziHV7^v9XMd(PwMS*x2bA8Z|~pv?nT=b%gO%RaLvY<bja+005Z)00960{{hm`J^%m$ zM@d9MRCwCVmWz_4APhx$CA<Xw|8MsusI89OU9;0uyHtrt<KgBeGGqELHPe^dHh$QC z4mKn`nNNeQb=uok;LK^s`2lv$y7G>zs>>TI)OFA&*bc|zi<H@Dy|Y?S+#4|Wm?Js` z8#inj#aPQ^T(QK%V6Rfhmg0=<*t+zIx7``g`%^HhA)EyasRiBv1|JQ}F2g#RDHs)m zZ_VmdCu<2Cm!}@H-nuGwb}(s}R)lI#MRJ8{$rhE>DEU#Qhkd3v=|kwN$IzhQLP!rW z1R_{tWV$$lc$u3S6s@}HD{$lqCJA}i`Es|0MHTju_%SONuZkzXJWZZzU9>D_@juEQ zQ1hmwi+KvpU8-2S?|;PS!n}e5Wb@yg70m9{CoLtse;}Vcgan-O=fP_sPcTKaK<D+| z*D*p2L;84u`4(@%A#raHaBbSo<k-A)tq#I(7jX6d2Ao+>pc8md0;obEKzPgh)S@SV z!w3SFNx6oX;Oag)f|c9T89V^ST_oa$2Z^CZj0jiLHFEiu5Q|t5WVJtlr{JDXV2@=g z8ZXLY-K_9)lN}seBsc-ExHRexM%KiK2Y2__>r#w0fDK%e?sQO$cm!NG;}wjYaSBTg zS8&DF_h7FU?cgD?MS$r9PMi;4^vPo>D`-hAY~WatJlRl_i!>quBX}4uU?e4K4i%iY zlySNNOLgIm`B-Q2HZVAnSzVGyz|hc6$y@dV^Xp$}s&p9FbM4Y~$sAq}p}pQdd{)H# j|NJNP55T|F{s=Gt?@5G_w9tJQ00000NkvXXu0mjfb!S&6 literal 0 HcmV?d00001 diff --git a/pd/portmidi/porttime/porttime-VC8.vcproj b/pd/portmidi/porttime/porttime-VC8.vcproj new file mode 100644 index 000000000..3a5cef474 --- /dev/null +++ b/pd/portmidi/porttime/porttime-VC8.vcproj @@ -0,0 +1,225 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="porttime" + ProjectGUID="{338224B8-D575-408D-BACF-95C557B429BE}" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + OutputDirectory=".\Release" + IntermediateDirectory=".\Release" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB" + StringPooling="true" + RuntimeLibrary="0" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\Release/porttime.pch" + AssemblerListingLocation=".\Release/" + ObjectFile=".\Release/" + ProgramDataBaseFileName=".\Release/" + WarningLevel="3" + SuppressStartupBanner="true" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\Release\porttime.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Release/porttime.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\Debug" + IntermediateDirectory=".\Debug" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="_LIB;WIN32;_DEBUG" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + PrecompiledHeaderFile=".\Debug/porttime.pch" + AssemblerListingLocation=".\Debug/" + ObjectFile=".\Debug/" + ProgramDataBaseFileName=".\Debug/" + WarningLevel="3" + SuppressStartupBanner="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\Debug\porttime.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\Debug/porttime.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" + > + <File + RelativePath="porttime.c" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="ptwinmm.c" + > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl" + > + <File + RelativePath="porttime.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/porttime/porttime.c b/pd/portmidi/porttime/porttime.c old mode 100644 new mode 100755 diff --git a/pd/portmidi/porttime/porttime.dsp b/pd/portmidi/porttime/porttime.dsp old mode 100644 new mode 100755 diff --git a/pd/portmidi/porttime/porttime.h b/pd/portmidi/porttime/porttime.h old mode 100644 new mode 100755 index 029ea7779..ff22de9d5 --- a/pd/portmidi/porttime/porttime.h +++ b/pd/portmidi/porttime/porttime.h @@ -1,36 +1,92 @@ -/* porttime.h -- portable interface to millisecond timer */ - -/* CHANGE LOG FOR PORTTIME - 10-Jun-03 Mark Nelson & RBD - boost priority of timer thread in ptlinux.c implementation - */ - -/* Should there be a way to choose the source of time here? */ - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef enum { - ptNoError = 0, - ptHostError = -10000, - ptAlreadyStarted, - ptAlreadyStopped, - ptInsufficientMemory -} PtError; - - -typedef long PtTimestamp; - -typedef void (PtCallback)( PtTimestamp timestamp, void *userData ); - - -PtError Pt_Start(int resolution, PtCallback *callback, void *userData); -PtError Pt_Stop(); -int Pt_Started(); -PtTimestamp Pt_Time(); - -#ifdef __cplusplus -} -#endif +/* porttime.h -- portable interface to millisecond timer */ + +/* CHANGE LOG FOR PORTTIME + 10-Jun-03 Mark Nelson & RBD + boost priority of timer thread in ptlinux.c implementation + */ + +/* Should there be a way to choose the source of time here? */ + +#ifdef WIN32 +#ifndef INT32_DEFINED +// rather than having users install a special .h file for windows, +// just put the required definitions inline here. portmidi.h uses +// these too, so the definitions are (unfortunately) duplicated there +typedef int int32_t; +typedef unsigned int uint32_t; +#define INT32_DEFINED +#endif +#else +#include <stdint.h> // needed for int32_t +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef PMEXPORT +#ifdef _WINDLL +#define PMEXPORT __declspec(dllexport) +#else +#define PMEXPORT +#endif +#endif + +typedef enum { + ptNoError = 0, /* success */ + ptHostError = -10000, /* a system-specific error occurred */ + ptAlreadyStarted, /* cannot start timer because it is already started */ + ptAlreadyStopped, /* cannot stop timer because it is already stopped */ + ptInsufficientMemory /* memory could not be allocated */ +} PtError; + + +typedef int32_t PtTimestamp; + +typedef void (PtCallback)( PtTimestamp timestamp, void *userData ); + +/* + Pt_Start() starts a real-time service. + + resolution is the timer resolution in ms. The time will advance every + resolution ms. + + callback is a function pointer to be called every resolution ms. + + userData is passed to callback as a parameter. + + return value: + Upon success, returns ptNoError. See PtError for other values. +*/ +PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData); + +/* + Pt_Stop() stops the timer. + + return value: + Upon success, returns ptNoError. See PtError for other values. +*/ +PMEXPORT PtError Pt_Stop(); + +/* + Pt_Started() returns true iff the timer is running. +*/ +PMEXPORT int Pt_Started(); + +/* + Pt_Time() returns the current time in ms. +*/ +PMEXPORT PtTimestamp Pt_Time(); + +/* + Pt_Sleep() pauses, allowing other threads to run. + + duration is the length of the pause in ms. The true duration + of the pause may be rounded to the nearest or next clock tick + as determined by resolution in Pt_Start(). +*/ +PMEXPORT void Pt_Sleep(int32_t duration); + +#ifdef __cplusplus +} +#endif diff --git a/pd/portmidi/porttime/porttime.vcproj b/pd/portmidi/porttime/porttime.vcproj new file mode 100755 index 000000000..374ee5094 --- /dev/null +++ b/pd/portmidi/porttime/porttime.vcproj @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="PortTime" + ProjectGUID="{338224B8-D575-408D-BACF-95C557B429BE}" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + InlineFunctionExpansion="1" + PreprocessorDefinitions="WIN32;NDEBUG;_LIB" + StringPooling="true" + RuntimeLibrary="0" + EnableFunctionLevelLinking="true" + PrecompiledHeaderFile=".\$(OutDir)\porttime.pch" + AssemblerListingLocation=".\$(OutDir)\" + ObjectFile=".\$(OutDir)\" + ProgramDataBaseFileName=".\$(OutDir)\" + WarningLevel="3" + SuppressStartupBanner="true" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\$(OutDir)\porttime.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\$(OutDir)\porttime.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="_LIB;WIN32;_DEBUG" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + PrecompiledHeaderFile=".\$(OutDir)\porttime.pch" + AssemblerListingLocation=".\$(OutDir)\" + ObjectFile=".\$(OutDir)\" + ProgramDataBaseFileName=".\$(OutDir)\" + WarningLevel="3" + SuppressStartupBanner="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + OutputFile=".\$(OutDir)\porttime.lib" + SuppressStartupBanner="true" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile=".\$(OutDir)\porttime.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\porttime.c" + > + </File> + <File + RelativePath=".\porttime.h" + > + </File> + <File + RelativePath=".\ptwinmm.c" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/pd/portmidi/porttime/ptlinux.c b/pd/portmidi/porttime/ptlinux.c old mode 100644 new mode 100755 index 468575aa3..077402f54 --- a/pd/portmidi/porttime/ptlinux.c +++ b/pd/portmidi/porttime/ptlinux.c @@ -40,6 +40,7 @@ CHANGE LOG static int time_started_flag = FALSE; static struct timeb time_offset = {0, 0, 0, 0}; static pthread_t pt_thread_pid; +static int pt_thread_created = FALSE; /* note that this is static data -- we only need one copy */ typedef struct { @@ -59,7 +60,7 @@ static void *Pt_CallbackProc(void *p) /* printf("pt_callback_proc_id %d, id %d\n", pt_callback_proc_id, parameters->id); */ if (geteuid() == 0) setpriority(PRIO_PROCESS, 0, -20); - while (pt_callback_proc_id == parameters->id) { + while (pt_callback_proc_id == parameters->id) { /* wait for a multiple of resolution ms */ struct timeval timeout; int delay = mytime++ * parameters->resolution - Pt_Time(); @@ -91,6 +92,7 @@ PtError Pt_Start(int resolution, PtCallback *callback, void *userData) res = pthread_create(&pt_thread_pid, NULL, Pt_CallbackProc, parms); if (res != 0) return ptHostError; + pt_thread_created = TRUE; } time_started_flag = TRUE; return ptNoError; @@ -101,7 +103,10 @@ PtError Pt_Stop() { /* printf("Pt_Stop called\n"); */ pt_callback_proc_id++; - pthread_join(pt_thread_pid, NULL); + if (pt_thread_created) { + pthread_join(pt_thread_pid, NULL); + pt_thread_created = FALSE; + } time_started_flag = FALSE; return ptNoError; } @@ -124,4 +129,10 @@ PtTimestamp Pt_Time() } +void Pt_Sleep(int32_t duration) +{ + usleep(duration * 1000); +} + + diff --git a/pd/portmidi/porttime/ptmacosx_cf.c b/pd/portmidi/porttime/ptmacosx_cf.c old mode 100644 new mode 100755 index c0c22a32e..a174c864e --- a/pd/portmidi/porttime/ptmacosx_cf.c +++ b/pd/portmidi/porttime/ptmacosx_cf.c @@ -133,3 +133,8 @@ PtTimestamp Pt_Time() return (PtTimestamp) ((now - startTime) * 1000.0); } + +void Pt_Sleep(int32_t duration) +{ + usleep(duration * 1000); +} diff --git a/pd/portmidi/porttime/ptmacosx_mach.c b/pd/portmidi/porttime/ptmacosx_mach.c old mode 100644 new mode 100755 index 37d4318b7..753f5832e --- a/pd/portmidi/porttime/ptmacosx_mach.c +++ b/pd/portmidi/porttime/ptmacosx_mach.c @@ -8,6 +8,7 @@ #import <mach/mach_error.h> #import <mach/mach_time.h> #import <mach/clock.h> +#include <unistd.h> #include "porttime.h" #include "sys/time.h" @@ -62,7 +63,7 @@ static void *Pt_CallbackProc(void *p) /* wait for a multiple of resolution ms */ UInt64 wait_time; int delay = mytime++ * parameters->resolution - Pt_Time(); - long timestamp; + PtTimestamp timestamp; if (delay < 0) delay = 0; wait_time = AudioConvertNanosToHostTime((UInt64)delay * NSEC_PER_MSEC); wait_time += AudioGetCurrentHostTime(); @@ -103,6 +104,7 @@ PtError Pt_Stop() { /* printf("Pt_Stop called\n"); */ pt_callback_proc_id++; + pthread_join(pt_thread_pid, NULL); time_started_flag = FALSE; return ptNoError; } @@ -122,3 +124,8 @@ PtTimestamp Pt_Time() return (PtTimestamp)(nsec_time / NSEC_PER_MSEC); } + +void Pt_Sleep(int32_t duration) +{ + usleep(duration * 1000); +} diff --git a/pd/portmidi/porttime/ptwinmm.c b/pd/portmidi/porttime/ptwinmm.c old mode 100644 new mode 100755 index bbfebb0ec..52046592c --- a/pd/portmidi/porttime/ptwinmm.c +++ b/pd/portmidi/porttime/ptwinmm.c @@ -14,14 +14,14 @@ static long time_resolution; static MMRESULT timer_id; static PtCallback *time_callback; -void CALLBACK winmm_time_callback(UINT uID, UINT uMsg, DWORD dwUser, - DWORD dw1, DWORD dw2) +void CALLBACK winmm_time_callback(UINT uID, UINT uMsg, DWORD_PTR dwUser, + DWORD_PTR dw1, DWORD_PTR dw2) { (*time_callback)(Pt_Time(), (void *) dwUser); } -PtError Pt_Start(int resolution, PtCallback *callback, void *userData) +PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData) { if (time_started_flag) return ptAlreadyStarted; timeBeginPeriod(resolution); @@ -31,14 +31,14 @@ PtError Pt_Start(int resolution, PtCallback *callback, void *userData) time_callback = callback; if (callback) { timer_id = timeSetEvent(resolution, 1, winmm_time_callback, - (DWORD) userData, TIME_PERIODIC | TIME_CALLBACK_FUNCTION); + (DWORD_PTR) userData, TIME_PERIODIC | TIME_CALLBACK_FUNCTION); if (!timer_id) return ptHostError; } return ptNoError; } -PtError Pt_Stop() +PMEXPORT PtError Pt_Stop() { if (!time_started_flag) return ptAlreadyStopped; if (time_callback && timer_id) { @@ -52,14 +52,19 @@ PtError Pt_Stop() } -int Pt_Started() +PMEXPORT int Pt_Started() { return time_started_flag; } -PtTimestamp Pt_Time() +PMEXPORT PtTimestamp Pt_Time() { return timeGetTime() - time_offset; } + +PMEXPORT void Pt_Sleep(int32_t duration) +{ + Sleep(duration); +} -- GitLab