zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 3d4bb34ad39d0d3d24fd5ae76c580903ef10d139
parent 61561b9530b2a2bf67d9348bab9f29f610ea00fb
Author: fundamental <[email protected]>
Date:   Tue, 26 Jul 2016 16:50:20 -0400

Merge branch 'win64'

Diffstat:
Acmake/FindFFTW.cmake | 17+++++++++++++++++
Acmake/FindLIBLO.cmake | 17+++++++++++++++++
Acmake/FindMXML.cmake | 17+++++++++++++++++
Acmake/FindPA.cmake | 17+++++++++++++++++
Acmake/FindPORTAUDIO.cmake | 15+++++++++++++++
Msrc/CMakeLists.txt | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/DSP/SVFilter.cpp | 1+
Msrc/DSP/Unison.cpp | 2++
Msrc/Misc/BankDb.cpp | 24+++++++++++++++++++++++-
Msrc/Misc/MiddleWare.cpp | 4+++-
Msrc/Misc/Schema.cpp | 2+-
Msrc/Misc/Util.cpp | 1+
Msrc/Plugin/CMakeLists.txt | 4++--
Msrc/Plugin/ZynAddSubFX/CMakeLists.txt | 6++++--
Msrc/Synth/OscilGen.cpp | 6++++--
Msrc/Synth/SUBnote.cpp | 4++++
Msrc/UI/NSM.C | 2+-
Msrc/main.cpp | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
18 files changed, 301 insertions(+), 35 deletions(-)

