hYA3;!>@$e};w%R_1ob1KC%{uAg`nl3vRS>YyDWaL=4YCPi3HbP2
ze|B8a{w;9-#IwcjFyaO=do9b*0<@t?#gD;~5pf>F2L6l*;{hA7ABmyCr48mmi;C4(
z9~WktoKe@;PHyC;qmXT71r{2W&)jqvWjFF%5x>3q5gtbcenPtp#UssBvVSVeNS{Wz
z{3djHxYTE62?IY^3m2K~CtAqk{mF>9(1!CBLajbg2KEgGv)YHlFn)4b``_&D3rh6gABUUU(V(Q@x!y#6rgVkb)p
z(@m=GTOhqa&2$lV!L-L+TpFd3F>1Bglu14MS-9bP0>t&dM^B2S=2lV#)
zX7wKC_t=0k?sLk}sw|k0W-HM$2FdoK3wFXhG5pNnJS`cH>mbk95M=tmhkb9aG(LE4
zwUt+GQ5M;U-om-pXe-sRpWp{2QaeTf7qa+LrnM`9~x@xC>m)0pImC{ibHQCcw9-Aft@<>d|TIrOKClf
zhW-D7BUmButkCS91Rh&ae1PlG*PfG8I9v?ySs6u9$LGz#LsqkTK~>{>V%O7uRGKKd
zT>w0yuRkJ%Fd_5ON6Yf&vZUo-7rA_zbg)pboi6$eyI5&1wehJaf#3?P#;gE#8s)-$
zZ+*|Ym&V)L>MVOJ$lL(;5p$6g_YJfqtu`>ByBCho1Sxi>lCbamTZVYP5GoO^$Z={L
zzUq7Y6Xs3|E*dSQKTj;`AX;`HW3qFbZc0=x12a7e?&1KqWpkwqP$sCO$-%OO1{m_;
zJmN2!xcP4qwkK=FdD2nxH8ngdOKeqOmSE43w`|d58<&Uv4$0B`?+EN}G3~)LlV&Xg
z7k8LI%`@_ts!x4rb5>?$4zo}mokZ2AOn@22-##x{LmiQ+p6h_iRSiP975Jj`T1d4wAE`o*vaM
z%aQ5jFRE*-c@z5<_#c3!CSGa(4Z84#rNR9aPFld`v-QDYi}&O6uXLlyqChe(k-%TU
zKG$Ek)4BG6dEnF8ME8Ezar2-Ou^-6>M??@?cqvd
z<0imhUE+Ce=+eIB{Pbgu1>CZ?%Nqji%p042R-@*_&ysj)eB{bKpg+0xlU-rEZPUJ6
zkQUxNaY)UtIfhHeM%PnnPV4|%379y$T(e$r#x0#a*_tvw#L!xmlTuMSp)$<2D4h$x
zmn%uTko=vhkF4dF3OWi&iDfNQ({>qLcetHIqRqtAENv$mNJf0g_FmEWJ`*tTxo2YH
zO>WC|NDGL%bLd}|y7N=$qdIBnESfkku?
zYNR?XiG!WQtd@#T5gq15K28>_PvF2sO{+0abk(@%UhUg(&~$rvOktsT*e9Lx98Wl2
zE9de8f(J}IqOsMM?ccaEY(?6NI=Hu_SUwSBc*KRFxTJ&N1XcrrNhu%y|!?^=Vp6T94Mc-A5%=pfga
zdGJL&^(W#rg?U}UeGlB*vpPtLT#=!*d8hzdE9YE&)RN_3Neus*55i^WYC!@q@TPB|
zM75>TTa%Dyt?Z|s@?|tZDzpP9iy1@6gV95Qi*Jy~){1D$nAPr@+tMwQzEu`Cwx_+A
z6*SFbFOUPHTPU{-KO{V%;KZ5Ut@1JidR7wqv`3+@wC$s;@Zz$k6N-|IO#0K%Oh?)1
zGq#&E-GKugLMs^o6s_VJ>oCd2(Pnu}Up2OTgrYUe-N#Jk@9Xu$IMzH?>VglzoZl3|
z8(0QLUJrOZx(PKn@N7AEHQ-yIpUf}T)!#8~N^kEb$!I(unK!3>`7NaPa&Z^w&9IK`
zv}0IZ%{6Z=Q-T-vA}1GnWhok84UO`odAF-;O&2vc`Y-L6-)N$`&Sf+5rua20Uf^e5
zzlzM0^oX{-cp@$#aS$cg0^7!PoN78k?rTTz`x1q3=Z`5Brxo~0`fjOxwCzx3w=|?Q
zFJx2gA8uLy@Nxunt5{%$3`}K!11d}gJG=Cg90~Xl^IU5@9moBRuN}!TWd5RC!u;MIEw)y@hYhyuR$P7V
zY$0MpPaX;h(4LVrEJ@sJ8KJ+$4pGn6TFBC7O
z635$j`D$EKy75$2RMkx3rLDE8IL}8Wt^Xudwrs|7(
zlFbdOOuro5SE}Y12ias+@nGDFSp6OKaOw?CdI05MAMH^yl(r>#D70CCxifU1saMb?+8k`(
zekc8$)KiV&;hA-H$9#o4-X`-6=55)w1mGmDbLny?eCF>B{4=4%o2z3<@XCEk(?9}*sX#4Z
z?~FK4TVIIwW*r0R%&AOx(KlVL;%IQi4rUoeq;0QyCk_y063cpOq1%58&T&A)4eN>D
zi9^wEGIu;-_qZx*Mc@{a$pAq-jCNrr(#OeJi#z?P$JoIIOgHngtq0eM=R(47wu)yZ
zf8D*gx-@KC=6**<*#ISHB*6CV6{uieySjMFQd(6`r$+7=(?$I5?~uHM$5WHvJfP4%
z?`+&;%wrvG9=5cgjJ{5&U2i8bPb`jU4!YppZLvXzY}qyW@`zXh?CrI{XrY=N1pSN?
z(0oZkwMi$O_=d6xZOW-%Wtm&@eG9M0Phq1%?8|~Zns*=B`n3ElLHSAW>oaLiNyKrG
zOZwyf72K?J3wMC|sImS|ke1=jj+;9-hyw6hjMDFrj~Rtn@@bXdAqp3^awKkZs_9aM
z+d)8Xf?2c?0HL;Ug0i|X#rOZyQ^Z7=^ujqJQRRi2|OXQYR5yjPc%^>
z19uJt(Hmqm4d&DB<2~jhpUYztp(9tNlJ;5jVSYMg
zZo1CV!Fj*dXLx=}%Rc}Upgr1-oq9^zy=jLC`v~|jSH-lBaO$bqtBb-G-lv=Jc0*jK
zKQX2#@E+b;({q3}<-d_R=_xb2lS$c;_&0I9N=
z#L}O^$sXT$V+VD>JCP*`@V8?7d8Yx>j;XBD1<1u4OScWISe7VjWOVj=H-hOnDi5t@
z+8em-i(1q1sdWgrJOZ^(-eBSm=+u0f?xeRg#gM_T21XQeEhQ~_#zRjV;A1TVdUUfoajrQEm87_p}
za`uaOr0bnCjfu7oSG46=F
zJ-I7EO(s5FF-Jk)N&E$g7cB
zOIa7#eX?L(-JsQ5xB0ZS8^?SWt6L3EW~DYssjr6y1xT6GxR2%U7mPjMVJtl4l5Tcf
z&20Js=*<)#WkYD#*yB*z#ib-iu;K-H$@Sb^_D#e|;K(iva*KfL!q0R*^iiNqC;il>
z|CMz4Y@@Ec$Vb}t!hAA_EHpAU1!smQCte9=dj2ZRGM#L`JNi9Er-fOgP&goI;CP~!b)sTqLo`dhw
z#(T(4IQ9<8TMJ|7WCcb_ri{&zM#*)|?vJwTF;{1@%)$*i6Mb;(^P)7Mic7{%EOKZZ=p~uRLB+^wapdOi(HvxG;hO5PmI9q
zo~2Y#Mw`}1B7ufyxH8k|-W16!Q1mB2JXLIb%~S5^6e1?utLN26v_Qw@E7ordtcEwG
zOLK;{t!p_eo^}1YvG3MiU{MV>8Jrr>PTUp{pnlmQARr*0U-odRKxx7&fjkIA7IM(<
zKaQ}QewD3*#q}?IF>-@=+Yyb9L*2K`HfMtFh&R(6C7@+Cbz$?meMsHW0k_G|-P;d6
z3G=$&_6+2vb*iNod9Xh$CGuRvddkk(_G9zW;sbPGo>RrdYzbj1JJpKH+!s5jC`uh5sdUIz}vHb-nDm$g4Z7&>x@a8c}fOq-d
zb$5XME(cP_xQBs=1;PZJq!Pk^V!w<3V!_*ku{9MCvu?qK*PsbtIX8Ow=6#cPQgtOw
zWFEhADXmj_kEV8&{y`IQzX8*Q(u8*{@}Z10;9w|^dB>H1`I@d?_oN(^*r9u+yET`O
zwz`RGPgkP3lDuo~zU1@yQTXuf=}o+fRmKSp*YSKp;mYC&CL?O+#`dY
zzHHGcLyf7vC#Ws1XTN@~su-``mt^N^Y_xf+&*H$YG4{vpLJ9ys?z9}IUaSQ}EJvm>
ztBt^)_wd?J(Xv%b!)QX?w~9tn@l^Y0)N1NEpX;N>j)#Q^L!#ZXho4&+mp;ooSlR*!
zg4mS)v%cs*?Lq%%^d|Q2oAo(`m;>Cw+#^F=9&Vdnd2Q{Bj0mMz97fmGv3%qqc{X)1
zv)eqG5cbBLRVE;f`kHkN(_;tSW^lR`?E|=x#~UL7)8=RyAK1K}
z61SbRBiASEpReDNb$+n_wKJ;6dykoR#@llxMVwrMw+O&AQ~;)dXjj*mYFea{PfrfDr)7eBcFqOH-=Uw5(mgl>>Op7QWUwq&9=W6_DMd-6&}
zbh2JpRXxn*()ygG0Dm5TqZuVaM98^olwWaOSETA~*XOO7(;)1oU`_41_zhDD^E0$g
z&e#0hgY=wkoef@w{;`}OX_Vn9@1@^Ng!b+>gjluW+cDzYx34msM>JuiGMD1<#L;tG
zTxQe2UVh1S$asJC-|+`vyz;l(8?as(Wf#GzP);hSQyUTg$@K~JlqkZY6wA?)
zw%$2HswTC-x0a-EHT{pm{RYu0a-Eg;8&q$Z6w(sJtEq>*7xK%bu#v4wz
zXFOo$(6cD=Pg#e#?MN?Jec^-*9Ll~pq`u`t@>EERI#SwGqo^!kPkA<8V|(mtPno^=
zeu6iA40Nsw-DE+$5K~Nle$m9PQI~sw?$#7?trjWjw;dAEJDv%7e*m%{q87OCd7xro
z{=QqFk@^`n$=8P1fdJx)CaMX2sk34SQJoNn4vxIC*E!$*zTZAS-}Y|c
zkeH?7z}K^kgMTiC|NQ^|U8^YgDb+HXw4=6Syq!GLrEj>ShYTe3%Jkx7Y*|=BIWiRc
zlxY`%3JH6He}_BY6wqd%lKOg2)e?m9O!bI4z2r`9pXgk!NI%-K*v)SPn#QRwB9gk5
zKHz8eqR`Bt%*1ym97B0tZ8A3U{mA3UJxE8y7zmOdpYF=lp-ZIT3TBVq0I1!IlAu&)
zfCU!iI(pua)cyr5@+!Zsz+r2kZTPVgG8-?-)j%bUIp#cA)Mn{B`~HC<@2#q?i_@+T
z)zanPe)dDR!6h*R?>0g;sS`O4?P$PuA;vS>J&b9^k3;3wqhP!;_g>Z40;pYggVp6^
zc{;GzI5DsgRL(vzMs9h2gJg0$BI4k8(BI;7pqNv~MepQBCnQ~2k6|A!VO|-d*7_>HdWF?m
zW{~U6Zz>;t-S-XBV$}i(wE0HV$RaQ58LFDpI9$RVyI`i6k=~K(82=?B-K?kV;;&5%
zaQ48f0;j!4Hdqdfdca-yEB=Y9zm3@qz!FPNBM4{n9$K}6#s-t3F@pU;O}3sFu3dYs
zgOKRE$#YUw>qp?+QH#d>n3Ye$Njr%?04SdU2%ar7kan8PeF|vFGs)UOf(_0wbw}pH
z>q@RGB#8e8@mzlQ?$opWY71|l3GUdob$Vjr1>PT&z<1YAZVpf!JWICL=2d!-3xSB4
z%_212(B{98JJE)$c4&2M!kQ)@TGUZmE|fCz=&O)r*I8lt!S)5?OVtKta}zFNYRjf?
zlB$>ibaSqN(oLxZxKE$JT&@svUlo6l<=uw#T{`gHrN_-Hc4*w(^038o0J9P$^z}x7
z!bZ%84}+F93GJ4(DcklWd&F$>5J<~U+H&C-1OmN$Q{YP_?D@OShmYgEuUv6=j5ieeH{-GY{_DTiRZ5~*t#BHcpHHO#
z=f6H)z}dsoLUDkM@}haS(a&(k4#5f)<6$i2{-YndNQVCVO8O&CuG>X)QM}H55n#85^jNM>85V$DLabYfptgTMu@Q`SVvJZ+xa6X%JzbglpRzhT|
zBI;h%);Ob{_n(Mbo|7}T=PZX=N)ugF%lIGd;U##Kt6unsMZ$@er-#uNk>#Jq9GJp_
z$=)_8n_m;sv>hd0C^@6@qdjj39!fYy-QMlDk8D!J9l+M&W1Bb6Nqe_jZeyNb>4xq^
zTM82H!eqbQ%%7OdPpt^Msp_Ssrr>Tc-t#gsHBRw9HJ&|B>FzEMLSLqhRfsrwy{7(;zHSmpr(iwGPYsNqR!xV_#*Cjgk0S3wCO=CV
z6?>k}#@5U%x>CmBGHCk<$GwBaHMcX2X#q8PVVTl8jgPttAyt!RIXREe3u!;D8-4$G
zC-^_WTBs7X)y?2ERSrt-Yg3nMJ4z7M97HhZ3ud#MZ`0m%Eu%smMxIahT7_08{Lox5
zc==xXuu!lVUd^jPfQGn@udQFaL(6GtuwS50?RFdO3ZGfL1Cmw1P%c|6MtN0PqW_&|KT~%HB@-lgEf}*Bc)gfCWS%9*r&WP}#^#SyS#(czzt%;0F
zwdf5sWL9MnBbVY71`Gnqh>i$1C#Z7UlJ!UGYjfwa2k#sGkvbD)@44~UJg%PRM|f1G
zAmt{K?K=Z^1uBT(D=5k_;m>HEyHJL|M|dJ(L-P=lRB{}dWeptu?&i4
zvJ#V???Vy|V1prLZx?)Lv#KSqMJgkFWYd+5H{cA9C3YI#%kz$NW<)iX!Ge0Z{NM!exY!gyp7M2Wdy8>wiB+v
zw-K3%-GgqEe$q|f2HC1)SAoGrr~0_st=85bx<2i=a_^Qy`kBD|n)JrNf`%W2wu&)4
z1=)p-)3aaHW!*gOb@X+iE2kPvJKCCHON)BCQ8JsAI&ildGRtdHN0XXeWD=YYifH+6
zK*t6d7O$C+l=%vx2z4oG@FxK!=SV;)>Y2Hv@}P0G`>xq=!%B6A%$^p>AKCsfR*K7}
ztsxQr5ySoO7BGJ+*fjcAtgVr4m#JQ0KoiN``I*U+hIHpVXxuj{++~m`S~$Cif}@^4
z6MFVRkf#Z=jBc@?Iemcl(&uN-diEb|b@o+0qu=a#$qa7oU&R5MwW;qSOy#8oGHVwb
zgw(OaXeQKvueDRq7#NiHy)w86g)~VY@qZ(yC+O=YnPF?<^DgbM^>5FO`E3n^lI^*|
zfEE%Z2KZwi>R(`55TX^DNR_Y`OB!4Wrn{MU8khB^uGIWUsA77=N4_yA&2kaS7#sZ^
z;)xfoXeA}M@zcr^{E7L*9x5W{Ci6B@ef!Jk<>buzlBVX~dqbf=CPN>%o{~6o1`9sz
zU6FsYj0ZciXtmQX%lOTBt_X0SkFxz7Aja(@LC<%8eno4JJHAGBn5o>j6@J?W+u@6)
znIks#{G@8qvijja0#85z|D=r%oKesIa^&X$j{IZg*cERR_8#m%7&%a8ayGcoqro(L
zwlP3?H-nRGz99W4hmt>XC!kP@|Gzi>|GpI%)aiCC&FZmkryj7K!us_^jc%AQ?pph0
zhXB`q+v+#3Yj^Uf9s0mM_{u?X|8*rFFNcOIvjlbplSCV&;MzqJq(`H<>b_3*!sij6
z&0tT$>$ekIc3Q}0rJ3)GzgCc1ruFtB--__`@d`@>(~y_T?^L2nX<$v_~tOWzg1|u((83n*Gdk&xQ7E-ldcJ>-+?)}iTPTW8?3vp(OO$Dj-AbeegJ3kq>&_X7Ou;SYSg
zAH}xv90%u2(W0N1f&CWslT6))I0G2NosdX?Zf}GBBYA?4t8fK8fIpKbZiCE`Hv7lMn)8t
zqD^2bRd9Cv;)HVz}E3iU^q2v8G`%Kd)@`D{@?A>cB*g
z4NG?(u6bS@d?GhPz0@#8>aGiS$bD=HlWQ`J4kquL>px-_$mLVKkHDhhk5vpzF+q>E
zfcc@cH(P9+8>iB}#8#^L$44o~wyG1pfx`fJH|KxcA22u+pmGHsgA|GTw4WuR#2J)?
zw>YN#&*{L1LB%bwhV@8b4cmekEaQh@4cCD+%ui>5zZdXtOBhcxM{exFLkYCZKT1P{
z?kzAvO)v$m@6`R9R;9&MysTHoNAa@2w_k|v!G)?7AuJ9XJAHGSKjTZc?%
z?{s3oMYXEIw)sE>uwI4=oh7aDz}Qh*lTk-_ZW+i(EVov@|8`y
zhCKvc9cNDs!l&jD%)LkB%be#obQk#O@*g$^$lkS0wM=_*+}9Xe>|sw6*9#JtrVd@Y
zvCF$Wq!*-m7lHe~BLHy=0X?xQFZsufstB_G@-N)iii`j6*MDsqe|h5mZ@x3Pz@BQm
z^y94MBAC2+0jA+bL}UIdU}S*=co@M~b6lUYv?wv This Software Development Kit is licensed under the terms ofthe Steinberg VST 3 License,\nor alternatively under the terms of the General PublicLicense (GPL) Version 3.\nYou may use the Software Development Kit according to eitherof these licenses as it is\nmost appropriate for your project on a case-by-case basis(commercial or not). a) Proprietary Steinberg VST 3 License\nThe Software Development Kit may not be distributed in partsor its entirety\nwithout prior written agreement by Steinberg MediaTechnologies GmbH.\nThe SDK must not be used to re-engineer or manipulate anytechnology used\nin any Steinberg or Third-party application or softwaremodule,\nunless permitted by law.\nNeither the name of the Steinberg Media Technologies GmbH northe names of its\ncontributors may be used to endorse or promote productsderived from this\nsoftware without specific prior written permission.\nBefore publishing a software under the proprietary license, you need to obtain a copy\nof the License Agreement signed by Steinberg MediaTechnologies GmbH.\nThe Steinberg VST SDK License Agreement can be found at:\n THE SDK IS PROVIDED BY STEINBERG MEDIA TECHNOLOGIES GMBH \"ASIS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITEDTO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULARPURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL STEINBERG MEDIA TECHNOLOGIES GMBH BE LIABLEFOR ANY DIRECT,\nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIALDAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ORSERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSEDAND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE\nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED\nOF THE POSSIBILITY OF SUCH DAMAGE. b) General Public License (GPL) Version 3\nDetails of these licenses can be found at: \n//---------------------------------------------------------------------------------","breadcrumbs":"VST 3 Licensing » What are the licensing options » Steinberg Dual-License file","id":"147","title":"Steinberg Dual-License file"},"148":{"body":"/ VST Home / VST 3 Licensing On this page: Which files of the VST 3 SDK fall under which license? What about VST 2? Related pages: VST 3 Licensing","breadcrumbs":"VST 3 Licensing » Which files fall under which license? » Which files fall under which license?","id":"148","title":"Which files fall under which license?"},"149":{"body":"All files describing the VST 3 interface, except VST 2 files, located in the folder \"pluginterfaces\" of the SDK, fall under the dual-license described previously. Each of these files includes this text: //----------------------------------------------------------------------------\n// This file is part of a Steinberg SDK. It is subject to thelicense terms\n// in the LICENSE file found in the top-level directory ofthis distribution\n// and at www.steinberg.net/sdklicenses.\n// No part of the SDK, including this file, may be copied, modified, propagated,\n// or distributed except according to the terms contained inthe LICENSE file.\n//---------------------------------------------------------------------------- for all other files of the VST 3 SDK , the respective embedded license text is applicable, for example: all VSTGUI files fall under a BSD style license all Helper files (included in base and public.sdk folders) except VST 2 files fall under a BSD style license all mda-vst3 examples ( public.sdk/samples/mda-vst3 folder ) fall under a BSD style license: Copyright (c) 2008 Paul Kellett","breadcrumbs":"VST 3 Licensing » Which files fall under which license? » Which files of the VST 3 SDK fall under which license?","id":"149","title":"Which files of the VST 3 SDK fall under which license?"},"15":{"body":"VST Home / What is VST? On this page: Why use VST 3 SDK? Advantages of using VST 3 SDK Examples of VST 3 host applications (05/10/2023) Related pages: Main benefits of VST 3","breadcrumbs":"What is VST? » Use cases » Use cases","id":"15","title":"Use cases"},"150":{"body":"The \" Proprietary Steinberg VST 2 \" license, which is the VST 2 license agreement, allows you to distribute your VST 2 plug-in/host in a binary form. However, please note the following requirements: You need written permission from Steinberg Media Technologies GmbH in order to distribute your VST 2 plug-in/host (which had to be done before October 2018). You need to mention Steinberg Media Technologies GmbH in the about box and/or documentation of your VST 2 plug-in/host and follow the Steinberg VST usage guidelines . Note that the \" Proprietary Steinberg VST 3 \" license does not include the \" Proprietary Steinberg VST 2 \" license, you have to sign it separately! It was available in the VST 2 SDK and in the VST 3 SDK old version. Note that from the first of October 2018, Steinberg does not accept any more submissions of license agreement for VST 2 plug-in/host! This means: If you do not have a license agreement signed with Steinberg before October 2018 , you are not allowed to distribute VST 2 plug-ins or VST 2 hosts!","breadcrumbs":"VST 3 Licensing » Which files fall under which license? » What about VST 2?","id":"150","title":"What about VST 2?"},"151":{"body":"/ VST Home / VST 3 Licensing Related pages: Steinberg VST usage guidelines What are the licensing options for VST 3? See Frequently Asked Questions: Licensing","breadcrumbs":"VST 3 Licensing » Developer use cases (FAQs) » Developer use cases (FAQs)","id":"151","title":"Developer use cases (FAQs)"},"152":{"body":"/ VST Home Related pages: VST 3 Links How to set up my system for VST 3 Preparation on Windows This section provides general information about where to find the VST 3 SDK and how to get it.","breadcrumbs":"Getting Started » Getting Started","id":"152","title":"Getting Started"},"153":{"body":"Important links you will need for working with VST 3 .","breadcrumbs":"Getting Started » VST 3 Links","id":"153","title":"VST 3 Links"},"154":{"body":"In order to build VST 3 plug-ins, you need the source code of the VST 3 (interface definition), an IDE/compiler, cmake and a VST 3 host application.","breadcrumbs":"Getting Started » How to set up my system for VST 3","id":"154","title":"How to set up my system for VST 3"},"155":{"body":"/ VST Home / Getting Started On this page: Getting VST 3 SDK Download the full VST 3 package as zip file Clone VST 3 repository from GitHub Online Documentation VST 3 Forum VSTGUI External Links to VST 3, DSP, Conferences and Plug-ins development Related pages: How to set up my system for VST 3 Important links you will need for working with VST 3 .","breadcrumbs":"Getting Started » VST 3 Links » VST 3 Links","id":"155","title":"VST 3 Links"},"156":{"body":"You have 2 possibilities for getting the VST 3 SDK: Component as zip package as GitHub repository VST 3 API ✔️ ✔️ Helpers classes ✔️ ✔️ AAX, AUv3 and AU wrappers ✔️ ✔️ iOS Inter-App Audio support ✔️ ✔️ VST 3 Plug-ins Examples ✔️ ✔️ Validator command line ✔️ ✔️ AudioAudioHost ✔️ ✔️ EditorHost ✔️ ✔️ VST 3 Inspector ✔️ ✔️ VSTGUI ✔️ ✔️ VST 3 Project Generator ✔️(as exe only) ✔️(as source code) VST 3 Plug-in Test Host (exe only) ✔️ ❌ VST 3 Licensing ✔️Proprietary+ GPLv3 ❌only GPLv3","breadcrumbs":"Getting Started » VST 3 Links » Getting VST 3 SDK","id":"156","title":"Getting VST 3 SDK"},"157":{"body":"Download a full VST 3 SDK package which includes everything you need to build a VST 3 plug-in or host. Test your VST 3 plug-in in real-time with the included VST 3 Plug-in Test Host and execute automated tests (See What is the VST 3 SDK? ): https://www.steinberg.net/vst3sdk (direct link to zip file, ~100 MB)","breadcrumbs":"Getting Started » VST 3 Links » Download the full VST 3 package as zip file","id":"157","title":"Download the full VST 3 package as zip file"},"158":{"body":"Clone the VST 3 SDK repository from GitHub for easy integration into your workspace: https://github.com/steinbergmedia/vst3sdk ⓘ Note Independently of the download source of the VST 3 SDK be sure that you follow the license agreement (check What are the licensing options for VST 3? )","breadcrumbs":"Getting Started » VST 3 Links » Clone VST 3 repository from GitHub","id":"158","title":"Clone VST 3 repository from GitHub"},"159":{"body":"Browse the VST 3 SDK 's online documentation including API reference and sample code: https://steinbergmedia.github.io/vst3_doc Browse the VST portal for the whole documentation and tutorials: https://steinbergmedia.github.io/vst3_dev_portal/pages/index.html","breadcrumbs":"Getting Started » VST 3 Links » Online Documentation","id":"159","title":"Online Documentation"},"16":{"body":"There are different use cases you can realize by using the VST 3 SDK : You are a plug-in developer and you want to create audio FX or instrument plug-ins which can be included and used in a VST 3 host application. an audio FX plug-in is an audio processor effect taking audio as input and creating audio as output: such as Delay , Phaser , Compressor , Reverb , … an instrument plug-in is a sound/audio generator, taking as input note events and creating audio as output: such as emulations of well-known hardware synths. There are 2 kinds of instrument plug-ins: virtual sample-based (using audio samples as the basis for sound generation) and virtual synth (using different types of synthesis: physical modelling, additive, subtractive, FM, sample-based, …) You are a host developer and you want to load in your application VST 3 plug-ins: audio FX and/or instruments plug-ins.","breadcrumbs":"What is VST? » Use cases » Why use VST 3 SDK?","id":"16","title":"Why use VST 3 SDK?"},"160":{"body":"Visit Steinberg's VST Developer Forum in order to get help with development, submit bug reports, request new features and connect to other VST 3 developers: https://sdk.steinberg.net","breadcrumbs":"Getting Started » VST 3 Links » VST 3 Forum","id":"160","title":"VST 3 Forum"},"161":{"body":"When you download the VST 3 SDK , the last official release version of VSTGUI is included, but you can get it (the release and the development branches) from github: https://github.com/steinbergmedia/vstgui","breadcrumbs":"Getting Started » VST 3 Links » VSTGUI","id":"161","title":"VSTGUI"},"162":{"body":"Here, you can find some links to external resource about VST 3 , DSP and Plug-ins development: Category Links YouTube • ADC 2020 : Support of MIDI2 and MIDI-CI in VST 3 instruments, Arne Scheffler and Janne Roeper getting_started_vid_1 • ADC 2017 : VST 3 history, advantages and best practice, Yvan Grabit getting_started_vid_2 • ADC 2016 : The Golden Rules of Audio Programming, Pete Goodliffe • How to setup the VST 3 SDK's Sample Plug-in Projects Forums / Mailing List • KVRAudio Forum : DSP and Plug-in Development • music-dsp mailing list at columbia.edu • music-dsp Web • Sursound mailing list at Virginia Tech • DSP Stack Overflow : DSP Developer community • Stack Overflow : Developer community Tools / Libraries • MATLAB® : Audio Plug-in Creation and Hosting • Blender : A free and open source 3D creation suite • Armadillo : C++ library for linear algebra & scientific computing • lapack++ : Linear Algebra PACKage in C++ • dlib : Dlib is a modern C++ toolkit • Intel MKL : Intel® Math Kernel Library • CMSIS-DSP : CMSIS-DSP is an optimized compute library for Arm CPU (filtering, mathematics,...) Books • DSP related.com : Articles, news, and blogs about basic and modern DSP topics • Introduction to Signal Processing by Sophocles J. Orfanidis • DSP Guide by Steven W. Smithn (The Scientist and Engineer's Guide to Digital Signal Processing) • Online Books by Julius O. Smith III (Mathematics of the Discrete Fourier Transform (DFT), Introduction to Digital Filters, Physical/Spectral Audio Signal Processing) • Seeing Circles, Sines, and Signals : A visual and interactive introduction to DSP • The ART of VA Filter Design by Vadim Zavalishin (theoretical and practical aspects of the virtual analog filter design in the music DSP context) • Stackoverflow - The Definitive C++ Book Guide and List : Nice list of C++ books (for beginner to advanced levels) Conferences • ADC : Audio Developer Conference by Roli • DAFx : Digital Audio Effects • ICASSP : International Conference on Acoustics, Speech, and Signal Processing • ISMIR : International Society for Music Information Retrieval Other • VST on wikipedia • VST Story Interview • Steinberg Media Technologies getting_started_vid_3","breadcrumbs":"Getting Started » VST 3 Links » External Links to VST 3, DSP, Conferences and Plug-ins development","id":"162","title":"External Links to VST 3, DSP, Conferences and Plug-ins development"},"163":{"body":"/ VST Home / Getting Started On this page: Get the source code From the downloaded vstsdk.zip file From GitHub: Get an IDE for development For Windows For MacOS For Linux Package Requirements Get cmake Get a VST 3 host application Related pages: VST 3 Links Using cmake for building VST 3 plug-ins In order to build VST 3 plug-ins, you need the source code of the VST 3 (interface definition), an IDE/compiler, cmake and a VST 3 host application.","breadcrumbs":"Getting Started » How to set up my system for VST 3 » How to setup up my system for VST 3","id":"163","title":"How to setup up my system for VST 3"},"164":{"body":"","breadcrumbs":"Getting Started » How to set up my system for VST 3 » Get the source code","id":"164","title":"Get the source code"},"165":{"body":"Download the VST 3 SDK : check VST 3 SDK Download . Unpack the zip file to a development folder on your computer.","breadcrumbs":"Getting Started » How to set up my system for VST 3 » From the downloaded vstsdk.zip file","id":"165","title":"From the downloaded vstsdk.zip file"},"166":{"body":"git clone --recursive https://github.com/steinbergmedia/vst3sdk.git","breadcrumbs":"Getting Started » How to set up my system for VST 3 » From GitHub:","id":"166","title":"From GitHub:"},"167":{"body":"","breadcrumbs":"Getting Started » How to set up my system for VST 3 » Get an IDE for development","id":"167","title":"Get an IDE for development"},"168":{"body":"On Windows , we recommend that you to use Visual Studio C++ or Visual Studio Code . You can get it for free here https://visualstudio.microsoft.com/free .","breadcrumbs":"Getting Started » How to set up my system for VST 3 » For Windows","id":"168","title":"For Windows"},"169":{"body":"On MacOS, a first choice is Xcode (available here https://developer.apple.com/xcode/ ).","breadcrumbs":"Getting Started » How to set up my system for VST 3 » For MacOS","id":"169","title":"For MacOS"},"17":{"body":"By using VST 3 SDK directly: you are sure to be compliant with the VST 3 format. developing your plug-in based on the VST 3 format allows you to support easily new VST 3 features that improve the integration of these plug-ins inside a DAW. Some 3rd party SDKs use only a common layer between all plug-in formats, limiting in this way the possibility for a better integration, for example exclusive VST 3 features: context menu dirty state loading differentially a preset or a project note expression see other benefits of VST 3 you get optimal integration of the VSTGUI tool with VST 3 . it includes the major plug-in format wrappers: AAX , AUv3 , AU . the included Validator allows you to check your plug-in's conformity to the VST 3 standard.","breadcrumbs":"What is VST? » Use cases » Advantages of using VST 3 SDK","id":"17","title":"Advantages of using VST 3 SDK"},"170":{"body":"In order to build the SDK successfully, you need an Ubuntu-based Linux distribution. Other distributions might work as well, but are not tested. Download Linux: http://www.ubuntu.com or https://www.linuxmint.com Install it directly or in a virtual machine like Parallels. We used and tested on Ubuntu 22.04 LTS.","breadcrumbs":"Getting Started » How to set up my system for VST 3 » For Linux","id":"170","title":"For Linux"},"171":{"body":"Building the SDK examples requires installation of several packages: Required: sudo apt-get install cmake gcc \"libstdc++6\" libx11-xcb-dev libxcb-util-dev libxcb-cursor-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev libcairo2-dev libgtkmm-3.0-dev libsqlite3-dev libxcb-keysyms1-dev ⓘ Note On Raspbian/Debian, replace \"libxcb-util-dev\" with \"libxcb-util0-dev\" Optional: sudo apt-get install subversion git ninja-build A recommended IDE (optional): QTCreator sudo apt-get install qtcreator ⓘ Note You can also use the bash file \"setup_linux_packages_for_vst3sdk.sh\" included in the VST3_SDK/tools folder! ⓘ Note \\ Instead of gcc compiler, a recent version of clang compiler will also work! libgtkmm3 is required for VSTGUI and the editorhost example! Jack Audio is required for audiohost example!","breadcrumbs":"Getting Started » How to set up my system for VST 3 » Package Requirements","id":"171","title":"Package Requirements"},"172":{"body":"In order to control the compilation process and create an IDE project, VST 3 SDK uses the open-source and cross-platform tool cmake . You can download cmake here: https://cmake.org/download/ or use a package manager for your OS (Linux). You can use it as a command line tool or use the cmake executable with GUI. cmake-gui is included in the cmake package: getting_started_1 Specific on Windows You have to adapt your Windows right access to allow creation of symbolic links for VST 3 plug-ins: Check HERE!","breadcrumbs":"Getting Started » How to set up my system for VST 3 » Get cmake","id":"172","title":"Get cmake"},"173":{"body":"You can use your favorite VST 3 host application, see here for some examples, or you can use the VST 3 Plug-in Test Host application included in the VST 3 SDK .","breadcrumbs":"Getting Started » How to set up my system for VST 3 » Get a VST 3 host application","id":"173","title":"Get a VST 3 host application"},"174":{"body":"/ VST Home / Getting Started Generated VST 3 Microsoft Visual Studio Projects using the cmake included in the SDK will create by default symbolic links for each built plug-in in the official VST 3 folder ( C:\\Program Files\\Common Files\\VST3 ). In this folder it is not directly possible to write these symbolic links if you are allowed to do this (not Administrator for example), to solve this problem you have 4 solutions:","breadcrumbs":"Getting Started » Preparation on Windows » Preparation on Windows","id":"174","title":"Preparation on Windows"},"175":{"body":"If you do not want to create these links, call cmake with this parameter: -DSMTG_CREATE_PLUGIN_LINK=0","breadcrumbs":"Getting Started » Preparation on Windows » Solution 1","id":"175","title":"Solution 1"},"176":{"body":"You could choose (which is the default) the new user location for VST 3 plug-ins which should have no right access issue as normal user, call cmake with this parameter: -DSMTG_PLUGIN_TARGET_USER_PROGRAM_FILES_COMMON=1","breadcrumbs":"Getting Started » Preparation on Windows » Solution 2","id":"176","title":"Solution 2"},"177":{"body":"In order to allow create these symbolic links on Windows you could edit the \" Settings > System > For developers \" by enabling the Developer Mode : getting_started_4","breadcrumbs":"Getting Started » Preparation on Windows » Solution 3","id":"177","title":"Solution 3"},"178":{"body":"In order to allow create these symbolic links on Windows you have to adapt the Group Policy of Windows which is only available by default in Windows Pro but not in Windows Home . In Windows Home you have to install it before changing the right access to this folder ( C:\\Program Files\\Common Files\\VST3 ). For this there are some internet webpages showing you how to do this, for example this one: https://www.itechtics.com/enable-gpedit-msc-windows-11 . As soon as the group Policy editor is available you have to start it by: Enter run in the Windows search field and start the run App and enter gpedit.msc or Enter Edit group policy in the Windows search field: getting_started_2 Now the Local Group Policy Editor is started: Navigate to: Computer Configuration => Windows Settings => Security Settings =>Local Policies => User Rights Assignment => Create symbolic links Here, you can set which users can create symbolic links, add your user name. getting_started_3","breadcrumbs":"Getting Started » Preparation on Windows » Solution 4","id":"178","title":"Solution 4"},"179":{"body":"/ VST Home On this page: Building the examples included in the SDK Building the examples included in the SDK on Windows Building the examples included in the SDK on macOS Building the examples included in the SDK on Linux Using cmake for building VST 3 plug-ins Generate a new plug-in with the Project Generator App Code your first plug-in Use VSTGUI to design a User Interface Data Exchange Advanced VST 3 techniques How to use the silence flags Guideline for replacing a VST 2 plug-in by a VST 3 plug-in Strings Conversion Helper Creating a cmake plug-in project from scratch Creating a plug-in with VST 3 SDK as an external project Switching to another VSTGUI submodule or branch Tutorials on Youtube from 3rd Party developers How to setup the VST 3 SDK's Sample Plugin Projects VST 3 SDK Tutorial: Create your own VST 3 Synth plug-in Building Your First Audio Plug-in (Windows 10) Building Your First Audio Plug-in (macOS) Building Your First Audio Plug-in (Linux Ubuntu) The tutorials explain common techniques and best practices for building your plug-ins. By following the instruction step by step you will learn how to develop VST 3 plug-ins. ⓘ Note This section is under construction and will be extended inthe future with new tutorials.","breadcrumbs":"Tutorials » Tutorials","id":"179","title":"Tutorials"},"18":{"body":"Name Companies Link ACID Pro MAGIX Software GmbH https://www.magix.com Acoustica Acon Digital https://acondigital.com Ardour Ardour Team https://ardour.org Audacity Audacity Team https://www.audacityteam.org Audition Adobe https://www.adobe.com Bidule Plogue Art et Technologie, Inc. https://www.plogue.com Bitwig Bitwig GmbH https://www.bitwig.com Camelot Audio Modeling https://audiomodeling.com Cantabile Topten Software https://www.cantabilesoftware.com Catalyst Toneworks https://toneworks.io/ Cross DJ MixVibes https://www.mixvibes.com Cubase Steinberg Media Technologies GmbH https://new.steinberg.net/cubase DaVinci Resolve Blackmagic Design https://www.blackmagicdesign.com/products/davinciresolve Decibel Process Audio https://process.audio deCoda zplane https://products.zplane.de/products/decoda Digital Performer MOTU https://motu.com/en-us/products/software/dp Dime time offaudio https://timeoff.audio Dorico Steinberg Media Technologies GmbH https://new.steinberg.net/dorico Entonal Studio Node Audio https://entonal.studio FL Studio ImageLine https://www.image-line.com Fluid Chords Pitch Innovations https://www.pitchinnovations.com Freestyle Suite New Sonic Arts https://www.newsonicarts.com Gig Performer Deskew Technologies https://gigperformer.com Komplete Kontrol Vienna Symphonic Library GmbH https://www.native-instruments.com KSHMR Chain Excite Audio https://www.excite-audio.com Live Ableton AG https://www.ableton.com/en/live Maschine Native Instruments https://www.native-instruments.com Max Cycling 74 https://cycling74.com Metro Sagan Technology https://sagantech.com Mixbus Harrison Audio https://harrisonaudio.com/daw-home-page Mixcraft Acoustica https://acoustica.com MultitrackStudio Bremmers Audio Design https://www.multitrackstudio.com Music Maker Plus MAGIX Software GmbH https://www.magix.com Nuendo Steinberg Media Technologies GmbH https://new.steinberg.net/nuendo Orb Composer Pro Hexachords https://hexachords.com Overture Sonic Scores https://sonicscores.com OwlPlug OwlPlug https://owlplug.com Qtractor rncbc https://qtractor.org Reaper Reaper https://www.reaper.fm Reason + Reason Studios https://reasonstudios.com Re:Cycle Digital Brain Instruments https://www.digitalbrain-instruments.com RipX DeepAudio Hit’n’Mix Ltd https://hitnmix.com Samplitude MAGIX Software GmbH https://www.magix.com Serato Studio 2 Serato https://serato.com Sonar Bandlab/Cakewalk https://www.bandlab.com/products/cakewalk Sound Forge Audio Studio MAGIX Software GmbH https://www.magix.com Sound Trajectory 2 TripinLab https://www.tripinlab.com Soundop Ivosight Software Inc. https://ivosight.com SpectraLayers Steinberg Media Technologies GmbH https://www.steinberg.net/spectralayers Studio One PreSonus Software Ltd https://www.presonus.com/products/Studio-One Superplugin DDMF https://ddmf.eu TS2 Ircam Lab https://www.ircamlab.com Vienna MIR PRO 3D Vienna Symphonic Library GmbH https://www.vsl.co.at VoxPat Pro Digital Brain Instruments https://www.digitalbrain-instruments.com/ VST Live Steinberg Media Technologies GmbH https://www.steinberg.net/vst-live VST Rack Pro Yamaha Corporation https://europe.yamaha.com/en/products/proaudio/software/vst_rack/index.html Waveform Tracktion Software Corporation https://www.tracktion.com Wavelab Steinberg Media Technologies GmbH https://new.steinberg.net/wavelab Zrythm DAW Zrythm https://www.zrythm.org","breadcrumbs":"What is VST? » Use cases » Examples of VST 3 host applications (05/10/2023)","id":"18","title":"Examples of VST 3 host applications (05/10/2023)"},"180":{"body":"","breadcrumbs":"Tutorials » Building the examples included in the SDK","id":"180","title":"Building the examples included in the SDK"},"181":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK .","breadcrumbs":"Tutorials » Building the examples included in the SDK on Windows","id":"181","title":"Building the examples included in the SDK on Windows"},"182":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK .","breadcrumbs":"Tutorials » Building the examples included in the SDK on macOS","id":"182","title":"Building the examples included in the SDK on macOS"},"183":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK .","breadcrumbs":"Tutorials » Building the examples included in the SDK on Linux","id":"183","title":"Building the examples included in the SDK on Linux"},"184":{"body":"Link This tutorial explains how to use cmake with VST 3 SDK .","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins","id":"184","title":"Using cmake for building VST 3 plug-ins"},"185":{"body":"Link This tutorial explains how to create a new audio plug-in by using the VST 3 Project Generator included in the VST 3 SDK .","breadcrumbs":"Tutorials » Generate a new plug-in with the Project Generator App","id":"185","title":"Generate a new plug-in with the Project Generator App"},"186":{"body":"Link Following the previous tutorial Generate a new plug-in with the Project Generator App , this tutorial explains how to code an audio plug-in and how to add some basic features.","breadcrumbs":"Tutorials » Code your first plug-in","id":"186","title":"Code your first plug-in"},"187":{"body":"Link This tutorial explains how to use VSTGUI . VSTGUI comes with a WYSIWYG editor that allows you to create stunning user interfaces for your plug-in.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface","id":"187","title":"Use VSTGUI to design a User Interface"},"188":{"body":"Link This tutorial explains how to send data from the realtime process to the edit controller.","breadcrumbs":"Tutorials » Data Exchange","id":"188","title":"Data Exchange"},"189":{"body":"Link In this tutorial, you will learn: How to add nearly sample-accurate parameter changes to an audio effect How to use C++ templates to write one algorithm supporting 32 bit and 64 bit audio processing How to set the state of the audio effect in a thread safe manner","breadcrumbs":"Tutorials » Advanced VST 3 techniques","id":"189","title":"Advanced VST 3 techniques"},"19":{"body":"/ VST Home On this page: 1. Improved Performance with the Silence Flag 2. Multiple Dynamic I/Os 3. Sample-accurate Automation 4. Logical Parameter Organization 5. Resizeable UI Editor 6. Mouse Over Support 7. Context Menu Support 8. Channel Context Information 9. Note Expression 10. 3D Audio Support 11. Factory Concept 12. Support Remote control Representation 13. Others Related pages: What is the VST 3 SDK? Here, you can find a non-exhaustive list of VST 3 benefits. VST 3 is a general rework of the long-serving VST plug-in interface (VST 1 & VST 2) . It is not compatible with the older VST (1 & 2) versions, but it includes some new features and possibilities. We have redesigned the API to make it not only far easier and more reliable for developers to work with, but have also provided completely new possibilities for plug-ins. These include:","breadcrumbs":"Main benefits of VST 3 » Main benefits of VST 3","id":"19","title":"Main benefits of VST 3"},"190":{"body":"Link This tutorial explains how to use silence flags.","breadcrumbs":"Tutorials » How to use the silence flags","id":"190","title":"How to use the silence flags"},"191":{"body":"Link This guideline explains what could be done for creating a VST 3 plug-in replacing an old VST 2 plug-in.","breadcrumbs":"Tutorials » Guideline for replacing a VST 2 plug-in by a VST 3 plug-in","id":"191","title":"Guideline for replacing a VST 2 plug-in by a VST 3 plug-in"},"192":{"body":"Link The SDK provides some helpers functions to convert from UTF16 (use in VST 3 interfaces) to UTF8 (used by std::string).","breadcrumbs":"Tutorials » Strings Conversion Helper","id":"192","title":"Strings Conversion Helper"},"193":{"body":"Link This tutorial provides a step-by-step guide for building a VST 3 plug-in's CMakeLists.txt from scratch.","breadcrumbs":"Tutorials » Creating a cmake plug-in project from scratch","id":"193","title":"Creating a cmake plug-in project from scratch"},"194":{"body":"Link This is a simple Hello World VST 3 SDK plug-in to demonstrate how to use the VST 3 SDK as an external project.","breadcrumbs":"Tutorials » Creating a plug-in with VST 3 SDK as an external project","id":"194","title":"Creating a plug-in with VST 3 SDK as an external project"},"195":{"body":"Link Sometimes it is necessary to switch to another VSTGUI submodule or branch for testing purpose. This tutorial explains how to do that.","breadcrumbs":"Tutorials » Switching to another VSTGUI submodule or branch","id":"195","title":"Switching to another VSTGUI submodule or branch"},"196":{"body":"","breadcrumbs":"Tutorials » Tutorials on Youtube from 3rd Party developers","id":"196","title":"Tutorials on Youtube from 3rd Party developers"},"197":{"body":"https://www.youtube.com/watch?v=004zcWwgi1A","breadcrumbs":"Tutorials » How to setup the VST 3 SDK's Sample Plugin Projects","id":"197","title":"How to setup the VST 3 SDK's Sample Plugin Projects"},"198":{"body":"https://www.youtube.com/watch?v=zdgytoRLKj0","breadcrumbs":"Tutorials » VST 3 SDK Tutorial: Create your own VST 3 Synth plug-in","id":"198","title":"VST 3 SDK Tutorial: Create your own VST 3 Synth plug-in"},"199":{"body":"https://www.youtube.com/watch?v=4MQZyZKOPPM","breadcrumbs":"Tutorials » Building Your First Audio Plug-in (Windows 10)","id":"199","title":"Building Your First Audio Plug-in (Windows 10)"},"2":{"body":"Virtual Studio Technology ( VST ) is an audio plug-in software interface that facilitates the integration of software synthesizers and effects in digital audio workstations (DAW). Use cases","breadcrumbs":"VST » What is VST?","id":"2","title":"What is VST?"},"20":{"body":"Managing large plug-in sets and multiple virtual instruments on typical studio computer systems can often be difficult because of CPU performance limits. VST 3 helps to improve overall performance by applying processing to plug-ins only when audio signals are present on their respective inputs. Instead of always processing input signals, VST 3 plug-ins can apply their processing economically and only when it is needed.","breadcrumbs":"Main benefits of VST 3 » 1. Improved Performance with the Silence Flag","id":"20","title":"1. Improved Performance with the Silence Flag"},"200":{"body":"https://www.youtube.com/watch?v=Twcx6Sd6HBw","breadcrumbs":"Tutorials » Building Your First Audio Plug-in (macOS)","id":"200","title":"Building Your First Audio Plug-in (macOS)"},"201":{"body":"https://www.youtube.com/watch?v=jXryyxEsFag","breadcrumbs":"Tutorials » Building Your First Audio Plug-in (Linux Ubuntu)","id":"201","title":"Building Your First Audio Plug-in (Linux Ubuntu)"},"202":{"body":"/ VST Home / Tutorials On this page: Building the examples included in the SDK on Windows Building the examples included in the SDK on macOS Building the examples included in the SDK on Linux","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK","id":"202","title":"Building the examples included in the SDK"},"203":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK on Windows.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows","id":"203","title":"Building the examples included in the SDK on Windows"},"204":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK on macOS.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on macOS","id":"204","title":"Building the examples included in the SDK on macOS"},"205":{"body":"Link This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK on Linux.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Linux","id":"205","title":"Building the examples included in the SDK on Linux"},"206":{"body":"/ VST Home / Tutorials / Building the examples On this page: Goal Part 1: Getting and installing the VST 3 SDK Part 2: Building the examples on Windows Building using cmake-gui","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows » Building the examples included in the SDK on Windows","id":"206","title":"Building the examples included in the SDK on Windows"},"207":{"body":"This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK . These include plug-ins like simple DSP effects (Gain, compressor, delay, ...), synths instruments and some plug-ins showing how to handle some specific VST 3 features (Note Expression, Program Change, channel info context, ...). They can be loaded into VST 3 hosts like Cubase, WaveLab, ...","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows » Goal","id":"207","title":"Goal"},"208":{"body":"For downloading the SDK, see this section \" How to set up my system for VST 3 \". Download cmake from: https://cmake.org/download/ or use a package manager for your OS.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows » Part 1: Getting and installing the VST 3 SDK","id":"208","title":"Part 1: Getting and installing the VST 3 SDK"},"209":{"body":"Create a folder for the build and move to this folder (using cd): mkdir build\ncd build Generate the solution/projects: specify the path to the project where CMakeLists.txt is located: cmake.exe -G \"Visual Studio 17 2022\" -A x64 ../vst3sdk\nor without symbolic links\ncmake.exe -G \"Visual Studio 17 2022\" -A x64 ../vst3sdk-DSMTG_CREATE_PLUGIN_LINK=0 ⓘ Note You can find the string definition for different Visual Studio Generators in the cmake online documentation ( https://cmake.org/documentation/ ) You have to adapt your Windows right access to allow creation of symbolic links for VST 3 plug-ins: Check HERE! Build the plug-in (you can use Visual Studio too): msbuild.exe vstsdk.sln\n(or alternatively for example for release) cmake --build . --config Release","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows » Part 2: Building the examples on Windows","id":"209","title":"Part 2: Building the examples on Windows"},"21":{"body":"VST 3 plug-ins are no longer limited to a fixed number of inputs and outputs, and their I/O configuration can dynamically adapt to the channel configuration. Side-chains are also very easily realizable. This includes the possibility to deactivate unused busses after loading and even reactivate those when needed. This cleans up the mixer and further helps to reduce CPU load.","breadcrumbs":"Main benefits of VST 3 » 2. Multiple Dynamic I/Os","id":"21","title":"2. Multiple Dynamic I/Os"},"210":{"body":"Start the cmake-gui application which is part of the cmake installation ( https://cmake.org/download/ ) tutorials_1 Browse Source... : select the folder VST3_SDK Browse Build... : select a folder where the outputs (projects/...) will be created. Typically a folder named build You can check the SMTG Options Press Configure and choose the generator in the window that opens: for example \" Visual Studio 17 2022 \" tutorials_2 Press Generate to create the project Open your targeted IDE, and compile the solution/project.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Windows » Building using cmake-gui","id":"210","title":"Building using cmake-gui"},"211":{"body":"/ VST Home / Tutorials / Building the examples On this page: Goal Part 1: Getting and installing the VST 3 SDK Part 2: Building the examples on macOS","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on macOS » Building the examples included in the SDK on macOS","id":"211","title":"Building the examples included in the SDK on macOS"},"212":{"body":"This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK . These include plug-ins like simple DSP effects (Gain, compressor, delay, ...), synths instruments and some plug-ins showing how to handle some specific VST 3 features (Note Expression, Program Change, channel info context, ...). They can be loaded into VST 3 hosts like Cubase, WaveLab, ...","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on macOS » Goal","id":"212","title":"Goal"},"213":{"body":"For downloading the SDK, see this section \" How to set up my system for VST 3 \". Download cmake from: https://cmake.org/download/ or use a package manager for your OS.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on macOS » Part 1: Getting and installing the VST 3 SDK","id":"213","title":"Part 1: Getting and installing the VST 3 SDK"},"214":{"body":"Create a folder for the build and move to this folder (using cd): mkdir build\ncd build Generate the solution/projects: specify the path to the project where CMakeLists.txt is located: For XCode: cmake -GXcode ../vst3sdk Without XCode (here debug variant): cmake -DCMAKE_BUILD_TYPE=Debug ../ Build the plug-in (you can use XCode too): xcodebuild\n(or alternatively for example for release) cmake --build . --config Release","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on macOS » Part 2: Building the examples on macOS","id":"214","title":"Part 2: Building the examples on macOS"},"215":{"body":"/ VST Home / Tutorials / Building the examples On this page: Goal Part 1: Getting and installing the VST 3 SDK Part 2: Building the examples on Linux","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Linux » Building the examples included in the SDK on Linux","id":"215","title":"Building the examples included in the SDK on Linux"},"216":{"body":"This tutorial explains how to set up your computer and create an environment for compiling the VST 3 audio plug-in examples provided with the VST 3 SDK . These include plug-ins like simple DSP effects (Gain, compressor, delay, ...), synths instruments and some plug-ins showing how to handle some specific VST 3 features (Note Expression, Program Change, channel info context, ...). They can be loaded into VST 3 hosts like Cubase, WaveLab, ...","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Linux » Goal","id":"216","title":"Goal"},"217":{"body":"For downloading the SDK, see this section \" How to set up my system for VST 3 \". Download cmake from: https://cmake.org/download/ or use a package manager for your OS.","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Linux » Part 1: Getting and installing the VST 3 SDK","id":"217","title":"Part 1: Getting and installing the VST 3 SDK"},"218":{"body":"Install the required packages: Required packages Create a folder for the build and move to this folder (using cd): mkdir build\ncd build Generate the solution/projects: specify the path to the project where CMakeLists.txt is located: cmake ../vst3sdk Build the plug-in: make\n(or alternatively for example for release) cmake --build . --config Release","breadcrumbs":"Tutorials » Building the examples included in the SDK » Building the examples included in the SDK on Linux » Part 2: Building the examples on Linux","id":"218","title":"Part 2: Building the examples on Linux"},"219":{"body":"/ VST Home / Tutorials On this page: Goal CMake for building VST 3 plug-ins Command line for Windows Command line for macOS On Linux with QtCreator Use of cmake-gui Available SMTG cmake options Using your IDE for compiling the examples Related pages: How to set up my system for VST 3 Building the examples included in the SDK on Windows Building the examples included in the SDK on macOS Building the examples included in the SDK on Linux","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Using cmake for building VST 3 plug-ins","id":"219","title":"Using cmake for building VST 3 plug-ins"},"22":{"body":"VST 3 also features vastly improved parameter automation with sample accuracy and support for ramped automation data, allowing completely accurate and rapid parameter automation changes.","breadcrumbs":"Main benefits of VST 3 » 3. Sample-accurate Automation","id":"22","title":"3. Sample-accurate Automation"},"220":{"body":"This tutorial explains how to use cmake with VST 3 SDK .","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Goal","id":"220","title":"Goal"},"221":{"body":"The SDK provides a set of cmake files allowing you to compile the included samples and to develop new plug-ins. Download cmake from: https://cmake.org or use a package manager for your OS (See How to set up my system for VST 3 ). You can use the command line or the cmake editor ( cmake-gui ).","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » CMake for building VST 3 plug-ins","id":"221","title":"CMake for building VST 3 plug-ins"},"222":{"body":"Example for building Microsoft Studio 17 2022 solution: // go in to the folder where you extracted the VST 3 SDK\nmkdir build\ncd build\ncmake.exe -G \"Visual Studio 17 2022\" -A x64 \"..\\vst3sdk\"\n// or without symbolic links\ncmake.exe -G \"Visual Studio 17 2022\" -A x64 \"..\\vst3sdk\" -DSMTG_CREATE_PLUGIN_LINK=0 // or with symbolic links but using the user location (enable by default), it does not request admin right\ncmake.exe -G \"Visual Studio 17 2022\" -A x64 \"..\\vst3sdk\" -DSMTG_PLUGIN_TARGET_USER_PROGRAM_FILES_COMMON=1 // note: you can find the string definition for different Visual Studio Generators in the cmake online documentation","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Command line for Windows","id":"222","title":"Command line for Windows"},"223":{"body":"Example for building Xcode project: // go in to the folder where you extracted the VST 3 SDK\nmkdir build\ncd build\n/Applications/CMake.app/Content/bin/cmake -G\"Xcode\" \"../vst3sdk\"","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Command line for macOS","id":"223","title":"Command line for macOS"},"224":{"body":"You can use QtCreator 2.3.1 (or higher) start QtCreator 2.3.2 open the CMakeLists.txt located at the top of the VST3_SDK folder click on the menu Build->Run CMake","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » On Linux with QtCreator","id":"224","title":"On Linux with QtCreator"},"225":{"body":"start the CMake (cmake-gui) application set Where is the source code to the location of the VST3_SDK folder set Where to build the binaries to a build folder of yourchoice click on Configure click on Generate for creating project/solution tutorials_3 Example of cmakegui application on Windows Compile with cmake command line cd build\ncmake --build Choose a specific compiler with cmake (command line on Linux) cmake -DCMAKE_C_COMPILER=/usr/bin/clang-DCMAKE_CXX_COMPILER=/usr/bin/clang++ // or cmake -DCMAKE_C_COMPILER=/usr/bin/gcc-DCMAKE_CXX_COMPILER=/usr/bin/g++","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Use of cmake-gui","id":"225","title":"Use of cmake-gui"},"226":{"body":"SMTG_AAX_SDK_PATH : Here, you can define where the AAX SDK is located (if needed) SMTG_ENABLE_VST3_HOSTING_EXAMPLES : Enable VST 3 Hosting Examples (default ON) SMTG_ENABLE_VST3_PLUGIN_EXAMPLES : Enable VST 3 Plug-in Examples (default ON) SMTG_ENABLE_VSTGUI_SUPPORT : Enable VSTGUI Support (default ON) SMTG_BUILD_UNIVERSAL_BINARY : Build universal binary (32 & 64 bit) (Mac only) SMTG_COREAUDIO_SDK_PATH : Here, you can define where the COREAUDIO SDK is located (Mac only, if needed) SMTG_CREATE_BUNDLE_FOR_WINDOWS : Create bundle on Windows for the VST 3 plug-ins (new since 3.6.10! Windows only) (default ON) SMTG_CREATE_MODULE_INFO : Create the moduleinfo.json file (default ON) SMTG_CREATE_PLUGIN_LINK : Create symbolic link for each VST 3 plug-in in ${VST3_FOLDER_NAME} folder (you need to have Administrator rights on Windows or change the Local Group Policy to allow the creation of symbolic links) (default ON) SMTG_CUSTOM_BINARY_LOCATION : Customize output location for binaries SMTG_CXX_STANDARD : C++ standard version used for plugins: 14, 17, 20 SMTG_ENABLE_ADDRESS_SANITIZER : Enable Address Sanitizer SMTG_ENABLE_TARGET_VARS_LOG : Enables to log target variables for debugging (new since 3.6.11!) (default OFF) SMTG_ENABLE_USE_OF_JACK : Allows you to create the audiohost application using Jack (default OFF) SMTG_MDA_VST3_VST2_COMPATIBLE : Build the MDA examples as a replacement for their VST 2 counterpart (default ON) SMTG_IOS_DEVELOPMENT_TEAM : Needed for building the InterAppAudio and AUv3 examples for iOS (Mac only) SMTG_MYPLUGINS_SRC_PATH : Here, you can add your VST 3 plug-ins folder SMTG_PLUGIN_TARGET_PATH : Here, you can redefine the VST 3 plug-ins folder SMTG_PLUGIN_TARGET_USER_PROGRAM_FILES_COMMON : use FOLDERID_UserProgramFilesCommon as VST 3 target path (Windows only) (default ON) SMTG_RENAME_ASSERT : Rename ASSERT to SMTG_ASSERT to avoid conflicts with 3rd party libraries (default ON) SMTG_RUN_VST_VALIDATOR : Run the VST validator on VST 3 plug-ins each time they are built (default ON) SMTG_USE_STATIC_CRT : Use static CRuntime on Windows (option /MT) (default OFF: /MD is used) (Windows only)","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Available SMTG cmake options","id":"226","title":"Available SMTG cmake options"},"227":{"body":"Solution/project (vstsdk.sln/vstsdk.xcodeproj) is generated in the \"build\" folder. The created plug-ins are located in the \"build\" folder, in sub-folders /VST3/Release or /VST3/Debug . In order to allow a DAW to find these plug-ins you have to create links from the official VST 3 Locations to them.","breadcrumbs":"Tutorials » Using cmake for building VST 3 plug-ins » Using your IDE for compiling the examples","id":"227","title":"Using your IDE for compiling the examples"},"228":{"body":"/ VST Home / Tutorials On this page: Goal Part 1: Getting and installing the VST 3 SDK Part 2: Using the VST 3 plug-in Project Generator application","breadcrumbs":"Tutorials » Generate a new plug-in with the Project Generator App » Generate a new plug-in with the Project Generator App","id":"228","title":"Generate a new plug-in with the Project Generator App"},"229":{"body":"This tutorial explains how to create a new audio plug-in by using the VST 3 Project Generator included in the VST 3 SDK and how to add some basic features. The artifact will be an audio plug-in that can compute a gain to an audio signal and can be loaded into VST 3 hosts like Cubase , WaveLab , ...","breadcrumbs":"Tutorials » Generate a new plug-in with the Project Generator App » Goal","id":"229","title":"Goal"},"23":{"body":"The VST 3 plug-in parameters are displayed in a tree structure. Parameters are grouped into sections which represent the structure of the plug-in. Plug-ins can communicate their internal structure for the purpose of overview, but also for some associated functionality (e.g. program lists). Parameters like “Cutoff” and “Resonance” could be grouped into a section called “Filter” . This makes searching for a certain parameters easier, such as on an automation track. This also allows for assigning a group of parameters to a specific MIDI Channel input and audio output bus.","breadcrumbs":"Main benefits of VST 3 » 4. Logical Parameter Organization","id":"23","title":"4. Logical Parameter Organization"},"230":{"body":"For downloading the SDK, see the section \" How to set up my system for VST 3 \". You have the following possibilities to start a new project: You can use the helloworld template . Or, which is easier and recommended , you can use the VST 3 Project Generator application included in the VST 3 SDK . The following steps show how to use it.","breadcrumbs":"Tutorials » Generate a new plug-in with the Project Generator App » Part 1: Getting and installing the VST 3 SDK","id":"230","title":"Part 1: Getting and installing the VST 3 SDK"},"231":{"body":"The VST3 Project Generator application included in the VST 3 SDK is available for Windows and for macOS. Start the application located in the VST3_Project_Generator folder of the VST 3 SDK . Check that the Preferences tab has the required information: see Setting the Preferences . In the Create Plug-in Project tab you have to enter information about the plug-in that you want create: tutorials_4 Check the Create Plug-in Project tab of the VST 3 Project Generator dialog for more detailed documentation. Once you have entered all information, click Create . A script is started which creates a project with updated files in the Output directory. After this step, the IDE ( Visual Studio or XCode ) is launched. Compile the project and test your new plug-in. The plug-in is created in the Output Directory , in order to make it visible to a VST 3 host you may have to copy or symbolic-link it to the official VST 3 Locations / Format . For example, if you chose Audio Effect as Type, a simple Stereo→Stereo plug-in is created. A good way to understand how a VST 3 plug-in works is to add breakpoints in each function in the processor and controller files: tresult PLUGIN_API MyPluginController::initialize (FUnknown*context);\ntresult PLUGIN_API MyPluginController::terminate ();\n//...\ntresult PLUGIN_API MyPluginProcessor::initialize (FUnknown*context);\n//... and start a VST 3 host from the debugger. That´s it, now you could start to code, see next tutorial Code your first plug-in .","breadcrumbs":"Tutorials » Generate a new plug-in with the Project Generator App » Part 2: Using the VST 3 plug-in Project Generator application","id":"231","title":"Part 2: Using the VST 3 plug-in Project Generator application"},"232":{"body":"/ VST Home / Tutorials On this page: Goal Part 1: Coding your plug-in Add a parameter: Gain Add the process applying the gain Add store/restore state Part 2: Advanced Steps Add an Event Input Add a mono audio Side-chain","breadcrumbs":"Tutorials » Code your first plug-in » Code your first Plug-in","id":"232","title":"Code your first Plug-in"},"233":{"body":"Following the previous tutorial Generate a new plug-in with the Project Generator App , this tutorial explains how to code an audio plug-in and how to add some basic features. The artifact will be an audio plug-in that can compute a gain to an audio signal and can be loaded into VST 3 hosts like Cubase , WaveLab , ...","breadcrumbs":"Tutorials » Code your first plug-in » Goal","id":"233","title":"Goal"},"234":{"body":"Now you have an automatically generated frame for your plug-in. The following sections explain how to add a new parameter, its associated processing algorithm, and other specific features like saving/loading project or presets, creating a dedicated user interface, etc. A VST 3 plug-in contains two main classes: its PlugProcessor (performing the processing and persistence) and its PlugController (taking care of communication with the DAW, handling parameters and the UI).","breadcrumbs":"Tutorials » Code your first plug-in » Part 1: Coding your plug-in","id":"234","title":"Part 1: Coding your plug-in"},"235":{"body":"In this basic plug-in example, we will add a Gain parameter which modifies the volume of the audio going through the plug-in. For this, each VST 3 parameter requires a unique identifier (a number). Open the file plugids.h and enter a new id kParamGainId . In this example, assign the unique number 102 for example. plugids.h #include \"pluginterfaces/vst/vsttypes.h\" enum GainParams : Steinberg::Vst::ParamID\n{ kParamGainId = 102, // should be a unique id...\n}; Open the plugcontroller.cpp file, and add the gain parameter with the parameters.addParameter plugcontroller.cpp // Include the file where some ids are defined\n#include \"plugids.h\" //----------------------------------------------------------------------------\ntresult PLUGIN_API PlugController::initialize (FUnknown*context)\n{ tresult result = EditController::initialize (context); if (result != kResultOk) { return result; } //---Create Parameters------------ parameters.addParameter (STR16 (\"Gain\"), STR16 (\"dB\"), 0, .5, Vst::ParameterInfo::kCanAutomate, GainParams::kParamGainId, 0); return kResultTrue;\n} ⓘ Note \\ We add the flag kCanAutomate which informs the DAW/host that this parameter can be automated. A VST 3 parameter is always normalized (its value is a floating point value between [0.0, 1.0] ), here its default value is set to 0.5 . Now adapt the processor part for this new parameter. Open the file plugprocessor.h and add a gain value Vst::ParamValue mGain . This value is used for the processing to apply the gain. plugprocessor.h // ... static FUnknown* createInstance (void*)\n{ return (Steinberg::Vst::IAudioProcessor*)new PlugProcessor ();\n}\nprotected: Steinberg::Vst::ParamValue mGain = 1.;\n// ...","breadcrumbs":"Tutorials » Code your first plug-in » Add a parameter: Gain","id":"235","title":"Add a parameter: Gain"},"236":{"body":"We need to set our internal mGain with its required value from the host. This is the first step of the process method. Parse the parameter change coming from the host in the structure data.inputParameterChanges for the current audio block to process. ⓘ Be sure to add #include \"public.sdk/source/vst/vstaudioprocessoralgo.h at top of the file plugprocessor.cpp ! This includes some helpers to access audio buffer. plugprocessor.cpp #include \"pluginterfaces/vst/ivstparameterchanges.h\"\n#include \"public.sdk/source/vst/vstaudioprocessoralgo.h\" //----------------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::process (Vst::ProcessData&data)\n{ //--- First: Read inputs parameter changes----------- if (data.inputParameterChanges) { // for each parameter defined by its ID int32 numParamsChanged = data.inputParameterChanges->getParameterCount (); for (int32 index = 0; index < numParamsChanged; index++) { // for this parameter we could iterate the list of value changes (could 1 per audio block or more!) // in this example, we get only the last value (getPointCount - 1) Vst::IParamValueQueue* paramQueue = data.inputParameterChanges->getParameterData (index); if (paramQueue) { Vst::ParamValue value; int32 sampleOffset; int32 numPoints = paramQueue->getPointCount (); switch (paramQueue->getParameterId ()) { case GainParams::kParamGainId: if (paramQueue->getPoint (numPoints - 1, sampleOffset, value) == kResultTrue) mGain = value; break; } } } } // ....\n} ⓘ Note data.inputParameterChanges can include more than 1 change for the same parameter inside a processing audio block. Here we take only the last change in the list and apply it our mGain . The real processing part: plugprocessor.cpp // ... //-- Flush case: we only need to update parameter, noprocessing possible\nif (data.numInputs == 0 || data.numSamples == 0) return kResultOk; //--- Here, you have to implement your processing\nint32 numChannels = data.inputs[0].numChannels; //---get audio buffers using helper-functions(vstaudioprocessoralgo.h)-------------\nuint32 sampleFramesSize = getSampleFramesSizeInBytes(processSetup, data.numSamples);\nvoid** in = getChannelBuffersPointer (processSetup, data.inputs[0]);\nvoid** out = getChannelBuffersPointer (processSetup, data.outputs[0]); // Here could check the silent flags\n// now we will produce the output\n// mark our outputs has not silent\ndata.outputs[0].silenceFlags = 0; float gain = mGain;\n// for each channel (left and right)\nfor (int32 i = 0; i < numChannels; i++)\n{ int32 samples = data.numSamples; Vst::Sample32* ptrIn = (Vst::Sample32*)in[i]; Vst::Sample32* ptrOut = (Vst::Sample32*)out[i]; Vst::Sample32 tmp; // for each sample in this channel while (--samples >= 0) { // apply gain tmp = (*ptrIn++) * gain; (*ptrOut++) = tmp; }\n}\n//... VST 3 includes a way for the host to inform the plug-in that its inputs are silent (using the VST 3 silence flags ): plugprocessor.cpp // Here could check the silent flags\n//---check if silence---------------\n// normally we have to check each channel (simplification)\nif (data.inputs[0].silenceFlags != 0)\n{ // mark output silence too data.outputs[0].silenceFlags = data.inputs[0].silenceFlags; // the plug-in has to be sure that if it sets the flags silence that the output buffer are clear for (int32 i = 0; i < numChannels; i++) { // do not need to be cleared if the buffers are the same (in this case input buffer are // already cleared by the host) if (in[i] != out[i]) { memset (out[i], 0, sampleFramesSize); } } // nothing to do at this point return kResultOk;\n}","breadcrumbs":"Tutorials » Code your first plug-in » Add the process applying the gain","id":"236","title":"Add the process applying the gain"},"237":{"body":"The Processor part represents the state of the plug-in, so it is its job to implement the getState / setState method used by the host to save/load projects and presets. The Controller part gets the Processor state too in its setComponentState method which allows to synchronize its parameters too (used for example by the UI). In the file plugprocessor.cpp , add the mGain value to the state stream given by the host in the getState method which will save it as a project or preset. The helper class IBStreamer could be used for handling the IBStream given by the host. plugprocessor.cpp // add this include at the top of the file\n#include \"base/source/fstreamer.h\" //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::getState (IBStream* state)\n{ // here we need to save the model (preset or project) float toSaveParam1 = mGain; IBStreamer streamer (state, kLittleEndian); streamer.writeFloat (toSaveParam1); return kResultOk;\n} In the setState method, the plug-in receives a new state from the host, it is called after a project or preset is loaded. plugprocessor.cpp //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::setState (IBStream* state)\n{ if (!state) return kResultFalse; // called when we load a preset or project, the model has to be reloaded IBStreamer streamer (state, kLittleEndian); float savedParam1 = 0.f; if (streamer.readFloat (savedParam1) == false) return kResultFalse; mGain = savedParam1; return kResultOk;\n} In the setComponentState method, the Controller part of the plug-in receives the same state than the one used in PlugProcessor::setState . PlugController::setComponentState is called just after PlugProcessor::setState . plugcontroller.cpp // add this include at the top of the file\n#include \"base/source/fstreamer.h\" //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugController::setComponentState (IBStream* state)\n{ // Here, you get the state of the component (Processor part) if (!state) return kResultFalse; IBStreamer streamer (state, kLittleEndian); float savedParam1 = 0.f; if (streamer.readFloat (savedParam1) == false) return kResultFalse; // sync with our parameter if (auto param = parameters.getParameter (GainParams::kParamGainId)) param->setNormalized (savedParam1); return kResultOk;\n}","breadcrumbs":"Tutorials » Code your first plug-in » Add store/restore state","id":"237","title":"Add store/restore state"},"238":{"body":"","breadcrumbs":"Tutorials » Code your first plug-in » Part 2: Advanced Steps","id":"238","title":"Part 2: Advanced Steps"},"239":{"body":"In our example we want to modify our current Gain factor with the velocity of a played \"MIDI\" event (noteOn). If you need in your plug-in to receive not only audio but events (like MIDI), you have to add an Event input. For this you just have to add the Event input with addEventInput in the initialize method of the processor: plugprocessor.cpp //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::initialize (FUnknown* context)\n{ //---always initialize the parent------- tresult result = AudioEffect::initialize (context); // if everything Ok, continue if (result != kResultOk) { return result; } //.... //---create Event In/Out busses (1 bus with only 1 channel)------ addEventInput (STR16 (\"Event In\"), 1); return kResultOk;\n} ⓘ Note In this example, we add 1 input event bus, receiving only on 1 channel. If you need to receive differentiated events, for example, from different channels, just change it in the following way: addEventInput (STR16 (\"Event In\"), 4); // here 4 channels We create a new internal value mGainReduction (not exported to the host) which is changed by the velocity of a played noteOn , so that the harder you hit the note, the higher is the gain reduction (this is what we want here in this plug-in): plugprocessor.h // ... static FUnknown* createInstance (void*)\n{ return (Steinberg::Vst::IAudioProcessor*)new PlugProcessor ();\n}\nprotected: Steinberg::Vst::ParamValue mGain= 1.; Steinberg::Vst::ParamValue mGainReduction = 0.;\n// ... Now we have to receive the event changes in the process method: plugprocessor.cpp //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::process (ProcessData& data)\n{ //--- First: Read inputs parameter changes----------- //... //---Second: Read input events------------- // get the list of all event changes Vst::IEventList* eventList = data.inputEvents; if (eventList) { int32 numEvent = eventList->getEventCount (); for (int32 i = 0; i < numEvent; i++) { Vst::Event event; if (eventList->getEvent (i, event) == kResultOk) { // here we do not take care of the channel info of the event switch (event.type) { //---------------------- case Vst::Event::kNoteOnEvent: // use the velocity as gain modifier: a velocity max (1) will lead to silent audio mGainReduction = event.noteOn.velocity; // value between 0 and 1 break; //---------------------- case Vst::Event::kNoteOffEvent: // noteOff reset the gain modifier mGainReduction = 0.f; break; } } } } Make use of this mGainReduction in our real processing part: plugprocessor.cpp //----------------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::process (Vst::ProcessData&data)\n{ //.... float gain = mGain - mGainReduction; if (gain < 0.f) // gain should always positive or zero gain = 0.f; // for each channel (left and right) for (int32 i = 0; i < numChannels; i++) { int32 samples = data.numSamples; Vst::Sample32* ptrIn = (Vst::Sample32*)in[i]; Vst::Sample32* ptrOut = (Vst::Sample32*)out[i]; Vst::Sample32 tmp; // for each sample in this channel while (--samples >= 0) { // apply gain tmp = (*ptrIn++) * gain; (*ptrOut++) = tmp; } } //...\n}","breadcrumbs":"Tutorials » Code your first plug-in » Add an Event Input","id":"239","title":"Add an Event Input"},"24":{"body":"VST 3 introduces a new approach to plug-in GUIs through window resizing, allowing for extremely flexible use of valuable screen space.","breadcrumbs":"Main benefits of VST 3 » 5. Resizeable UI Editor","id":"24","title":"5. Resizeable UI Editor"},"240":{"body":"In our example we want to modulate our main audio input with a Side-chain audio input. First, add a new side-chain audio input (busType: kAux ) in the initialize call of our processor: plugprocessor.cpp //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::initialize (FUnknown*context)\n{ //---always initialize the parent------- tresult result = AudioEffect::initialize (context); // if everything Ok, continue if (result != kResultOk) { return result; } //.... //---create Event In/Out busses (1 bus with only 1 channel)------ addEventInput (STR16 (\"Event In\"), 1); // create a Mono SideChain input bus addAudioInput (STR16 (\"Mono Aux In\"), Steinberg::Vst::SpeakerArr::kMono, Steinberg::Vst::kAux, 0); return kResultOk;\n} We want to be sure that our side-chain is handled as mono input. For this we need to overwrite the AudioEffect::setBusArrangements function: plugprocessor.h //-----------------------------------------------------------------------\nclass PlugProcessor: public AudioEffect\n{\npublic: PlugProcessor (); //... // overwrite this function Steinberg::tresult PLUGIN_API setBusArrangements (Steinberg::Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, Steinberg::Vst::SpeakerArrangement* outputs, Steinberg::int32 numOuts) SMTG_OVERRIDE; //...\n}; plugprocessor.cpp //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::setBusArrangements(Vst::SpeakerArrangement* inputs, int32 numIns, Vst::SpeakerArrangement* outputs, int32 numOuts)\n{ // the first input is the Main Input and the second is the SideChain Input // be sure that we have 2 inputs and 1 output if (numIns == 2 && numOuts == 1) { // we support only when Main input has the same number of channel than the output if (Vst::SpeakerArr::getChannelCount (inputs[0]) != Vst::SpeakerArr::getChannelCount (outputs[0])) return kResultFalse; // we are agree with all arrangement for Main Input and output // then apply them getAudioInput (0)->setArrangement (inputs[0]); getAudioOutput (0)->setArrangement (outputs[0]); // Now check if sidechain is mono (we support in our example only mono Side-chain) if (Vst::SpeakerArr::getChannelCount (inputs[1]) != 1) return kResultFalse; // OK the Side-chain is mono, we accept this by returning kResultTrue return kResultTrue; } // we do not accept what the host wants: return kResultFalse ! return kResultFalse;\n} Adapt our process using the side-chain input as modulation: //-----------------------------------------------------------------------\ntresult PLUGIN_API PlugProcessor::process (ProcessData& data)\n{ //--- First: Read inputs parameter changes----------- //... //---Second: Read input events------------- //... float gain = mGain - mGainReduction; if (gain < 0.f) // gain should always positive or zero gain = 0.f; void** auxIn = nullptr; // Check if the Side-chain input is activated bool auxActive = false; if (getAudioInput (1)->isActive ()) { auxIn = getChannelBuffersPointer (processSetup, data.inputs[1]); auxActive = true; } if (auxActive) { // for each channel (left and right) for (int32 i = 0; i < numChannels; i++) { int32 samples = data.numSamples; Vst::Sample32* ptrIn = (Vst::Sample32*)in[i]; Vst::Sample32* ptrOut = (Vst::Sample32*)out[i]; // Side-chain is mono, so take auxIn[0]: index 0 Vst::Sample32* ptrAux = (Vst::Sample32*)auxIn[0]; Vst::Sample32 tmp; // for each sample in this channel while (--samples >= 0) { // apply modulation and gain tmp = (*ptrIn++) * (*ptrAux++) * gain; (*ptrOut++) = tmp; } } } else { // for each channel (left and right) for (int32 i = 0; i < numChannels; i++) { int32 samples = data.numSamples; Vst::Sample32* ptrIn = (Vst::Sample32*)in[i]; Vst::Sample32* ptrOut = (Vst::Sample32*)out[i]; Vst::Sample32 tmp; // for each sample in this channel while (--samples >= 0) { // apply gain tmp = (*ptrIn++) * gain; (*ptrOut++) = tmp; } } } That´s it!","breadcrumbs":"Tutorials » Code your first plug-in » Add a mono audio Side-chain","id":"240","title":"Add a mono audio Side-chain"},"241":{"body":"/ VST Home / Tutorials On this page: Goal Part 1: Preparation Part 2: Open the VSTGUI/WYSWYG editor Part 3: Parameter Binding Part 4: Creating Custom Views Part 5: Showcase","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Use VSTGUI to design a User Interface","id":"241","title":"Use VSTGUI to design a User Interface"},"242":{"body":"This tutorial explains how to use VSTGUI . VSTGUI comes with a WYSIWYG editor that allows you to create stunning user interfaces for your plug-in.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Goal","id":"242","title":"Goal"},"243":{"body":"If you have created your project with the VST 3 Project Generator and check the \" Use VSTGUI \" you can directly jump to Part 2 of this tutorial. Before using the inline UI editor, you must make sure that you use the Steinberg::Vst::EditController class as a base of your own edit controller and that you have used the Steinberg::Vst::Parameter class or any subclass of it for your parameters. Otherwise the inline UI editor won't work properly. Next you have to add vstgui to your project. For cmake users, you can just add the vstgui_support library to your target: target_link_libraries(${target} PRIVATE vstgui_support) If you are not using cmake, you have to manually include the following source files to your project: vstgui/vstgui_[ios/mac/linux/win32].[cpp/mm] vstgui/vstgui_uidescription.cpp vstgui/plugin-bindings/vst3editor.cpp After that you have to alter your project settings to add a preprocessor definition to your debug build: VSTGUI_LIVE_EDITING=1 With cmake , this would look like this: target_compile_definitions(${target} PUBLIC$<$:VSTGUI_LIVE_EDITING=1>) Finally, you have to modify your edit controller class to overwrite the createView() method: #include \"vstgui/plugin-bindings/vst3editor.h\" IPlugView* PLUGIN_API MyEditController::createView (FIDStringname)\n{ if (strcmp (name, ViewType::kEditor) == 0) { return new VSTGUI::VST3Editor (this, \"view\", \"myEditor.uidesc\"); } return 0;\n} Also make sure to include the vst3editor.h header. Now you can build your plug-in and start your preferred VST 3 host to start designing your user interface.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Part 1: Preparation","id":"243","title":"Part 1: Preparation"},"244":{"body":"If you now open your plug-in UI in your host, you will see a blank editor. To enter the UI editor, right-click on it and choose \" Open UIDescription Editor \". After your first edits, you have to add the uidesc file you have saved to your project (already done if you have used VST 3 Project Generator ). You also have to make sure to always build your project after changes to the uidesc file.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Part 2: Open the VSTGUI/WYSWYG editor","id":"244","title":"Part 2: Open the VSTGUI/WYSWYG editor"},"245":{"body":"If you've used the Parameter class provided by the VST 3 SDK , you get automatic parameter bindings between the controls of your editor and the parameters in your VST Edit Controller. The only thing you need to do is to declare the IDs of the parameters as tags in the Tags editor (or use the 'Sync Parameter Tags' command in the Edit menu of the toolbar) and set the tags of your controls to these IDs. Your VST Edit Controller now receives the beginEdit(...)/performEdit(...)/endEdit(...) calls when the user changes the controls. If the host automates the parameter, the control also reflects these changes. Additionally, you can modify your VST Edit Controller to return specific parameter objects in the getParameterObject(int32 paramID) method for UI only needs, which are not parameters of your VST audio processor. This way you can store view settings (like the tab which is open when the user closes the editor so that it can be restored when the user opens the editor again). You can look at the sources of the included 'uidescription test' project for more information on how this works.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Part 3: Parameter Binding","id":"245","title":"Part 3: Parameter Binding"},"246":{"body":"If you need to create custom views, you can implement the VSTGUI::VST3EditorDelegate interface in your edit controller class. The createCustomView method is called if you set the 'custom-view-name' attribute in one of the views. Another way to use your own views is to register them at runtime with the UIViewFactory. This method requires more work but has the advantage that the view is listed like the built-in views and changing attributes works on the fly. See VSTGUI::IViewCreator.","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Part 4: Creating Custom Views","id":"246","title":"Part 4: Creating Custom Views"},"247":{"body":"Here's an example video recorded while creating the new user interface for the famous Grungelizer plug-in of Cubase after it was ported from VST 2.4 to VST 3 . tutorials_5 Create the VST 3 Grungelizer UI in 15 minutes with the UIDescriptionEditor of VSTGUI tutorial_vid_1","breadcrumbs":"Tutorials » Use VSTGUI to design a User Interface » Part 5: Showcase","id":"247","title":"Part 5: Showcase"},"248":{"body":"/ VST Home / Tutorials On this page: Tutorial - How to use the Data Exchange API Sending data from the audio processor Receiving data in the edit controller Related pages: Data Exchange You'll find the source for this tutorial in the tutorial repository","breadcrumbs":"Tutorials » Data Exchange » Data Exchange Tutorial - How to send data from the realtime process to the edit controller","id":"248","title":"Data Exchange Tutorial - How to send data from the realtime process to the edit controller"},"249":{"body":"In this tutorial, you learn how to use the Data Exchange API to send data from the realtime audio process method to the edit controller of your plug-in.","breadcrumbs":"Tutorials » Data Exchange » Tutorial - How to use the Data Exchange API","id":"249","title":"Tutorial - How to use the Data Exchange API"},"25":{"body":"The host can ask the plug-in which parameter is under the mouse.","breadcrumbs":"Main benefits of VST 3 » 6. Mouse Over Support","id":"25","title":"6. Mouse Over Support"},"250":{"body":"Let's send data from the processor to the controller. First, we need to add the required include so that we can use the wrapper class. Add the following include before you define your audio processor: #include \"public.sdk/source/vst/utility/dataexchange.h\" To prepare the AudioEffect class, you need to overwrite the following methods: tresult PLUGIN_API initialize (FUnknown* context) override;\ntresult PLUGIN_API connect (Vst::IConnectionPoint* other) override;\ntresult PLUGIN_API disconnect (Vst::IConnectionPoint* other) override;\ntresult PLUGIN_API setActive (TBool state) override;\ntresult PLUGIN_API canProcessSampleSize (int32 symbolicSampleSize) override;\ntresult PLUGIN_API process (Vst::ProcessData& data) override; And we also have to add the wrapper class as a member of our audio processor class: std::unique_ptr dataExchange; Now we can initialize and configure the dataExchange. We do this in: tresult PLUGIN_API DataExchangeProcessor::connect (Vst::IConnectionPoint* other)\n{ auto result = Vst::AudioEffect::connect (other); if (result == kResultTrue) { auto configCallback = [this] (Vst::DataExchangeHandler::Config& config, const Vst::ProcessSetup& setup) { Vst::SpeakerArrangement arr; getBusArrangement (Vst::BusDirections::kInput, 0, arr); numChannels = static_cast (Vst::SpeakerArr::getChannelCount (arr)); auto sampleSize = sizeof (float); config.blockSize = setup.sampleRate * numChannels * sampleSize + sizeof (DataBlock); config.numBlocks = 2; config.alignment = 32; config.userContextID = 0; return true; }; dataExchange = std::make_unique (this, configCallback); dataExchange->onConnect (other, getHostContext ()); } return result;\n} The configration is done via the configCallback. In this example, we configure the queue to have a block size to store exactly 1 second of audio data of all the channels of the configured speaker arrangement of the input bus. We choose two for numBlocks because we send one block per second, and in this case, two blocks should be enough. If the frequency you need to send the block is higher, you need to increase this value to prevent data drop outs. The configCallback is called when the audio processor is activated. The next thing we have to do is to call the dataExchange object when the edit controller is disconnected and release the memory: tresult PLUGIN_API DataExchangeProcessor::disconnect (Vst::IConnectionPoint* other)\n{ if (dataExchange) { dataExchange->onDisconnect (other); dataExchange.reset (); } return AudioEffect::disconnect (other);\n} And we also have to call the dataExchange object when the processor's state changes: tresult PLUGIN_API DataExchangeProcessor::setActive (TBool state)\n{ if (state) dataExchange->onActivate (processSetup); else dataExchange->onDeactivate (); return AudioEffect::setActive (state);\n} Now we prepare the data that we want to send to the controller. To make this a little bit easier, we define a struct that specifies what should look like and move this into its own header \"dataexchange.h\": // dataexchange.h #pragma once #include \"public.sdk/source/vst/utility/dataexchange.h\"\n#include