From 7db2d6c00b6f759f0689e6e8911f3649026a1a24 Mon Sep 17 00:00:00 2001 From: Trent Date: Mon, 26 Jun 2017 22:30:05 -0400 Subject: [PATCH] include Yin pitch tracking algo --- .gitignore | 1 + Source/PluginProcessor.cpp | 6 +- Source/PluginProcessor.h | 3 +- Source/Yin.cpp | 146 ++++++++++ Source/Yin.h | 26 ++ lampshade.jucer | 65 ----- .../Ableton Project Info/Project8_1.cfg | Bin 0 -> 463 bytes "test Project/Icon\r" | 0 test Project/test.als | Bin 0 -> 22655 bytes test.RPP | 249 ++++++++++-------- 10 files changed, 324 insertions(+), 172 deletions(-) create mode 100644 Source/Yin.cpp create mode 100644 Source/Yin.h delete mode 100644 lampshade.jucer create mode 100644 test Project/Ableton Project Info/Project8_1.cfg create mode 100644 "test Project/Icon\r" create mode 100644 test Project/test.als diff --git a/.gitignore b/.gitignore index 0790b55..83d09a0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ JuceLibraryCode/ Builds/ *bak +*jucer diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 7aecfac..79eab5b 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -1,7 +1,6 @@ #include "PluginProcessor.h" #include "PluginEditor.h" - LampshadeAudioProcessor::LampshadeAudioProcessor() #ifndef JucePlugin_PreferredChannelConfigurations : AudioProcessor (BusesProperties() @@ -69,6 +68,7 @@ void LampshadeAudioProcessor::changeProgramName (int index, const String& newNam void LampshadeAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { + myYin = Yin(sampleRate, samplesPerBlock); } void LampshadeAudioProcessor::releaseResources() @@ -105,8 +105,12 @@ void LampshadeAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffe for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear(i, 0, buffer.getNumSamples()); + float pitch = myYin.getPitch(buffer.getWritePointer (0)); // returns Pitch in Hertz + printf("pitch: %f", pitch); + for (int channel = 0; channel < totalNumInputChannels; ++channel) { //float* channelData = buffer.getWritePointer (channel); + } } diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 441be0f..bd2d1a0 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -1,7 +1,7 @@ #pragma once #include "../JuceLibraryCode/JuceHeader.h" - +#include "Yin.h" class LampshadeAudioProcessor : public AudioProcessor { @@ -38,4 +38,5 @@ public: private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LampshadeAudioProcessor) + Yin myYin; }; diff --git a/Source/Yin.cpp b/Source/Yin.cpp new file mode 100644 index 0000000..ef99681 --- /dev/null +++ b/Source/Yin.cpp @@ -0,0 +1,146 @@ +#include "Yin.h" +#include +//#include "WProgram.h" + +void Yin::initialize(float yinSampleRate,int yinBufferSize){ + bufferSize = yinBufferSize; + sampleRate = yinSampleRate; + halfBufferSize = bufferSize / 2; + threshold = 0.15; + probability = 0.0; + //initialize array and set it to zero + yinBuffer = (float *) malloc(sizeof(float)* halfBufferSize); + for(int i = 0; i < halfBufferSize; i++){ + yinBuffer[i] = 0; + } +} + +Yin::Yin(){ +} + +Yin::Yin(float yinSampleRate,int yinBufferSize){ + initialize(yinSampleRate,yinBufferSize); +} + +float Yin::getProbability(){ + return probability; +} + +float Yin::getPitch(float* buffer){ + int tauEstimate = -1; + float pitchInHertz = -1; + + //step 2 + difference(buffer); + + // step 3 + cumulativeMeanNormalizedDifference(); + + //step 4 + tauEstimate = absoluteThreshold(); + + //step 5 + if(tauEstimate != -1){ + + pitchInHertz = sampleRate / parabolicInterpolation(tauEstimate); + } + + return pitchInHertz; +} + +float Yin::parabolicInterpolation(int tauEstimate) { + float betterTau; + int x0; + int x2; + + if (tauEstimate < 1) { + x0 = tauEstimate; + } + else { + x0 = tauEstimate - 1; + } + if (tauEstimate + 1 < halfBufferSize) { + x2 = tauEstimate + 1; + } + else { + x2 = tauEstimate; + } + if (x0 == tauEstimate) { + if (yinBuffer[tauEstimate] <= yinBuffer[x2]) { + betterTau = tauEstimate; + } + else { + betterTau = x2; + } + } + else if (x2 == tauEstimate) { + if (yinBuffer[tauEstimate] <= yinBuffer[x0]) { + betterTau = tauEstimate; + } + else { + betterTau = x0; + } + } + else { + float s0, s1, s2; + s0 = yinBuffer[x0]; + s1 = yinBuffer[tauEstimate]; + s2 = yinBuffer[x2]; + // fixed AUBIO implementation, thanks to Karl Helgason: + // (2.0f * s1 - s2 - s0) was incorrectly multiplied with -1 + betterTau = tauEstimate + (s2 - s0) / (2 * (2 * s1 - s2 - s0)); + } + return betterTau; +} + +void Yin::cumulativeMeanNormalizedDifference(){ + int tau; + yinBuffer[0] = 1; + float runningSum = 0; + for (tau = 1; tau < halfBufferSize; tau++) { + runningSum += yinBuffer[tau]; + yinBuffer[tau] *= tau / runningSum; + } +} + +void Yin::difference(float* buffer){ + int index; + int tau; + float delta; + for(tau = 0 ; tau < halfBufferSize; tau++){ + for(index = 0; index < halfBufferSize; index++){ + delta= buffer[index] - buffer[index + tau]; + yinBuffer[tau] += delta * delta; + } + } +} + +int Yin::absoluteThreshold(){ + int tau; + // first two positions in yinBuffer are always 1 + // So start at the third (index 2) + for (tau = 2; tau < halfBufferSize ; tau++) { + if (yinBuffer[tau] < threshold) { + while (tau + 1 < halfBufferSize && yinBuffer[tau + 1] < yinBuffer[tau]) { + tau++; + } + // found tau, exit loop and return + // store the probability + // From the YIN paper: The threshold determines the list of + // candidates admitted to the set, and can be interpreted as the + // proportion of aperiodic power tolerated + // within a ëëperiodicíí signal. + // + // Since we want the periodicity and and not aperiodicity: + // periodicity = 1 - aperiodicity + probability = 1 - yinBuffer[tau]; + break; + } + } + // if no pitch found, tau => -1 + if (tau == halfBufferSize || yinBuffer[tau] >= threshold) { + tau = -1; + probability = 0; + } + return tau; +} diff --git a/Source/Yin.h b/Source/Yin.h new file mode 100644 index 0000000..dbeee98 --- /dev/null +++ b/Source/Yin.h @@ -0,0 +1,26 @@ +#pragma once + +//#include "WProgram.h" + +class Yin{ + +public: + Yin(); + Yin(float sampleRate,int bufferSize); + void initialize(float sampleRate,int bufferSize); + float getPitch(float* buffer); + float getProbability(); + +private: + float parabolicInterpolation(int tauEstimate); + int absoluteThreshold(); + void cumulativeMeanNormalizedDifference(); + void difference(float* buffer); + + double threshold; + int bufferSize; + int halfBufferSize; + float sampleRate; + float* yinBuffer; + float probability; +}; diff --git a/lampshade.jucer b/lampshade.jucer deleted file mode 100644 index c46c7d8..0000000 --- a/lampshade.jucer +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test Project/Ableton Project Info/Project8_1.cfg b/test Project/Ableton Project Info/Project8_1.cfg new file mode 100644 index 0000000000000000000000000000000000000000..7c8c1d27c327af7d6e77afe93645e98777bfeb39 GIT binary patch literal 463 zcmb7=&1wQc5QHlrLWl^02R%fB7f*^=iHY8fUIc$Zgq(s|H_^nnu&#;klxOgLe2jcE z9tOQR!}Lsbbv4!VSD5Y+xhqLGqbU3g{J6V*4-Gy^B*7_8Tag0I6lomse!n)}* z(%g-dr{z#Tmioo)659cih%)o?iAVbb+sl&;8mg$y g@pLCQUlZi1s(ZLHw}~G6Rgc663_p=Id{s65165B^VgLXD literal 0 HcmV?d00001 diff --git "a/test Project/Icon\r" "b/test Project/Icon\r" new file mode 100644 index 0000000..e69de29 diff --git a/test Project/test.als b/test Project/test.als new file mode 100644 index 0000000000000000000000000000000000000000..e1a71372d303ecac34bdc03a7db5bcb6b0f6c444 GIT binary patch literal 22655 zcmc$`byywE*QT2U2^us62=4B#!QI`1yE_C3?(Px@9yGXnaCdiicb$g3zjv7L%=u={ zUx$5N?C$FItg7l-)w{a)y*73*#G98tkOMb0+j*9#!}3cdmIiAqHHGCLA1)=k>nc9# zs-efvHP%xT8wHl_*6^DsD^xLlzFUI(f+ExK2B#G|C`J}Zw^A5BP;Aq`pC51K;b7{| z?nF3_CUxfV)zr4riOrN=wc0 zPzK|!xcDvXA^FJkG)-vHf8&7e=5Atx5{vP`{xm@@_m|@RA;&#JVMf<7pIz`A<~*1+ z#xUFA{RG=|yo6CI82J;ao7FnuMt&uhbNt@=N}Gq1I+*1HWA&g)t?W_e6TIF;%F;rl z=RHD%zY6SjbwL*nkz6AF^%h&enXk=n$u^qVYdtnH>c*MWBuDh3jBC0ESa%uG9J$>G zZ0icQdAL){U+0fQ$5g5dhpzR3)wP4E+C=q`lSlD;16rj|0j?)xiOFptDaCQ&!3q_5 zq=K7g{Y%$q*-tl15B0uJ_%)54d_fxl@*N3R-y#d@>+M^}_)!nuU2V~=_hXTMuQl*h zL-*O|(rV{9{{8*z;ZwgWbKk(2O36t)xgazbcGC#^>($c)aZ@8D6jNFCNST%u8=&Ks4tMU^4NBX6 zJwC%5+q)qJH6wEtd0D0Vk+Dy z`sCbT|MoH9#HfhWQQ!WccVN)N+>7O0sazl((gX2^ORX5Yl!A(h zwwU-1-oxsCm#+VlJNCmmvLJmCi~N2k;r!Ci5o6lf&9&$WlQ@w2I)`RwU+xxjEoRei zO&clTIe*+L7Z^TUs#{&QcKt$THnpuZE1$Gci-oa^-aPCb;1bjxE-c!J8t9508`fe? zU)hG&p~Uk{InxSv?^e4FaEbBE34lu7!kj(w<@6WW;-*pEA3^4J{wz?izEd#N_r45I z?RI{0(^j4I)0siG$uYxepbPfB)!uKX%8fT}%)bLA4cKn)?Xe6plaF|Z2Q$@FWs1R^ zb|s~L^EOC&G=+O#aB7y=cz<6StDK?>(s)=tibWfsLPS>F8@N2%(72;jj4t^eU>~K& zsxl_vFCGxS((qH(S}b~l?KAGlC#RXtU8qU$OE-~=VYgDWa&qxt!1-h5|%Y{LGJ}9~IMjk+2$A zREtVfMNBBAhkE2B*w0oK@aT}_R@T5>G;m~sF?jcJ%tI`y$x(2Nz|w8>&3Jh=S0=mp z?^PmI8l&4W)-z5*x-M`&AbotV5zB%~EsQbhavA)vN_*VAmAyeoVzk-*v0^k!`#}36 zW!#Emv5w6FT!t5OYxU!1^|U;0{(9E~b33+U=P%p*b^7QDZ2FToy>SGsV7cf<`R}4p z;~G@LN*kz0Ozz+@0*0hLzWL3bBpUfr&@7bhB_(C=NMg@#!3?<_8rA;pwhq+&=4oE| z6`^nn(ya{qv9e)d-cZ8+f`cNpbHqiWA*Dx&&+5>*#*GDj?NqsQyN`2aV0tY+DO1Pe zt@c&p8RV5N8kLuah4(QyhwKA62Y6CV8wgfjpmSDPkvN^uU3hsen8A9|e8?*MEtoEu zHm14_vE7*$EpgS(UIYQ}4J)u(~G`(&lyWunZdUGrtjZR~QQC5$12vPj)z z-|+BKw)Di<%YG-=QwO*w2;MTW!L9U#V~e$fePoOKgi(=s)@}%PFx#5cb35W8}j$Dn7eRFd-W}`q1t#tR3@vT|6)4Gwy z^ep(udw)#X4Y{5>-c0pzfKcWpJqs_wwusw%H(;XD78$%zJ-lSL_LBkG*O3r`^^^+? zZiJ{+lLu2zxr8X*$Kg14E5NMXf8-BcA*GPfi6PvOSf+t9JwvYoSHo#29DndGmJ6ORh*acWtzg^~$W#JV}(EC^2&Fh2%SuV&krf zO)ioc?EsiGh{GLbjtd>-yLH5e9H5U(4_!%T>7tNdknWff>P)cWF+w+ zhX;s#qUd#3OETv;G8`RGo!DR9$fR0I$!t^}e)98H_l;JUgO;+TDcu?p7A+;yQUp3a zx|9ZD-Q+L@k{}BrmYE(7n2^ps41;XHJ%8hJT;@{Z5p@OQjGYlth^YL7=!0#XY=Rx( z+3EqLo$VruTk8C&ab{n8slF>xhp%vS--XCM&hSIy(Bsv)a<8Tac@47R2AkNN6f5`1 zqxNow2KG>1y;8K@72Pf(0&h%&rVzvg0xupfI-#E3VI&b=mK<+c`rD8?ejgZ7VTZW{ znfQPR5y&13EPBAcj0AV4NLWwgnY@1Hu9^@>a%)rv48I;wnhS8*PX85Cr@X{J3rV9}t8C5CXh>W-tjN;0fV< zAe*F| zcq@iURHqk4c#$%EB}dv0!%*trDeZz#8~|6oM(J`DCH0xUR8^dS5hp4(U`_gB{pr86 z=7;`~;X8&&X@{%2jZB#WR17`R_S0y^P6(PW00mqCI+tA)mA8V1M3rS>qzyj9muIAH zCk(}JTIqSCRRxzH+WW-;46Z8bivw+l|J6bDe;m~Obs#d*b`XY=15YU)gks@XLE~$r zEn8s)w49V5Iy%F54wF(GS2Y2da{karJIE~=*uY9j23kO>`s@HX!}nhY{ViK1SNc|Jm62&j#9mHWFVp+Ffx`2o-`+DhDma0#M>4M1Wxf zHc$kh$1y1>a8;F&DW(6qlB@UvGyx^US7PKHV5Am+!t`QfhO0XL*9hp$|K3QWx}?K3 z7chcL&gHErAyqZ{k0;)}FqA5IN{k>BRmTb|AEOoNieVrm@cE(rGkhm8DKT(WS&%6! z4vkiT6Ps?74pb}@fbu~Ax`8XA!wxl6eAWw2VC>*ye}xdd##7#(lp z=D!%NWcqjiHHyH>V7E5s)nRBEJHT%#r)rDF6Lt$Q1kup}P3K9qz~)J1lu2di2M+d^ z6Aea#yVSXXx=ixBj7m#Yhf5D7DNCX6?_476s~{bS{NY^SYU4Cra|wSQ*e;V6;OADy>EniHJx`qBnPvg!nI?>J6KJ%ZJIA+8jM(Ll zhkg&3-Uqgi0Hz**sRy3*J#og{pB8X$e+px~4KjlGHOB`*g4p#P4;^&(5*{?DUFK(i zpC@4IiD!*LlHm!Mdj2%RhEyF45w?6vC@t&MzxjxhsDAqMNzbO(Zl97M+FQ>CUy?{E z28X2|mh(H-7r3AA$96rZ*h=|bhiYcg>sNtAv z;R)5b1@{P@y9kX%BatUXf*%l&V%=`2-GwMg^XG4kB7-L`KgB0d3WO*q1O|`ZG1Q)8 zkh)}$U7_#W*xIHMa7oFUY8)Bh6r3%uvYe@Xo;38I<6kD|K`T4kzXmxtR?z|! zNA4|Kc8t~dKV1b3wBtvnI}y-*4Brju$n>gpBG9J65=jaXq73Q8Pn~gU?~QJ(zq_TV zIjbh$6auA+FZg*+qf%Z@&_DI~NC)Pi*#E6(Na~LCw}CnZGG!B46T21|oX^To+{w{z zM=#AhiQ^vqnoe^<4>30fg<7*DIDYk0Zy|zip_stG4x>Wb9e73pD^~MQtD@K-MSC+Ied#-=EuCR6Q| zn;tCYN9W#Z`YCgUw<385w}GbdeVY63QQY&he$9;C5UU#llV;`0_4WpddUobNkoniK z{qOlYhdEhGN1@;|hOF<*4k%0!+`}Yy0#=u@XDJ78r6?JgqnFOcs_T~q51EU1_S@K) zAqeLY?tGZHZUa4oD(7rDJaTKYQu}|JYD8%65}(z2QouITioi~?K4Qg}QTB~*vSCrm zRZHAgdp>b>X|1Y8S)R+zQAeTd3lbN_#!L)~!%h{hRUs^n^mybhAz|S$Kro7lU5l14 ztYa4EjysSWJ6@VwxL?voHRPRcvtrp&{(u9qeUlhub8x0t)SemU4E59`{FJ)31Tn?h zMX#TdeRNXBR;_;jbf&Iy+Arcej3XanbKujYpS>pYj#eH9SQ1eu9rj*HgsGDjM z@mt6ZiVp>SQjA$RbY#%uvEm6_hcPyC_pF(n;(&Tg$9lO5i z>b}Dgy1G1Zw=p#xo|bQ~ueHzEm&WaZb+?1)@ePTypX{JxmO zsF+IVm`a$KO4yi6xR^qCJIA}Tbt{oF2Pi6XVK>Hcukpg*pA_dUrus0KYas~0c3JRmksQB};e zGCOt=Pf>lBAzpRDx2PVbr~#&^5vHgKrl=XFs0F5|6{e^Srsxk$Q9Ddg2TV~XOi>q1 zR(A;_8mod}R$o9&qQR_q5!;x2TBL#zKf1){*qk4de`HM1?^2SSe+ZKfo{i)41s#YF7#iQww6&5r}-MNj9B(3EKzzKxJ?9v!qblQ5^%4AO#4L zD7-Fce$wayZG4`_6zKr8${j{h-MAJDmvK~A9B(=E3BR_W`3jtjliN5E~te6v7-{efkHGF z?b-Z6FiRAmLOkvgywV^x5mxURT{-C68oq@jl z<5M5SJ8`8t^8KpH3bhO|HPbz-?Y33D25BzvM+1JC!Q~{b>3Z2B0;OQ3o>QJ%$&mTU z5{sU0bMpc|s%VPTi*9e~Ruk*B-<@s!x(hq{lz7hWho2JXlEx^}>WU`pSo}7viyiAi zb=8Rjz0_``QmS<0^1-W})2g-eih=tTU4#&8bUvLtntZPEDqbG1%#ToDL{pQOY$?+6 zH}+j^=gPvF`(i!*pZcsQQn&{R(;YasEqPk{rzhzwd+yAOI{uuvCu(svux0hb%?|vk z_}s5Sb|5Kk;o?A?<|t{u{w#c9n_V8G=Ks|Po!A4D#yK&YfHlG8i0 z`b!)#dSn2d=8a~92Uztd>!g|E9Wspfj`P-ZQ|B#M{rNZdw8NX*B-eZlSA?CYJsB)n z-c@UA;~`5<`DW$He~5C1$l_l@4~isXq#fcN#NT5 z<(+a;jVm8tk>srU!fsYNWRWBc_{Ad@$J;Tik5CwX#vf;IW@GlhfqT1n+;DpZlenWM z0c(PFxYly@)SZRFD}#{q3o5VW%L0!xOd2l~X-ivUKGbWD??#48nBX|5^NH%eP6orV zGpwBD^k8q#od)eE5BqQ|46pPn!1d3;^+Uk*`@!`K!S(mS^;5w0=fU-d8${BH@I#Ye z7)|IVfAxILB+3MKm`&&wfAxINB*HIdM6)hJuw(}Q_XL2>a|}G;af1ES!ebHe3lTLH}YA2{!h0m7>&RT zco@-Z4+RXE(5%aQ0+NA4W^}6tnF6nN06W0ZgkF0QUZJ@mE=VsybVP zCXtfqS!H|pbj`7n*kj`kf9~408LF+PyM z+%y$L^nPEm=;3KwHy05joD)0dLB%+)PNE*l7`n4_+2Jp%JCH=FohdnVMWjT`BNaIj zPA*UGP`&=ebh$u5W6E;@S-!vOnoL^i2}EEnG1RCDCBLo<3LZgfs@|$`zp2TAfUe6W zuUIaoxbs1h3f2|8?dGJ+pm{tW zi)#~4n~b4zP}E$57;O}yz6zWVpEVy=S-4`51T9vF!{dvggyzcBZ}R^s9T z@b1Q-nrsRIk_G}V$$s}?RO+nv%k54bZ-hJgs1)C=u`oC6PA;I$O7lA(v){?JP0YF4 z$*ufG7~x)*+QvUB#cmQk!ZIc%2(pu#ra^`-WKM=|=#poI^YA?22?3ol$pM{-nt15K z+?+kKA87?&@p+b%>o%mU4sYJr{z+gK9 zgAME$-5M(uHEv4|Y5JUx4GnK?>!gir{1k zI&TA7#2i&LCWX)Na$N=)m6CdvniRP+a28+#d(_W+2M!FJ^_ZhlTkmgKv(p5V>crE8 zlVx+HUIxW5aR+Hs3OjJ~US;zJ=&!E0uOEXwBv&L;HYgAWNkjB}>r)&oUwCeJG~k@d z7pcZ}x(xwmW6r2rL|R#})^|{r_9pSj$fHsqV<>1MN=93Ia%E>Pk>XMfyq}LKn^U;~ zBmN%#V4oeRlN=bjJt&_4GS)8vFqNG)sGqc$n>KkC3-sFsYD}0r)GoWnD1xg|j{%6v z+UyLTx>0!s;WSM$V2Bq&%O?ndl39L+&U3^OKth_6Cg?Z1p3|LRWFsfc-RQv$w(&425=&ic5)-rCp8&z4XJ^%Y`A?!KcO1Ed0r?2L=x`A zoV=+((pWhjFzS4g=xqVs=VQ^5+~)Zbj=)@AfXqreY?)Y9C>uH-%b5iw-aJQ40UA@x zmNp6+8aHc}IeA_d3V5|f1wQ1r86PULnN0H-8w<0ayOfhwHLh8rEpg-p3si-9AXv0u zEHQKlj0LPs4g{(hj;j^&jxTT`EePgv)2hH{F)+bA0PlH#a6AtdmM7Emv`;xz3 z79uy4EgAPahK%e-PgIj=S{!OMXv|vl2^z(hbxzj9F!S7_W+PE1C0Lbns8Bvs{_Hp8 zK-}wsa6qvIyG*6&YdY8oAlu%VkD^&Krpy3~wX&d^pIUZ8#h>fV6w0Y^FZsYDZ_CF4IrqJaAf&~@GJml!$&dMHT_X9`Uk#5w7wWbQ_NtKG zFQ3T~QrsrX{Uo&_L8>;deO;BL*~C8QFsA0KKBw03-49uH$w+jPIh-%J zkQ|$`eo~p1I%B;M%6A z*$ruXOu{K)YUotGw%|}T+teZ~(wBG;)?M}${*UapzolIxHOodt{s93s&wx=i7x&&USSgmn~3Tv18)#bI@E$AX1o6ryL zh-xU~>6sK5PVig0dJBtnTDV5Gub?LPw2-QWi_oI&EM&ZwF* z6FPMg&+lTnQBB`XFJQ#F*g*?7OT9puyXe&Ndo!8|W?YGq!Nmz3+10j~`}O1X-dBDX zd&Z7%A453DTdxxl7C}N}EamWkk;VKTbG*E#m*X z?uqKEtl1dBXSK@mid9Q7MD6t$*mzzBS$3jt=xqySp?+{?w0pVD5;L!+R1Y-7wo{rm zGBvK|kFT1XTp9N5=y6K_26I0UfSS_E=vLx*VI>eA&!;rVYp1hbqLRIH^4uW= zx5Pcl^CC`_d?qP1mLs;sWtf%5H4m1ziU{2Y=H$HgN_T=~Jjr|VyuWp)eJotwO);q7 zq=?7WWfBK;M2aC`QPK4C>{vN$E;2uyw0Qv|J4SiaROD>W(zJDYz|~9lMB@rBvS}J+S0F}rMAER(kvMul^-a^) zo7@*sS5bXDDQ56oT$H6IYVWOo@I3B5YoIszL~P7^jP1ie0CAsc>8kr8%N-ueT#ZEaUpjHX^w@S zJH%k8Pkj?PPMlwP-z50Z^ptaaRZZ18ayuSqb|zbR_d}VuqyE`}!+(rA8I!1gZFw0f$=Wr|ZL$>~M!8=1?7^NY=WUpUrOfsBQt8 zmnC~=4)MiIXqUa$E`>FzpK7i4&TtFoy{YFnZZ4=+m(%8O8l2HRje{_369%9J8)b>| zshFfyCaM`_E^gpS%chC)xhxGoV0ZHCTklF9-FKlTDEUs3+CN>FHuXt(sh4_Wb1#~2 zof>u39~2(_Ikt$EXq0MYgL*hNK<46c|DuPT^r6~;)g6WIq*QURWy~{l;sA9mF#-N_ zxf6<9F!oVbOS`VESuk1^x5dE%1d5d@JJK=DysClt5ryU>D%iYakX&UM+GwhR%uxSlkVN@qwdXq7^v?Js;^1GJh+^Ab6m3hmw zEn!zZeTf}fS&igHTG{T~xzP9t%accOp|$07VOST(M|pc6>XbgmtuypT+93Zx{U2H?W(UgNuXo zKG+oB4{8gQh?fmLMZ>@JjN8^*SI1y-|q+RA! z#FR-!bouqpZ$u@Y&Q(AE827Z}{K5Z?+Tz|--^J$dX^-~)E3(8@GU}VX0X${xw-6RR@;B4@&FzI} z!CkJkr?~|ix=aT4OX_Qi?~|o?a7)c(8%Wqv%6jfWtAmrBZj|MxX{xoBN8nFySGi`3 zEl!%b$MU&XR}he&Y%$w!@H(oAwNcIQISOL}1m>=ZaBdxrP33mXwMUn9CYx%v+`jlQ zXzGLAL$YFtx$$$X^}{a6dTn#)YuUikFTw|e$@G>@75X~o*@ zXi0HF&#u3KLHM&=!Yp6A`RP?M_TIo}57+vTL-$6Wy3Cy_UEFivi7*zfCD9@Mq*G9) zkG-jbOi4(xZPE3NBDR(xn@IME`i#nk9hK<~COr@Z++rqib(R?bLX zo6krYz;3jh`)U36H-8cAXu}!3v?G`7Xv6EL^=g?^X^yG@J4nZ&md0wU_!D$?Votn$ zK&O>ozivmgf<^X~V0Q!f07NO+Wq zw{|Rjl-xZmncE7a&=~HrG0IUvT-|GQV2QdReEL6eNm?k>sjdxc+Kp=ct2o1e6W|xF z)^L3s(^GIDc>TC`xnc^hwQvx>b(>**4*Mwwj9j8l`DSTbt#Bf%$E=qx@~bPtVv}B< z8NwPz+0z;D^!}Z=OLTsRv91vfn8={=%t)r2DroWm-M!*s5?ll!6Lzckk$3Lz80O@w95Jk7r^U+Pun+q`v^AB|ON zC`yUNW8%>ep@Xy6Pk_=}5W3kwK1Ri!;7f;vQ zxUjge@@}I`U4XiXV}!72IkJ1lwV(5#lZH3xv;wktbuL937%iD@1M!g#byYXTIg587 z*}O?IlowNU4Plc{i62}2FzVYqWJDENW3bN_R=JdmN(SKfbE9i3U3M+KEM@N7!5S-a zo$On#efmx+>++?(Q_$&$#%O7 z|0qwuUOtUS^@X@i^}9JvfA~B)c~y@#eTNa7qQ7~ccDglpqD~ERCt7-VyhAMR0PrA- zH>tKiMTA`G@e9|ET*Oe-Y2N8L74Q&Ft{x}tW(p_GWJAuFiwt;vO&rO?b@rQw>tkPT z@7g$^43qQzwyEX)jVw+ombjg^cIOBD`f0r+La;6Sw|E z2@|mE^iSyPaz)?B2IT#FJUt-Rk=EsS{~ok}`+KnTTmA){1dTUNx8WmWcdpKj{2q4F zS5f|mp?lK^sgBdUN$znrf81{3?k%yHp-B~%xgNv4@erIeoHT0LXIH9*NuW2NH{T+k zP2~swK%PFoNTZ}GAJc7!#3Q7hUy;wX#M*jzeS3aEt(T{?IDEZfXypcdw#9vJKGC)R z7cL$yLZH1K-JnnKK#jRR&$7g2>~}x~F%f`AT%>!x=c)%b#$@-f%UWLPQC{ocz0#|^ z)t}kc2Y;oXd9DBauU=*k+vausA71OA;LS7b7qtu&*RpuVaki-?phfMSwrzKF0y%b9jyZtr5`M1A5HYdhb^;YWG_I;kEwn zX#@1IfF9(PUhn%WJ!$?t|3uVZ{pN)B{XY@)SO2>IX0P?Iul4`dj|u4iiKrL-`s@BZqk z{-22YtAE{p_1Ajn*ZP0zSLRx%1;UQ~b=cMZFA@2FK4fTn!w*dU|1WX(_j2)%Vqil~ z?%#;|dj$Q}L=p!1&y)ZzB*w2N(m!Df=#>Ed-yZ$dv%S{;+c!YJ^IHE;*a8Um{FT1@&8zy+UhDq}TR;!Y2)ftx|Nn6z)Qa#Rx!SqgV4Ko8TA#9cNZTJII(iJg zp~`f8UJ(!bIhCIuh1i!jOC3FI6cZN;rFk{SS(hl^aKCF~-}y-gO0QouRO)fY`H=jW zC~3SYwcKNWd;h$8c8VWhPxV=5`*7&R^1%qx@zDfxzmJGv$Sd|K#-4$+3zhW9<_CxR zHC%YXa#8cWu(L+xgIfg_^d2+_)~UNOt6 z-1Q%V1te6w1&q`e_u(wFTy$^Q+@1`bJ{4J9aW1sasS7z$@J=5CEADSFt4ci$$Odb6 zmEY70GbAKv>EeOa=Mc%m(9_`(B@O$6=Guz7-;%IG;pS$a`ocnyH>@{3M7+lG2MxcJ zJbW;kzCtTG5Y5D37Kq1>R+{duDURjy96!K5d(`SMtmwke8(cq;){u`YU@YtzHP(jV zbF}Qm5TNxi<|^f7WzRPeY5bQ2j3NjttdXTV+>aiIXQ#m!>l9ue4bGRD2-{k-3nNeq zO7|o6A^6M{Qy0>a(XHqg!TKz(Vn8s;l~>!EVIi8e4|H$rI}&>{S8ZaB)NgLwV~V}6 z-*Q7R_pC*;kVKO7(^O*x0Z)o#Di*yxym8Ixekzk|Plo57I-qIzh0hJ-8r8RY@tZDC zRs$&$8wOj=$9TxM1v44LKHPx;X~3gUW%N(Us8i8y0o*L^_Gp{X&Ef7gP??E}7-SA> zh?kbb+ZCwhXD2--jN~L)tN&fnMa}<3(nS(D9wA=qKS>u4R)GbLlEgG$d^&|Dj*k}w zM?}qRV`f`R=zW+3dzwh5I%RexrUunoFVL&LBuWj$jTONE9#1=3`|1|1R5*{b9*WXO z;=pKGYUB|4vqaUhD(!b8C8?rV)P|mf5+)rkm*1I}Vh5$f@g(P2Q58}p}PvDYCKwU zSrUZOcg(ItTYLFlrZst4&ErhXEFWIsbWL+sVud#r_1AU3-es3K$M-S<5v$fb@TB|} z0zbl4-KD1!LRE8YFOUvK_#kKPZY=OPTC$ix8fwSK5$7g#wR8$pgd&6+)qi5`La8J=+Bg+qVFmYu%ve*3~k zIDv^10goHOBVz9lLC_ANCo8+a^A1wxoeE%*@P#+!3lm^M5&=&d!3UT?5wt_`x4yG~ z4^8k)m4oeup(MQ!=fD1i(0{$x=Y8SQ0l@h$aSi~^e`$08aDK+i1z!N?zwrA1)99H` z29R}t90&O1zvMW;Cj;a-Z|)19tYPK~K+G;QTmaxM_d+vM{dd*@C~Pk@^Y#m}4p7Ow z0J6?A!g~a8=J1p-K`1T&+YON1fKLDu|4W=NVp77C{su_rMelN;F94_xV9kF)^=GX4 z1yujvIG_Pq4mbcf^O65><{%T6O`@6rI6%zs6&PvT4?~HAr=$o%G5E`p%T&++ zogw6h4$knM0XXv$O$b1TLTU12>HpOZNDu&cbO1F65(KmXPCw@*#o#Z7Ucjz8{Q{ON z1695t>TSTt17Nw?ORho53z=S0w}(>YbQA;R8vNPJ`!C0U=1{&s=L`RV&iDTVoofT| z_+RK8$U|UxfzGFaYF?o8=RAb47k(YcL-@mTS`>Z zH2`t%Esu!~hj9e)E`E18QE#-La|Tx%hv_PZ@lT*=xSVJ-+Rr6}ihts$OD4H%O znvM2z1+4y3=s?kOInipg-#5UDtAjQz0NgDD%Zn?LWfy6rL~5LG8sN>{@X)UVT_EoH zSG%S7`M71^(g7a*F3{+hco+8?DKL{80rrXie?sWL{NG3uguM}907brle;3qF`!fLC z6L9(^k_8HRghqOt4;3KOJ@L>Xf?Oa#1@450ZQ^3wX6+Th12v#bgefAqwmC~dQ#Dk& z{n`;Dl;0tWas2r+|4)7ojUSd%5t3L|{N#Cd+eb!h9??L&84WyvK|)Cq4~RU)jb5Ae z6Pwe>_3o8hT2<;Eb}A9RpsW%})&1~aZ!Rm!o%{A>5q&kK9qUte= z#ecF5#YT`6YNx)&Cnw(#K(4~lh8H{1M@(FQZloLhb^5K=B#-R2$6Yp}-R2UBV_jS~ z%$gal(JD}JYN$xP!Yx*iAgy2x#0$3M<_-`V=roYGRC6;a^!Fj{22XF*SEpX3qv}U1L-0OrApT4Qp=5n< z<6x#_%^GJnNKq4Lx|$zmw_8@4#|BT$O3RGgF2)Ps|1V?kU8!8YK~EdR==>x~d1G|k zPfRDs=53N2znD&j4Q>*q7a=WWZA-sJX;earx)G6&Xq$G8_p}42X2*vrjYsH`gO)1q zmt=xxZz;ZW1?piobAz1U&EuOXwT3P|;+3nij=A?=!j z5$Kx3s2{gySp@HzTXy>Vi9Of4p{V3LBkJ(muxdtblF56gWJL^;m*c%_P+fBlr-gV3 zYT>2+L)|wN9!;<*L$E)FteVVEgFmn+*@{~oiD84^PmnC7d76cQi|a~)6js|9pljj72+pM| zA{=rRL5N`&&ABbOSx$Wgnqrq6(uVJPN1PzVkv+iIP@L29v$E6I71|wdMX>** zW9+rka~%uXQPrxWHYz*WFvni#uk>IZ>=~`}{Mg+yTM@z927x|$le@?TmTZo37~ZIl zx1M(5`bMx~t}KNuYlxELAct(>El+=QrSTX8^#8G>11`Ff*os`nTp z+dje!X3&gFu_VVzcAiCm6~RXL_IXWihL!j9wgq!1=(ETz{qfUP!Do%rX92+urcF7) z3i8BPdCw6A>}zotuvi@_yB1^4SyTMMT&dLc3Qck28-)$DLn@jEdwi@Imardhk+GMz zQh@!6TrnKtLIav_53HLUel&fwEKMaCkMXIKEvmAUw*rVr60vyL?vl^IRBr z)!g~98}AhgnuwCavNs3Iu?NH-B_8j_S;`}_)r##cK2Q1uePz0^5l%zwWKmb?Q0d055k>+w9 zZ5e{NyD4$*j^!5RjYi=@8G}DZt+~_K(j#bUCX@4XjgAF!F^9 zsdKh_$noQpK7DmH{##YWY0DpUVL!e~`=I;tob}Olwzuj?l&C8!b{eW_awjnQF8V%s zLbTV!(1}4}z8Jdjt*MWtgJlmAb_4Q6cnwrEw(o z*eHD+B3ZnFz)c>G%=8qil<1l;2$zA z%RC4!N6srQ%h=PGWRW66Lp#0?ce?Wy*Epf9g0?tx#)gL`)^u0%dkiXKrAzB2jiE!& zmd-ZIl&exAQ!|P!Gs%|z9iv3C#~_wt!dha%T4KXm;=o$s!dl|aTH?i8;>TJN#99)@ zS`x)t631GS#9ETdT9PsIJEupUal=l+vy60@>2qGP{jC9?ubk`}@~;$1yFo=!VzoU2 zNq)~dpV*>p;>j}y+9~IOUm4?N4~}?CSW2Ix<-4-ZX-j!0Me+B3MpcgVWW~~zDo*lJ z7EJU_2h9v8%?#(y4A;#J_s$H@&J6F)4ByTSL(LAO&kmE#4ztY;i_Q+K&JLTX4!NMK z$wZHj^XDfCE1BjLPMDZVOfagrNo18&j!e(ynPL2pSSBYpVi}TaR>|+!|7`t|ITFUq zHKGK3T__S8-t5~9hhc17x{MmFY?YsqKx2rA`|aytMfetk z+P98#GUEbv8`9sKj}`dU*our3CHahKij*hW)lTYu{+d*9Xkq*P2Zoi(aa&{TS8EeU zO#CAAGzJj}6iLd*8hyB|@s)4GGEaBoID$=%)R&4OvW81HiMS28jV4_6I6fE6qK52_ zh<4ZLS8+jO!8Og}-Ay~3M6p!gZJKBf&~a#-M66#=@B4emeE#Ig@sz>jx8HhG-JZTU zb9!h|kLCNR$Pqus8y25I`*uZ^@ck1eL#X$Y8Phq+RqL(=jAXg@uHUavNH(2?2*$h_ z`S35a{A_e#TX7>#w>`zmCO63Mq9@`l!SZO8M;KrfiA)V(?t~7Fjz-cc(E5hO<)((! zkKAB4CMgYj^gIb-!BO@TG)hFA%L@pRt}JBB6Kg_i?P!Ro%1nFP@u%}y_HSqJCO1~5 zrcNb04p$)Jl=^JKHO#VbbB`dmCgzvknO;`5n3$N!o1-(4MYGb!VRpPLn6riL%g9!` zw_5n5thtb>^>t#s*fuAsKCGj75%^gV%PDFX=ZVz#8`U2&mX17K5GYD^`>P7W4&YXg zHYRZr#fgXVHC5)2o7oNDtJ{eg6$_aV$m2S)(DuS~)>ct*=PI`zewQ{RyA48aVHKgg^xZoj7`=M05(=w!i)a|C_zBfHwxm zIgVwj8h3jaBoye(oS<3kAfVjGyKxNz&m2g{aq-a?hrC&$*gW@xG!Q%t}Vr`tw*xjY@+kDnKr|eFZ17;2EPe z*JEik+*qFC1S3)`CpQt-Rf_5OO^Vco|7L~uhUxv4A-YKwN2sxxv!ZiEmIVP?LfL!0 za8i$G`Af&gs=OZ{cEHmkFxmUzY17R!aE7I%D^){Cq!5*FpS%AB3Ca@ktz%NE8)D zUOiOSPVb{=oxk6lIi>}~<%>i7iH!rrEY>4-hRas9rW;TF}nE-L+<`#HiBlTC-K|%meJS7Z}w$Nh}tD z`pIK?kcBDALjOlxnX=I8K;vX(A+2b?%r71T|9f6kp1)#dOHK@eee-M4)&2mh& z+kQ9@kD>l}47KAi(ZX1XIU(1LIo&zW9hmb9`CiAxc|~qZJhlsLQw57)y-w(pl`qMK zo;B6YM*?}LakO3&pJwva5L{ayZ8;dzve^aowWIFM*rS&kpJMMo5`MAwo>sl-)RVt& zNJ1^yl}Il{Dt3dbs*7D!M-7}+M+JA)0EWT1^UI*QY4?6i;h-mD3ddp^JG71(xU|Zf zFVbGEBc5ODXy^MWjDz56I`(CDGI#w--1IBD=eNZzzpd~1<$t(Xl1_soa~U@zxo($0_LT?HCOhsF6^CWKU#9uzUS+DE0^_ZC+EmANS#J<6{nG0 zlIdEu<=Dxsw8lAkmtNdiy|S0n_D(e~~idR6cI?6gu=@}k~TlZ@e6a;0hMqFCHh z(*IKn+3qeMLW662Y0W5|s&quF*YswW_qMpK*I~_lvG(lh-oCEtEwz1~UAx=QMZLw^ zvuk^$uIbIqVt(GpyVA(WarSw7sV+(HY$TWErkCa>7w0Ay@Rs>KxiZ(>U9oGY*XSmt zv+H!v_q8O~`wFk@E!WPzz?XkvucM1D>@C(VcXf09b-kt9IhXggy{xyyk>u)L4i6-C zN}(CjD=5alz?XG>uhiwe{HuHU7xy-~wzuZe-eyS8T13`BYAs zl+h-I>SP;zvb{ptR-+WEl&y5iI;E1SRSv9H4y;!WtXK}LSq`jP4y;=atXvMPT@I{X z4y<1etY8kTVGgWf4y&~-E5(6wo*9R z8Yl513bZDyb45R~lD7-K&MQd&+y?Q}n?&=t`1S9p9`S#)d7??YN!0=TXQ~k3|KO;w0<|Vf;Y5=H?)d3w2n8ll2@bUvDG|DJx`?Qi8Q@ts$Q+G*Hqb) z)%HZ{UK@R{ox;b__yk@?@{aR7b-ty_%)Sw~$=`2w?Reu8wdL;Dn|+YO-@@OEs$pgS zU+mRm_&qsAy{jKV{4-u|aL=%+azk8>AGZ%*_dKZSrQA4pRKxGVpwZG}PZvtUBA(a1 zcI7$s7Ej>~IkWsexEnN6&*ca3Pa1+#O{XwZGNoldSWRVqP%VVV(m_ukl9yq;~pV2jXU>v zJnDT&m6Q>1uBIKQ*O>HvHxRF88D170jnex`B2BnS$?+&cXc`BknA}O#nNP$m_pXJU&A&8L^D(Da-2v82%CMm49<3@%}y(KKEfl-w{t2u4=T2yVY-Y3pbY4v@G&+uh!(_pXQY>+UPR z^8DB}5&}*?R~!Mrw7s|p3?&|hVKhZBH7wA&KPbYxdh&wGlrW;E_-($8N*E^ zm&Ut8#&8qK zzGvzN*}=J~tP5U6iPYe=nZcVT2Iu4j=ceo& zvVk{D2F}d|&PxR@nF(Av5qOh))x0#|{4C(SB;c)v8GqPzoEdH7rUGx23A}M4@aE&n zZeuPv6Hh4>nx(Z?Y0fAWSiU0buxydGFi6Yxs8DSdTB96)iJfB-DnJ1X);Xld!hnFFE&-9Dm9Ai`4K}fvIGZu5xm& z_Qjf#`BwYlOeSB*dEYpE!AY~)D9h^S;NdYkgz#H^EhNR78UsLyeop4K`MjI3I|B;4 zJ3?X4^N>d-e6jo%`kQTh0MXUveF<-|Cf;s&Kk~~OH1Cg9^wnSe5l7LF;N*e$s1G5h z^WNli-bzlnVv2NhteM>;74>C)Gb0@23=uW5%4Mqkq6Jp>|O;`5kcxqJbcq9jibPO|Bb_ zgJ>jUK03$HNJf415kiCHtfCGPG)T@y>J~tw$yoppKQm*k%Dku=Mr`aZGGng@R0D5H zPrO+v+J>aXdl&c+e$!+4&AixK2)+?qBj4yA`6CFvf#4emzNsH(2)=>fo1;1-mJ=xe z(Kmu%8i>Au=$jTY1>rZ~DVOz>YeRas@d`@)!PtXb)@`Oicljf_Yz`x3~$y#NV{ueNFz(zI&A^*&a$zukq^ z{bTEgo8`K|SDF5k=n1R>wB|qJWts)uyTEJr?MJL=#r`I$Zh@um&w?;|ScZiX`77ve`;39cc8NnptF>x?ak|&tKqBzg1d!kpH`+)gs7dx4+ z$)mf7AN?Q8Z)DWdN=RBtQu_`$YV((HOAxFzFRH)AHi+v=45aNDRvoNulyV4>%hgpvL*y!5npMUcX&=$WL|^YWW<^(50;-%R^G^dU^9bh%v(9v3SD9Xn33Kd++mnV6+T=ZK_&|PQ{{m zT@11*PvN4u00$vmqzMRfYvXUD6UX{revBFLeelh{d3v|}2Tu#YmD~o=U(4_|`uPci z^{da(BR2dsWY~tITLxBpNHXryqcm8w^e{c3>M>bQRTV3swx?oHk52R@ZP4=%YUDsDfjI@;-tDb z?}|_d2)6{89wK|}h?;D;Sv}0&aXXO};PfJUE$T*AhSf?6p0mQVkQ;G+;F-s&Dwe49 SqNe}&xBm}sv%8tI-39=DA_*t} literal 0 HcmV?d00001 diff --git a/test.RPP b/test.RPP index 3ae1102..fc1dd24 100644 --- a/test.RPP +++ b/test.RPP @@ -1,105 +1,144 @@ - - - RENDER_FILE "" - RENDER_PATTERN "" - RENDER_FMT 0 2 0 - RENDER_1X 0 - RENDER_RANGE 1 0 0 18 1000 - RENDER_RESAMPLE 3 0 1 - RENDER_ADDTOPROJ 0 - RENDER_STEMS 0 - RENDER_DITHER 0 - TIMELOCKMODE 1 - TEMPOENVLOCKMODE 1 - ITEMMIX 0 - DEFPITCHMODE 589824 - TAKELANE 1 - SAMPLERATE 44100 0 0 - - LOCK 1 - - GLOBAL_AUTO -1 - TEMPO 120 4 4 - PLAYRATE 1 0 0.25 4 - SELECTION 0 0 - SELECTION2 0 0 - MASTERAUTOMODE 0 - MASTERTRACKHEIGHT 0 - MASTERPEAKCOL 16576 - MASTERMUTESOLO 0 - MASTERTRACKVIEW 0 0.6667 0.5 0.5 0 0 0 - MASTERHWOUT 0 0 1 0 0 0 0 -1 - MASTER_NCH 2 2 - MASTER_VOLUME 1 0 -1 -1 1 - MASTER_FX 1 - MASTER_SEL 0 - - FLOATPOS 0 0 0 0 - FXID {3568A34C-460C-D046-82F7-7D87378ABB20} - WAK 0 - > - - - -> + + + RENDER_FILE "" + RENDER_PATTERN "" + RENDER_FMT 0 2 0 + RENDER_1X 0 + RENDER_RANGE 1 0 0 18 1000 + RENDER_RESAMPLE 3 0 1 + RENDER_ADDTOPROJ 0 + RENDER_STEMS 0 + RENDER_DITHER 0 + TIMELOCKMODE 1 + TEMPOENVLOCKMODE 1 + ITEMMIX 0 + DEFPITCHMODE 589824 + TAKELANE 1 + SAMPLERATE 44100 0 0 + + LOCK 1 + + GLOBAL_AUTO -1 + TEMPO 120 4 4 + PLAYRATE 1 0 0.25 4 + SELECTION 0 0 + SELECTION2 0 0 + MASTERAUTOMODE 0 + MASTERTRACKHEIGHT 0 + MASTERPEAKCOL 16576 + MASTERMUTESOLO 0 + MASTERTRACKVIEW 0 0.6667 0.5 0.5 0 0 0 + MASTERHWOUT 0 0 1 0 0 0 0 -1 + MASTER_NCH 2 2 + MASTER_VOLUME 1 0 -1 -1 1 + MASTER_FX 1 + MASTER_SEL 0 + + FLOATPOS 0 0 0 0 + FXID {3568A34C-460C-D046-82F7-7D87378ABB20} + WAK 0 + > + + + + + FLOATPOS 0 0 0 0 + FXID {B7DD42FB-8D0E-C24C-924A-407EC4334EB7} + WAK 0 + > + > +>