diff --git a/.appveyor.yml b/.appveyor.yml index 6d8afc5290..d4baef6a43 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -37,7 +37,8 @@ install: - cmd: git submodule update --init --recursive - cmd: echo "Get SuperCollider" -- cmd: git clone --recursive --depth 1 https://github.com/supercollider/supercollider ../supercollider +# can shallow clone, no submodules needed (no supernova) +- cmd: git clone --depth 1 https://github.com/supercollider/supercollider ../supercollider # FFTW3, including lib prep - cmd: echo "Install fftw" @@ -54,21 +55,31 @@ before_build: - cd build build_script: -- cmake -G "%CMAKE_GENERATOR%" -DSC_PATH=../../supercollider -DFFTW3F_INCLUDE_DIR=../fftw -DFFTW3F_LIBRARY=../fftw/libfftw3f-3.lib .. +- cmake -G "%CMAKE_GENERATOR%" -DSC_PATH=../../supercollider -DFFTW3F_INCLUDE_DIR=../fftw -DFFTW3F_LIBRARY=../fftw/libfftw3f-3.lib -DCMAKE_INSTALL_PREFIX="%APPVEYOR_BUILD_FOLDER%/build/install" .. - cmake --build . --target install --config %CMAKE_CONFIGURATION% -# TODO -# artifacts: -# - path: artifacts -# name: art_folder +after_build: +# create archive name; either the version (if tagged) or commit hash +- ps: | + if (Test-Path env:APPVEYOR_REPO_TAG_NAME) { + $env:VERSION_SLUG=$env:APPVEYOR_REPO_TAG_NAME | % { $_ -replace "Version-","" } + $env:ZIP_NAME="sc3-plugins-$env:VERSION_SLUG-Windows-$env:ARCH-VS.zip" + } else { + $env:ZIP_NAME="sc3-plugins-$env:APPVEYOR_REPO_COMMIT-Windows-$env:ARCH-VS.zip" + } +- ps: 7z a -mx7 $env:ZIP_NAME install + +artifacts: +- path: build/%ZIP_NAME% + name: Plugins -# TODO # github releases - only tags -# - provider: GitHub -# description: appveyor_$(APPVEYOR_REPO_TAG_NAME) -# artifact: installer -# auth_token: -# secure: rxXJNY+6n25Th9R4+7qI+AcnTj0wCAMSnBGH2+5s7DlVLrAGsSY6+EEDbeHWGGeI -# prerelease: true -# on: -# appveyor_repo_tag: true +deploy: +- provider: GitHub + description: appveyor_$(APPVEYOR_REPO_TAG_NAME) + artifact: Plugins + auth_token: + secure: 4uMFrJ2Vc3ju6OtWpQ9chRce/2JHNhfy/sjX+w+KFTNDvmSPD5CqdEuwFp/+Ln/s + prerelease: true + on: + appveyor_repo_tag: true diff --git a/.travis.yml b/.travis.yml index 124d340b8a..b35c23bcd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,33 +1,34 @@ -language: objective-c +language: cpp -os: - - osx +matrix: + fast_finish: true + include: + - os: linux + sudo: required + dist: trusty + - os: osx cache: + - ccache - apt - bundler before_install: - ifmac () { if [[ $TRAVIS_OS_NAME == osx ]]; then eval $@; fi; } - iflin () { if [[ $TRAVIS_OS_NAME == linux ]]; then eval $@; fi; } - - ifmac brew install cmake || true - - iflin sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - - iflin sudo add-apt-repository -y ppa:andykimpe/cmake # backport of cmake 2.8.12 - - iflin sudo add-apt-repository -y ppa:ondrej/php5 # libicu-dev 52 - - iflin sudo apt-get update - - iflin sudo apt-get install libicu-dev=52.1-1+debphp.org~precise+1 gcc-4.7 g++-4.7 aptitude build-essential libfftw3-dev libxt-dev pkg-config cmake=2.8.12.2-3 libstdc++5 - - iflin sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 - - iflin sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 - - iflin sudo update-alternatives --auto gcc - - git clone https://github.com/supercollider/supercollider.git + - iflin sudo apt-get install libicu-dev libfftw3-dev libxt-dev pkg-config libstdc++5 + - git clone --depth 1 https://github.com/supercollider/supercollider.git + - cd supercollider + - git submodule update --init --depth 1 external_libraries/nova-tt external_libraries/nova-simd + - cd .. before_script: - - mkdir BUILD - - cd BUILD - - cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/SC3plugins -DCMAKE_BUILD_TYPE=Release -DSC_PATH=../supercollider .. + - mkdir BUILD && cd BUILD + - cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/SC3plugins -DCMAKE_BUILD_TYPE=Release -DSC_PATH=../supercollider -DSUPERNOVA=ON .. script: - - make install + - iflin make -j + - ifmac make install - ifmac mkdir -p $HOME/artifacts - ifmac zip -q -r $HOME/artifacts/Plugins-$TRAVIS_COMMIT.zip SC3plugins @@ -69,10 +70,9 @@ deploy: condition: $TRAVIS_OS_NAME = osx && ! -z $GITHUB_KEY tags: true all_branches: true -after-deploy: +after_deploy: - "echo S3 Build Location: $S3_URL" - notifications: on_success: change on_failure: change diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 488a8f86d0..695461c625 100755 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -6,8 +6,6 @@ if (SUPERNOVA) include_directories(${SC_PATH}/external_libraries/nova-tt) # actually just boost.atomic include_directories(${SC_PATH}/external_libraries/boost) - include_directories(${SC_PATH}/external_libraries/boost_lockfree) - include_directories(${SC_PATH}/external_libraries/boost-lockfree) endif() include_directories(${CMAKE_SOURCE_DIR}/include/) @@ -106,6 +104,7 @@ set(PLUGIN_DIRS SLUGens SummerUGens TagSystemUGens + VAfxUGens VBAPUGens VOSIMUGens ) diff --git a/source/DWGUGens/sc/HelpSource/Classes/DWGPluckedStiff.schelp b/source/DWGUGens/sc/HelpSource/Classes/DWGPluckedStiff.schelp index dbfb52a58a..f78cdfb8ab 100644 --- a/source/DWGUGens/sc/HelpSource/Classes/DWGPluckedStiff.schelp +++ b/source/DWGUGens/sc/HelpSource/Classes/DWGPluckedStiff.schelp @@ -47,10 +47,10 @@ Examples:: code:: //Define pluck synthdef ( -SynthDef(\help_dwgpluckedstiff, { |out=0, freq=440, amp=0.5, gate=1, c3=20, pan=0,fB = 80| +SynthDef(\help_dwgpluckedstiff, { |out=0, freq=440, amp=0.5, gate=1, c3=20, pan=0, rel=1, fB = 80| var env = Env.new([0,1, 1, 0],[0.001,0.006, 0.0005],[5,-5, -8]); var inp = amp * LFClipNoise.ar(2000) * EnvGen.ar(env,gate); - var son = DWGPluckedStiff.ar(freq, amp, gate,0.1,1,c3,inp,fB); + var son = DWGPluckedStiff.ar(freq, amp, gate,0.1,1,c3,inp,rel,fB); DetectSilence.ar(son, 0.001, doneAction:2); Out.ar(out, Pan2.ar(son * 0.1, pan)); }).add; @@ -69,7 +69,7 @@ Pbind( \instrument, \help_dwgpluckedstiff, \scale ,a, \delta , Pseq([1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,1,1]*0.25,inf), - \dur , 2, + \dur , 0.9, \degree, Pseq([1,8,8,8,8,8,8,-6,Prand([9,10,11],1),1,7,8]-8, inf), \amp , Pwhite(0.2,0.8), \c3 , Pseq([Pseq([1400],24),Pseq([300],24)],inf), diff --git a/source/StkInst/CMakeLists.txt b/source/StkInst/CMakeLists.txt index df9a064989..24ef0133b8 100644 --- a/source/StkInst/CMakeLists.txt +++ b/source/StkInst/CMakeLists.txt @@ -56,7 +56,6 @@ if(SUPERNOVA) endif() set_property(TARGET ${PROJECT}_supernova APPEND PROPERTY COMPILE_DEFINITIONS "SUPERNOVA") include_directories(${SC_PATH}/external_libraries - ${SC_PATH}/external_libraries/boost-lockfree ${SC_PATH}/external_libraries/nova-simd ${SC_PATH}/external_libraries/nova-tt ) diff --git a/source/VAfxUGens/BFold.cpp b/source/VAfxUGens/BFold.cpp new file mode 100644 index 0000000000..95206ebabf --- /dev/null +++ b/source/VAfxUGens/BFold.cpp @@ -0,0 +1,96 @@ +#include "SC_PlugIn.hpp" +#include + +// InterfaceTable contains pointers to functions in the host (server). +static InterfaceTable *ft; + +// declare struct to hold unit generator state +struct BFold : public SCUnit{ + +// Constructor usually does 3 things. +// 1. set the calculation function. +// 2. initialize the unit generator state variables. +// 3. calculate one sample of output. +public: + BFold() { + // 1. set the calculation function. + set_calc_function(); + + // 3. calculate one sample of output. + next(1); + + } + +private: + // The calculation function executes once per control period + // which is typically 64 samples. + + // calculation function for an audio rate frequency argument + void next(int inNumSamples) + { + // get the pointer to the output buffer + float *outBuf = out(0); + + // get the pointer to the input buffer + const float *sig = in(0); + const float *fold = in(1); + const float offset = in0(2); + + // perform a loop for the number of samples in the control period. + // If this unit is audio rate then inNumSamples will be 64 or whatever + // the block size is. If this unit is control rate then inNumSamples will + // be 1. + for (int i=0; i < inNumSamples; ++i) + { + float sgn; + float sigNorm; + float sigAbs; + float fold1 = 0.f; + float fold2 = 0.f; + float fold3 = 0.f; + float fold4 = 0.f; + float fold5 = 0.f; + + sigNorm = offset*0.6 + (fold[i]*5.4 +0.6)*sig[i]; + // sigNorm = 0.5 + 2.f*sig[i]*0.6; + sigAbs = fabs(sigNorm); + sgn = copysignf(1.0, sig[i]); + + if (sigAbs >= 0.6) { + fold1 = 0.8333*sigNorm - 0.5*sgn; + fold1 *= -12.f; + if (sigAbs >= 1.8) { + fold2 = 0.5743*sigNorm - 1.0338*sgn; + fold2 *= 17.647; + if (sigAbs >= 2.994) { + fold3 = 0.3768*sigNorm - 1.1281*sgn; + fold3 *= -27.777; + if (sigAbs >= 4.08) { + fold4 = 0.2673*sigNorm - 1.0907*sgn; + fold4 *= 36.363; + if (sigAbs >= 5.46) { + fold5 = 0.2829*sigNorm - 1.5446*sgn; + fold5 *= -21.438; + } + } + } + } + } + // out must be written last for in place operation + outBuf[i] = (fold1 + fold2 + fold3 + fold4 + fold5 + 5.f * sigNorm)/3.f; + } + } + +}; + +// the entry point is called by the host when the plug-in is loaded +PluginLoad(VAfxUGens) +{ + // InterfaceTable *inTable implicitly given as argument to the load function + ft = inTable; // store pointer to InterfaceTable + + // registerUnit takes the place of the Define*Unit functions. It automatically checks for the presence of a + // destructor function. + // However, it does not seem to be possible to disable buffer aliasing with the C++ header. + registerUnit(ft, "BFold"); +} diff --git a/source/VAfxUGens/sc/BFold.sc b/source/VAfxUGens/sc/BFold.sc new file mode 100755 index 0000000000..c07ee6339d --- /dev/null +++ b/source/VAfxUGens/sc/BFold.sc @@ -0,0 +1,14 @@ +BFold : UGen { + *ar { arg in, fold=0.0, offset=0.0; + ^this.multiNew('audio', in, fold, offset) + } + checkInputs { + [0, 1].do { |i| + (inputs[i].rate != 'audio').if { + ^(" input at index " + i + "(" + inputs.at(i) + + ") is not audio rate"); + }; + }; + ^this.checkValidInputs; + } +} diff --git a/source/VAfxUGens/sc/HelpSource/Classes/BFold.schelp b/source/VAfxUGens/sc/HelpSource/Classes/BFold.schelp new file mode 100644 index 0000000000..dc3d9555ef --- /dev/null +++ b/source/VAfxUGens/sc/HelpSource/Classes/BFold.schelp @@ -0,0 +1,28 @@ +class:: BFold +summary:: Wavefolder virtual analog model +categories:: UGens>Filters + + +Description:: +A model of the "timbre" circuit of the Buchla 259 Complex Wave Generator. The model follows the circuit modelling as seen on the paper link::http://www.dafx17.eca.ed.ac.uk/papers/DAFx17_paper_82.pdf::, using 5 folds. + + +classmethods:: + +method::ar + +argument::in +Input signal. + +argument::fold +Folding amount (audio rate). Useful range: [0, ..] + +argument::offset +Input offset (control rate). Useful range: [-1, 1]. + + +Examples:: + +code:: +{BFold.ar(SinOsc.ar(200), K2A.ar(MouseX.kr(0,3)), MouseY.kr(-1,1))}.scope +::