diff --git a/cmake/FindFFTW.cmake b/cmake/FindFFTW.cmake @@ -0,0 +1,17 @@ +#Find FFTW + +find_path(FFTW_INCLUDE_DIR + NAMES fftw3.h + PATHS ${FFTW_INCLUDE_DIRS} + ) + +find_library(FFTW_LIBRARIES + NAMES fftw3 + PATHS ${FFTW_LIBRARY_DIRS} + ) + +set(FFTW_PROCESS_INCLUDES FFTW_INCLUDE_DIR) +set(FFTW_PROCESS_LIBS FFTW_LIBRARIES) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW DEFAULT_MSG + FFTW_INCLUDE_DIR FFTW_LIBRARIES) diff --git a/cmake/FindLIBLO.cmake b/cmake/FindLIBLO.cmake @@ -0,0 +1,17 @@ +#Find Lo + +find_path(LIBLO_INCLUDE_DIR + NAMES lo/lo.h + PATHS ${LIBLO_INCLUDE_DIRS} + ) + +find_library(LIBLO_LIBRARIES + NAMES lo + PATHS ${LIBLO_LIBRARY_DIRS} + ) + +set(LIBLO_PROCESS_INCLUDES LIBLO_INCLUDE_DIR) +set(LIBLO_PROCESS_LIBS LIBLO_LIBRARIES) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBLO DEFAULT_MSG + LIBLO_INCLUDE_DIR LIBLO_LIBRARIES) diff --git a/cmake/FindMXML.cmake b/cmake/FindMXML.cmake @@ -0,0 +1,17 @@ +#Find MXML + +find_path(MXML_INCLUDE_DIR + NAMES mxml.h + PATHS ${MXML_INCLUDE_DIRS} + ) + +find_library(MXML_LIBRARIES + NAMES mxml + PATHS ${MXML_LIBRARY_DIRS} + ) + +set(MXML_PROCESS_INCLUDES MXML_INCLUDE_DIR) +set(MXML_PROCESS_LIBS MXML_LIBRARIES) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(MXML DEFAULT_MSG + MXML_INCLUDE_DIR MXML_LIBRARIES) diff --git a/cmake/FindPA.cmake b/cmake/FindPA.cmake @@ -0,0 +1,17 @@ +#Find FFTW + +find_path(FFTW_INCLUDE_DIR + NAMES fftw3.h + PATHS ${FFTW_INCLUDE_DIRS} + ) + +find_library(FFTW_LIBRARIES + NAMES fftw3 + PATHS ${FFTW_LIBRARY_DIRS} + ) + +set(FFTW_PROCESS_INCLUDES FFTW_INCLUDE_DIR) +set(FFTW_PROCESS_LIBS FFTW_LIBRARIES) +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW DEFAULT_MSG + FFTW_INCLUDE_DIR FFTW_LIBRARIES) diff --git a/cmake/FindPORTAUDIO.cmake b/cmake/FindPORTAUDIO.cmake @@ -0,0 +1,15 @@ +#Find PORTAUDIO + +find_path(PORTAUDIO_INCLUDE_DIR + NAMES portaudio.h + PATHS ${PORTAUDIO_INCLUDE_DIRS} + ) + +find_library(PORTAUDIO_LIBRARIES + NAMES portaudio + PATHS ${PORTAUDIO_LIBRARY_DIRS} + ) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG + PORTAUDIO_INCLUDE_DIR PORTAUDIO_LIBRARIES) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt @@ -6,21 +6,16 @@ message(STATUS "Checking Library Path" $ENV{CMAKE_LIBRARY_PATH} ${CMAKE_LIBRARY_ include(CheckFunctionExists) include(CheckIncludeFile) include(CheckCXXSourceCompiles) -include(CheckCXXCompilerFlag) -find_package(PkgConfig REQUIRED) +include(CheckCXXCompilerFlag) +if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")) + find_package(PkgConfig) +endif() find_package(zlib REQUIRED) find_package(X11) check_include_file(X11/xpm.h HAS_XPM) -pkg_check_modules(FFTW REQUIRED fftw3) -pkg_check_modules(MXML REQUIRED mxml) find_package(Threads REQUIRED) find_package(OSS) find_package(Alsa) -pkg_check_modules(JACK jack) -pkg_check_modules(PORTAUDIO portaudio-2.0>=19) -set(FLTK_SKIP_OPENGL true) -pkg_check_modules(NTK ntk) -pkg_check_modules(NTK_IMAGES ntk_images) find_package(FLTK) find_package(OpenGL) #for FLTK find_package(CxxTest) @@ -28,12 +23,31 @@ if(CXXTEST_FOUND) set(CXXTEST_USE_PYTHON TRUE) endif() # lash -pkg_search_module(LASH lash-1.0) -mark_as_advanced(LASH_LIBRARIES) -pkg_search_module(DSSI dssi>=0.9.0) -mark_as_advanced(DSSI_LIBRARIES) -pkg_search_module(LIBLO liblo>=0.26 REQUIRED) -mark_as_advanced(LIBLO_LIBRARIES) +if(PkgConfig_FOUND AND NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")) + message("Looking For pkg config modules") + pkg_check_modules(JACK jack) + pkg_check_modules(PORTAUDIO portaudio-2.0>=19) + set(FLTK_SKIP_OPENGL true) + pkg_check_modules(NTK ntk) + pkg_check_modules(NTK_IMAGES ntk_images) + + pkg_check_modules(FFTW REQUIRED fftw3) + pkg_check_modules(MXML REQUIRED mxml) + + pkg_check_modules(PORTAUDIO portaudio-2.0>=19) + + pkg_search_module(LASH lash-1.0) + mark_as_advanced(LASH_LIBRARIES) + pkg_search_module(DSSI dssi>=0.9.0) + mark_as_advanced(DSSI_LIBRARIES) + pkg_search_module(LIBLO liblo>=0.26 REQUIRED) + mark_as_advanced(LIBLO_LIBRARIES) +else() + find_package(FFTW REQUIRED) + find_package(MXML REQUIRED) + find_package(LIBLO REQUIRED) + find_package(PORTAUDIO) +endif() CHECK_FUNCTION_EXISTS(sched_setscheduler HAVE_SCHEDULER) set(CMAKE_REQUIRED_FLAGS "-std=c++11") @@ -88,6 +102,9 @@ SET (PluginLibDir "lib" CACHE STRING # Add version information add_definitions(-DVERSION="${VERSION}") +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + add_definitions(-static) +endif() if(NOT "Darwin" STREQUAL ${CMAKE_SYSTEM_NAME}) # Add scheduler function existance info (OSX compatiability) @@ -236,6 +253,10 @@ message(STATUS "Compiling with liblo") # other include directories include_directories(${ZLIB_INCLUDE_DIRS} ${MXML_INCLUDE_DIRS}) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + add_definitions(-DWIN32) +endif() + add_definitions( -Wall -Wextra @@ -273,7 +294,9 @@ else (BuildForDebug) message (STATUS "Building for ${CMAKE_BUILD_TYPE}, flags: ${CMAKE_CXX_FLAGS_RELEASE}") endif (BuildForDebug) -add_definitions(-fPIC) +if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")) + add_definitions(-fPIC) +endif() if(FLTK_FOUND) mark_as_advanced(FORCE FLTK_BASE_LIBRARY) @@ -329,8 +352,8 @@ endif() if(NtkGui) - find_program( FLTK_FLUID_EXECUTABLE ntk-fluid) - + find_program( FLTK_FLUID_EXECUTABLE ntk-fluid) + message(STATUS ${NTK_LDFLAGS} ${NTK_IMAGES_LDFLAGS}) set(GUI_LIBRARIES zynaddsubfx_gui ${NTK_LIBRARIES} ${NTK_IMAGES_LIBRARIES} ${OPENGL_LIBRARIES}) @@ -405,12 +428,24 @@ add_library(zynaddsubfx_core STATIC ${zynaddsubfx_synth_SRCS} ) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + set(PTHREAD_LIBRARY winpthread) + set(PLATFORM_LIBRARIES ws2_32 + winmm + wsock32 + "-static" iphlpapi + "-static" winpthread) +else() + set(PLATFORM_LIBRARIES "") + set(PTHREAD_LIBRARY pthread) +endif() + target_link_libraries(zynaddsubfx_core ${ZLIB_LIBRARIES} ${FFTW_LIBRARIES} ${MXML_LIBRARIES} ${OS_LIBRARIES} - pthread + ${PTHREAD_LIBRARY} rtosc rtosc-cpp) if(CompileTests) @@ -429,7 +464,8 @@ target_link_libraries(zynaddsubfx ${GUI_LIBRARIES} ${NIO_LIBRARIES} ${AUDIO_LIBRARIES} - ) + ${PLATFORM_LIBRARIES} + ) if (DssiEnable) add_library(zynaddsubfx_dssi SHARED diff --git a/src/DSP/SVFilter.cpp b/src/DSP/SVFilter.cpp @@ -18,6 +18,7 @@ #include "../Misc/Util.h" #include "SVFilter.h" +#define errx(...) #ifndef errx #include <err.h> #endif diff --git a/src/DSP/Unison.cpp b/src/DSP/Unison.cpp @@ -18,6 +18,8 @@ #include "Unison.h" #include "globals.h" +#define errx(...) +#define warnx(...) #ifndef errx #include <err.h> #endif diff --git a/src/Misc/BankDb.cpp b/src/Misc/BankDb.cpp @@ -14,9 +14,31 @@ BankEntry::BankEntry(void) :id(0), add(false), pad(false), sub(false) {} +bool platform_strcasestr(const char *hay, const char *needle) +{ + int n = strlen(hay); + int m = strlen(needle); + for(int i=0; i<n; i++) { + int good = 1; + for(int j=0; j<m; ++j) { + if(toupper(hay[i+j]) != toupper(needle[j])) { + good = 0; +break; +} + + } + if(good) + return 1; + } + return 0; + +} + bool sfind(std::string hay, std::string needle) { - return strcasestr(hay.c_str(), needle.c_str()); + //return strcasestr(hay.c_str(), needle.c_str()); + return platform_strcasestr(hay.c_str(), needle.c_str()); + return false; } bool BankEntry::match(string s) const diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp @@ -49,6 +49,8 @@ #include <atomic> #include <list> +#define errx(...) +#define warnx(...) #ifndef errx #include <err.h> #endif @@ -489,7 +491,7 @@ public: assert(actual_load[npart] <= pending_load[npart]); //load part in async fashion when possible -#if HAVE_ASYNC +#if 0 auto alloc = std::async(std::launch::async, [master,filename,this,npart](){ Part *p = new Part(*master->memory, synth, diff --git a/src/Misc/Schema.cpp b/src/Misc/Schema.cpp @@ -168,7 +168,7 @@ void dump_param_cb(const rtosc::Port *p, const char *full_name, void *v) const char *max = meta["max"]; for(auto m:meta) { - if(strlen(m.title) >= 5 && !bcmp(m.title, "map ", 4)) { + if(strlen(m.title) >= 5 && !memcmp(m.title, "map ", 4)) { int id = atoi(m.title+4); std::string val = m.value; options.push_back(std::make_pair(id, val)); diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp @@ -29,6 +29,7 @@ #include <sched.h> #endif +#define errx(...) #ifndef errx #include <err.h> #endif diff --git a/src/Plugin/CMakeLists.txt b/src/Plugin/CMakeLists.txt @@ -5,8 +5,6 @@ CHECK_LIBRARY_EXISTS(dl dlopen "" LIBDL_FOUND) IF(LIBDL_FOUND) target_link_libraries(lv2-ttl-generator "dl") -ENDIF(LIBDL_FOUND) - add_subdirectory(AlienWah) add_subdirectory(Chorus) add_subdirectory(Distortion) @@ -14,4 +12,6 @@ add_subdirectory(DynamicFilter) add_subdirectory(Echo) add_subdirectory(Phaser) add_subdirectory(Reverb) +ENDIF(LIBDL_FOUND) + add_subdirectory(ZynAddSubFX) diff --git a/src/Plugin/ZynAddSubFX/CMakeLists.txt b/src/Plugin/ZynAddSubFX/CMakeLists.txt @@ -69,8 +69,10 @@ set_target_properties(ZynAddSubFX_vst PROPERTIES LIBRARY_OUTPUT_DIRECTORY "vst") set_target_properties(ZynAddSubFX_vst PROPERTIES OUTPUT_NAME "ZynAddSubFX") set_target_properties(ZynAddSubFX_vst PROPERTIES PREFIX "") -target_link_libraries(ZynAddSubFX_lv2 zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES}) -target_link_libraries(ZynAddSubFX_vst zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES}) +target_link_libraries(ZynAddSubFX_lv2 zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES} + ${PLATFORM_LIBRARIES}) +target_link_libraries(ZynAddSubFX_vst zynaddsubfx_core ${OS_LIBRARIES} ${LIBLO_LIBRARIES} + ${PLATFORM_LIBRARIES}) install(TARGETS ZynAddSubFX_lv2 LIBRARY DESTINATION ${PluginLibDir}/lv2/ZynAddSubFX.lv2/) install(TARGETS ZynAddSubFX_vst LIBRARY DESTINATION ${PluginLibDir}/vst/) diff --git a/src/Synth/OscilGen.cpp b/src/Synth/OscilGen.cpp @@ -27,8 +27,6 @@ #include <rtosc/ports.h> #include <rtosc/port-sugar.h> -pthread_t main_thread; - #define rObject OscilGen const rtosc::Ports OscilGen::non_realtime_ports = { rSelf(OscilGen), @@ -228,6 +226,10 @@ const rtosc::MergePorts OscilGen::ports{ &OscilGen::non_realtime_ports }; +#ifndef M_PI_2 +# define M_PI_2 1.57079632679489661923 /* pi/2 */ +#endif + //operations on FFTfreqs inline void clearAll(fft_t *freqs, int oscilsize) diff --git a/src/Synth/SUBnote.cpp b/src/Synth/SUBnote.cpp @@ -28,6 +28,10 @@ #include "../Misc/Util.h" #include "../Misc/Allocator.h" +#ifndef M_PI +# define M_PI 3.14159265358979323846 /* pi */ +#endif + SUBnote::SUBnote(const SUBnoteParameters *parameters, SynthParams &spars) :SynthNote(spars), pars(*parameters), AmpEnvelope(nullptr), diff --git a/src/UI/NSM.C b/src/UI/NSM.C @@ -82,7 +82,7 @@ NSM_Client::command_open(const char *name, char *new_filename; - asprintf(&new_filename, "%s.xmz", name); + //asprintf(&new_filename, "%s.xmz", name); struct stat st; diff --git a/src/main.cpp b/src/main.cpp @@ -17,6 +17,7 @@ #include <map> #include <cmath> #include <cctype> +#include <ctime> #include <algorithm> #include <signal.h> @@ -25,7 +26,6 @@ #include <getopt.h> -#include <lo/lo.h> #include <rtosc/ports.h> #include <rtosc/thread-link.h> #include "Params/PADnoteParameters.h" @@ -39,6 +39,7 @@ //Nio System #include "Nio/Nio.h" +#include "Nio/InMgr.h" //GUI System #include "UI/Connection.h" @@ -70,7 +71,6 @@ char *instance_name = 0; void exitprogram(const Config &config); -extern pthread_t main_thread; //cleanup on signaled exit void sigterm_exit(int /*sig*/) @@ -117,9 +117,88 @@ void exitprogram(const Config& config) FFT_cleanup(); } +//Windows MIDI OH WHAT A HACK... +#ifdef WIN32 +#include <windows.h> +#include <mmsystem.h> +extern InMgr *in; +HMIDIIN winmidiinhandle = 0; + +void CALLBACK WinMidiInProc(HMIDIIN hMidiIn,UINT wMsg,DWORD dwInstance, + DWORD dwParam1,DWORD dwParam2) +{ + int midicommand=0; + if (wMsg==MIM_DATA) { + int cmd,par1,par2; + cmd=dwParam1&0xff; + if (cmd==0xfe) return; + par1=(dwParam1>>8)&0xff; + par2=dwParam1>>16; + int cmdchan=cmd&0x0f; + int cmdtype=(cmd>>4)&0x0f; + + int tmp=0; + MidiEvent ev; + switch (cmdtype) { + case(0x8)://noteon + ev.type = 1; + ev.num = par1; + ev.channel = cmdchan; + ev.value = 0; + in->putEvent(ev); + break; + case(0x9)://noteoff + ev.type = 1; + ev.num = par1; + ev.channel = cmdchan; + ev.value = par2&0xff; + in->putEvent(ev); + break; + case(0xb)://controller + ev.type = 2; + ev.num = par1; + ev.channel = cmdchan; + ev.value = par2&0xff; + in->putEvent(ev); + break; + case(0xe)://pitch wheel + //tmp=(par1+par2*(long int) 128)-8192; + //winmaster->SetController(cmdchan,C_pitchwheel,tmp); + break; + default: + break; + }; + + }; +}; + +void InitWinMidi(int midi) +{ +(void)midi; + for(int i=0; i<10; ++i) { + long int res=midiInOpen(&winmidiinhandle,i,(DWORD_PTR)(void*)WinMidiInProc,0,CALLBACK_FUNCTION); + if(res == MMSYSERR_NOERROR) { + res=midiInStart(winmidiinhandle); + printf("[INFO] Starting Windows MIDI At %d with code %d(noerror=%d)\n", i, res, MMSYSERR_NOERROR); + if(res == 0) + return; + } else + printf("[INFO] No Windows MIDI Device At id %d\n", i); + } +}; + +//void StopWinMidi() +//{ +// midiInStop(winmidiinhandle); +// midiInClose(winmidiinhandle); +//}; +#else +void InitWinMidi(int) {} +#endif + + int main(int argc, char *argv[]) { - main_thread = pthread_self(); SYNTH_T synth; Config config; config.init(); @@ -221,6 +300,7 @@ int main(int argc, char *argv[]) int option_index = 0, opt, exitwithhelp = 0, exitwithversion = 0; int prefered_port = -1; int auto_save_interval = 60; +int wmidi = -1; string loadfile, loadinstrument, execAfterInit, ui_title; @@ -230,7 +310,7 @@ int main(int argc, char *argv[]) /**\todo check this process for a small memory leak*/ opt = getopt_long(argc, argv, - "l:L:r:b:o:I:O:N:e:P:A:u:D:hvapSDUY", + "l:L:r:b:o:I:O:N:e:P:A:u:D:hvapSDUYZ", opts, &option_index); char *optarguments = optarg; @@ -351,6 +431,10 @@ int main(int argc, char *argv[]) dump_json(outfile, Master::ports); } break; + case 'Z': + if(optarguments) + wmidi = atoi(optarguments); + break; case 'u': if(optarguments) ui_title = optarguments; @@ -445,18 +529,23 @@ int main(int argc, char *argv[]) middleware->updateResources(master); //Run the Nio system + printf("[INFO] Nio::start()\n"); bool ioGood = Nio::start(); + printf("[INFO] exec-after-init\n"); if(!execAfterInit.empty()) { cout << "Executing user supplied command: " << execAfterInit << endl; if(system(execAfterInit.c_str()) == -1) cerr << "Command Failed..." << endl; } + InitWinMidi(wmidi); + gui = NULL; //Capture Startup Responses + printf("[INFO] startup OSC\n"); typedef std::vector<const char *> wait_t; wait_t msg_waitlist; middleware->setUiCallback([](void*v,const char*msg) { @@ -467,12 +556,14 @@ int main(int argc, char *argv[]) wait.push_back(copy); }, &msg_waitlist); + printf("[INFO] UI calbacks\n"); if(!noui) gui = GUI::createUi(middleware->spawnUiApi(), &Pexitprogram); middleware->setUiCallback(GUI::raiseUi, gui); middleware->setIdleCallback([](void*){GUI::tickUi(gui);}, NULL); //Replay Startup Responses + printf("[INFO] OSC replay\n"); for(auto msg:msg_waitlist) { GUI::raiseUi(gui, msg); delete [] msg; @@ -490,12 +581,25 @@ int main(int argc, char *argv[]) "Default IO did not initialize.\nDefaulting to NULL backend."); } - if(auto_save_interval > 0) { + printf("[INFO] auto_save setup\n"); + if(auto_save_interval > 0 && false) { int old_save = middleware->checkAutoSave(); if(old_save > 0) GUI::raiseUi(gui, "/alert-reload", "i", old_save); middleware->enableAutoSave(auto_save_interval); } + printf("[INFO] NSM Stuff\n"); + + //TODO move this stuff into Cmake +#if USE_NSM && defined(WIN32) +#undef USE_NSM +#define USE_NSM 0 +#endif + +#if LASH && defined(WIN32) +#undef LASH +#define LASH 0 +#endif #if USE_NSM char *nsm_url = getenv("NSM_URL"); @@ -512,6 +616,7 @@ int main(int argc, char *argv[]) } #endif + printf("[INFO] LASH Stuff\n"); #if USE_NSM if(!nsm) #endif @@ -522,7 +627,9 @@ int main(int argc, char *argv[]) #endif } + printf("[INFO] Main Loop...\n"); while(Pexitprogram == 0) { +#ifndef WIN32 #if USE_NSM if(nsm) { nsm->check(); @@ -553,7 +660,11 @@ int main(int argc, char *argv[]) done: #endif GUI::tickUi(gui); +#endif middleware->tick(); +#ifdef WIN32 + Sleep(1); +#endif } exitprogram(config);