From 5ee050e0c4fe32fd52370b3180ba184d95618762 Mon Sep 17 00:00:00 2001 From: coreydunn Date: Sat, 15 Jul 2023 11:31:36 -0500 Subject: [PATCH] fix duty cycle offset --- TODO | 1 + data/bg.png | Bin 14317 -> 15132 bytes knob.h | 53 ++++++++++++++++++++++------------------------------ main.c | 51 +++++++++++++++++++++++++++----------------------- synth.c | 4 ++-- 5 files changed, 53 insertions(+), 56 deletions(-) diff --git a/TODO b/TODO index c330c2b..d376fb0 100644 --- a/TODO +++ b/TODO @@ -2,3 +2,4 @@ LFO Pitch envelope Filter envelope Polyphony +Sequencer diff --git a/data/bg.png b/data/bg.png index b1a73ef06304b3d3e22f0ef7228a446e378fcb6f..f4f2bb27a9075f5be1f032e9c3075448aed54c83 100644 GIT binary patch delta 9230 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 delta 8485 zcmaKR2UL?;w{{Q(N18JtMVbXfklqrcsf-}f6vRjeg&@7xKwcaKMnFJ9F;tZ%9qBzF zB2uHYPy^CJO{k%Skoz*<|9$JfcddJ~)>%nbPR_gcIeS0*dG<;7TX&BaW>|kKA_PpZ zwac76+T#>pV3ZBuCyMxn#ZK$SB;^_9Ud8ywhUKj9P7cnU_cOSKNijQjr^;!8sk5Lb zcttO0#rWaucfywARJ;Atmq}Ki_-**MHoU(oM$G@z2#rAVH7$!*aUC3FW--Ro_-^pr zC!rnRaGbgi<8h2jv3XoL5mFsan#IG7Wu=U}@_uyNJrNIfFltxBhkbgAHNAw^diFIt zsqHni>+X-M;83!| zbehq3gHGIMMDsHU0Q?=+#<@n~XVx!wT+#Hch>n7dh;x3p`{|;YuT1?8OKO#{m{jav z&TVaR9fe`hm8I;Ze_h^Zm|dC8S-L86EG<^`_vTEU5SgS#A~4)7>Q<g3d#Bn)t`!jdL-grX`QOmL9h6FL z5kqFr-s}s9r9^;BZFe4xG9<;B;*ud*hCV%Fd5 zi@gZ5#U^~k-iF6t9^SDwUA)!zD5v~yk^ARAynlJFu>5?!iD<{45frrG@u#_z@44|s zr?g_v486bOcQgZRGy>+8FvaET;R(0t(XK!Y!%NHeQ&sEa=M!#OkYk6L2joL%NgE1! z2LX>3VEE-aGuu!khHPD6m)Uxp!Z!ByNFn^$?*SUw?%j;-wYNR`)=Mhm2AMDGTIRZk zhH2U~{W-QONETdLU!RuGI7UHCg}u@fuePN@AionGA3ybZs$W@i>eZ=hipur~#PjDe zl1efNsHB3e?Q=<6C8)fljGdCLoGeUMPEH1Gd8U9>Mn(ZD2a{8fmseIs|H0&WPUf+! z%q>OOEd?0*4U_Qy_qDQ-DfCRGAe+tE)3JQl63~BLlskKl-Viyu5q)_Lo2SWRylnZDRcALQ=wAbVt1C9_L{^6LQ~ewgb|$FRboS zm*Tf6)bED09V)Hmo=yWJq&1RJtL-d$gG&az!leX`QnU?B5FN_R^WWY#ZgHaDEAu75 z9)gm&}0x%Tz@;&}fEsk3eYY_a<@Bs{fX{*8u$-n+DIB1$zZ@{OLSjw9}6 zX@Bh6bhC1qD)n|vvBivg%;12Gty`*8gKU^H-*gRN-Pc$%pX4Can+#v)rm#@YI7mRW z75aM8S5ayr_Ot=d9LbWt#(}Y)Z|{2Q9J28zUh&PACm!O6W2BERAq)9=T4gcsVA7TD z`~G5Ll7^jcYxrFVN&WrT#Kfg^u?$HCr5gYIxGXg)y#_v@|0zVNul`DS!a&pEQMM^S z`M&49ra7L3K@I22k-pp<^!fRQE8Qwhff&IVrCV`$pk2B489+^-^cz=_W3o{8*Kzgz zC|hi~wMX8maFh$?Ct_Mi!^Uq$HuTK_zuL5}?Nh71oU>_JSKC z2T@TO9|UZ6f8${1d7M<*f9<+fnXg}!!|jgOd(JcOov7ioFQ_&QYwJjeiZQf7>;hsc zcvADZbkmjUH~NmQgy+w8##j4P7LERJ zI6X}dyCRQKAdd69O=b0$_H%Ma8LQiPFg<>fuQFwdJrcW+jUQ>*nCq?cLLn?RF?yLH zuI$zP_Z^6DIk{8vrdzwAd(Itq+rNMtG^2NB<}jBd|I@>Coyszud&A{BWvY~4q%cWp zh2Qdpz}+#VevB1hj@|jmd9hp0b5T0yW1$iaAmPO#%_#Qk(V*|)w7=vph3Zt04wx&! zVXW9BR!vmQZ7Nn3aE+|=pEz8btQ*P+fX9xNy}e*;rgT|5mfxTf+zjyXU?6W5M#QKC zR!=0GRH(J33cLhk?LB8V@N4Hk2e@(PY%4JSS>Ai|4Hh$-Fi>n3;E&5lncV6aimShT zFZ`ndIat#0xTki2P|-EClmt$d-#f(7U9hC(dfKevvB65Gf&QaMSE&9j{c+^O3frF! z)ZIa${bSH>C})D*N{5i4DgEVGmD3}ffU#7gN+G;g4Hh9%lD{Efr?-9Z7pK1Syqd1QYXUR#daW^SKn1>Y* zI0~ET)(jL$dXes7+i*)|Ylk-doe?+?ssM=JSOwGxU<9^lYTJ=x!FfMw36o`>+Iy=Q zfYzhB-#6Xgl9487w+{pUeO5L)rr0VHu$|H0Q*_Dbk!1=avIap-?a)a8Kjaq&hra&l z4CW(&VsOY<6uHovDd|qa6H3Hx3cYyRv`P~%a{{AD8kPjn^Y=e@@17bowt1$4^IXSR zZTmKF0Edsi=#)DNKGKr1RclCZtU3i#X7{jf!=?IPOV&ezJ%6e3TF8r6U%SpvdrkCkwn8m3t3`G*Jx1V@ zhfRa&StqN_VuW%U{2n`L#gNC!l5m7+ZvcCoG}dgd&qdf){O9O483Eg;qtXHGM+e)D zXdls}sX4^-keVk6koHS~D;}-YWDALigvA|9M#dS_UIZJByS;wpL$D ziK}$R60+hFpvL7Q&RHsl#`;rr(MIZCM&s;)-LciUyzFdKv2CepyY+4NHGFR($0xms zw&b;^jbC2`koTPDb24dLG!RbQ@fSkb(9$}C_n>)&d4Oz(NUj?5EtS}uK%%qh@ft_P z_ApWJ1f`EZDp($EvZ@nM>*MJcS;#&8zW*;JKLm_dIa*KQA0;W{=|SR5_?)83Ymrvd zDeWc9UOBXfQPH|akJKdI%pr1e1KrL1kj^{?Q&o8*Y7RpVl4l z>ir;=f-@Xka~@RKJ9IHUNW>}z+0U-68d+E*RO@DaXNf!7ogigxeV&jDq*P-RsNY;n z>wmNca8rHL$<`;x>h8S*7IGAv99&#`P@!&cjo%4vFVh}vmG;gUrUOM zIWW1en~;)u6uCxdP!Ee3;^QKFVa-n9*+3Bz9j!ZvDqncT%u%hBUspE-=H2Yd4L#YsOe4e4HJdsehB( zek^+$)#;rwb(kdFVS2oy;XsZ6#e`T|@N${mmz|plv89vr6x~?lVs_RsuHaK)&o~iC zAC4x=D+J{N9~-W;YZ-KxzeO8qP>v)*j;LeJ$7jNR6`R~o_mhU0h#WZEWLjxDvAXIn{x`At13nwEUSjl@q-oa+FFJgDXXYC z04L|voy62$FAy5ZzTOvYcx>EFg(E1UZcsG?Q+VfF)q^RG-sE9vyZf|vz0?J1fxXF( z)ML0A#jS7VLp$3WW4ZE*>wS&2^TQ5gwM9xC>aeGNfyH0Yd!jIW8h31&CSP7SG6Qp+ zz)SRJ`=i8)xHQr$7%pN$rifmflGcFUW~*&PyJOy$J~t4kj(#nxsxx{jqp72ax}9cp=0udI$@YxfWPGO6ikiVp0c(eIM|V$`)BE3Q@T=?wzw9 z|M~|pbDt!%Fpi@;ezWp$WUsAhTJO-dr-_3kb?QA##L_ZDY!$lUTDwPv-q10EdLGI$ zjJmhJ_u*G|@kmc7{G~0lc0){(K4xV?nWRM6$I*?oVzS=Ka`*P^#D(0t_DvsmVVZWW zeQxb+>y$Zu0Vp7wKJAam7dm<(MVqH%wxwHSlQj7%mRji2I&$lUxZI%8PyC~m!|^Z? zkTT^L`q^n2Hecm?awM!Hx13~M(p&4JMjwCw+=n*| z{Qco0E&CTVXA@maD;3ZP+FhxmaGd=Y5O@r=ULh zpFZ7~vdl28>_vGxQP!TO2#ZOV-3KY*+Vrm3t;Sd$)>G#V@C3G=?HMSb!W}ZpQot*# z1c-<%II8(vUWH5aHi&TWp3k>CFl<3HB!$U8n+yl*@>LzLeH(8pivUBVvVg1hG$#AC zGbwpZ^wugNlp3E^&~-kmfYBM4h{nMLJwdpBCJIQ?sVwb_$|v_wObq#0iCPeK>WuZm zZn9e5ovZ-LOKkUtSEbbB(y zbUPi2TAWfYcR>2N1S`8z_bxFJ4Ipl2$8|bC9ITKBI-2is)ugF-#b_m-(;?61qT}qq z!E>6(ia*7KwpA8J%P4c8$DpD>6W={hT9K8QAffWBrH!PZ>Ej8I&E(2#&gYI=Cf@xJ zuZ`Wd2cD-_9BdQ!B=%dcWE)#T<*5E8J*$niJnZCURL1w5`dYi*#K6EMfFAn+6lASy zpdb_0i5Pja3%!$7AfO`8ZMAu`fL~5kXJBeL$ubSTfI%K>k55bh^29m%6{NpgZ|c20 zKCWh^KtjGj5aK><=`m|T&wOB3_uHEGu}W7b8!V&lnfgrAAL!40jY(G! zy%(NPj9L_A%m(0jR$Eg-opirzHN;yH8yHTBn$$T1dd)sTA{@2cLuR3aTX!Y zf^=$G>ZNA6PYqJYnvy<4(jiS)$8_P7MaU|*k;*f#1UuT+8H~azx7^}U^qI@eHP7d| zgdCTl9v&y`FZPXeeomFDNxPQ){QTJQ%WtU7U+k@b@n`4lBFBa$Ca|hTMMYHtL}#_E z+FFP~nJ&zcQ({Y^(X#a@MJj~ZnU&c7XL!`o-wRX~*=aZ%LYd$tD8V)HI3fYP* zoS0xo49^OI3sJhiG#cNK>Z^*QJqX1SVDh)>2vZL>A^(XVliq{bga>~ z-u9=nA+0BC_t2S(zT|FXv8Ze|Dy=@x5Fqa7Vu1m*rz|L{iyGz2N`j~`Si?qu3^*M%TiJ-zmr=0o0|Z4o-17mj6DnI)RwA{;XzR~d0Ub+ zVr?iea6eZ15)XxiaJH3OaFatiq_aA2S(irT==vI%^}V%wCFhgJq&!W$(Ad;63yepl z34B@aNneJa!ou)Qc)^5?H{^H{)U|O19^dLm6!KRGaKU0>P7zrHW3Rcb&?ln=a85z| z!X6d;0#U<**=BtdgF(`W#ui3FdJwClu4x_GXn~lxxE(#V?_imuC5e)(pZ5*fU!A9H zc~Nu4YiT!R>}UlHMSi;1UtrtkLHklcp#9Gm-G}gb4`*i_dUMakDp@Tpg_nyQgpKV)d5$pIG&G_~A2azn4GvzM3!epR z+W6=EMz$D&cZuVnS>HQeOi-7ok($fnDBbQLH}V=Rf!3&GfAANw5=moWIsgbv< zX0N*4C6nk|;~WkzXrsN2%aoxvX^u}J8pa92$l8*g4Nsx2h1w8B9l0D^A2Z7O_nKjx zu+D#!uH|;qYv89S7ZsE`+DSdD?shk&t|&wLxA_O+Ewo0 zwd8b-y~Ptz*$M%J@*?i&@^E#wk^HmZgdCcO^AmL>fct==-K<3Rq)MP>r1fH~PBvlS zed_OHjjozpN84Had&eNZ)&+yAz>VkmQ;0jj)_TG>Ub=@U&q+0@-s`v*=(_9OX+c@< z1oox}e*O}2Fo<*3A53|mOSPwGN{Xs_m)pBXym69~2(4wBc_e8{J)(8eJL|K@s@auY zOBMC4SJqw_Vi_)qsv4`mziOGG%^K~$9#AG1S*ZlET#av;KS{_iNu;sLGb5)?pue}& z*BywR{`>W|(F9Dnqz}m&JveK!m|n@SWER;v=0wwFk#{AC%99r-DrZ{U`7gYbm%>Ui zGI8iX`VjBi19oMCO57%Udz&}u_ZoYGwzLY=R+Sb|BeS~3dS-z*09&)l? zQ%dRaFf=P>+G911PYEWc2v)_qY}sz<0U1;t+#0GJBHwZPOh%y|J`cvsi3O z2^dlJ&jOLo%D!J&Ahgu?JF=j#<}(pzsZ)4}`7LC1K@^*kl67Q-Bc{Qz@tP&f0~OBR zer^^{x6_r%lv!=dKrJk`BCou6gpx z?+$SK`Y&{X+QQLYGX7$UbV(_7d8yNad|*}t7&>TuW^a1dC_F?>}{C7Yoxg`v_dR9 z&jO<_P1|?f!^fnje)~;+5Vijv+{(0M4b*@<^axnYvhP>KW=0;b(EnxD@1Y*4HKmrx zpN%zA$MAHsyx^S+jw%6{Ei(jkKE$IIF7iG!LErrVOS3Ws3)yQ%WNp6N4rka*RX~z5 zNMzf$HI5JsDk=joTLcsPrPP;U5rWi=%@iK(i*Rdt&{O-{=BEjz;9)8 z+K?||LBF*9=fj1j-h!gn*aT@6rQ0(&>?o$XI=f6k zn)6)Xj*7LC%<0SgxY%mlCUbRje+uL+aep_M-< zAW5=4G+}Bp&9ynbQwvuAAo3vE zPxXtx(N94<9_(;*-`1j}TOOTzrw;vu_>#EZfY%>UKE8so5;KgTo%G}@9tKuo)rY@WRw;`Sd<0se(5cK8Np z*=f1CtqD1sjUSvB&zaU9iM5|n-wr=t6jW2(1(#2c6H_aAn}#5qN$rX1DEMUk~- zJ$XsdtiLgw)gUj30{p&sJ@r2R~B)%;tPL71n(3GJTyI_8)TQ(-oD>m!t`R@e?# zj*^~%cik%}^S={JpEwpvy@xBvv?w+X!8OqACf7=wiS}3+Ye38%%_Cdyn z;+jut)d0-#$tBUgKf=!54iG(ofG+?QuKL#EV2qy13!h5OLea5&JR1x{32-h##>oJ0 z5%e+xUBQCW{r<|Xnry%x{d_3sdD1%H6R?L=#CmGK)p-Id*(2B}uVVyWQOxCAV{Egp zpNLwJc-|DrU08&qn^4>>F&%`Tp_TEvZJRC5E)5FVsZs`DZyRU_bzkeX(4Bho77wBd z0si>${YSr+a97gcl1dVg^P%Z1u~h;=oz#ZL#*^-{y6oW4v<{ZDiN z|66#RO#4eLWh%Adt+BD9%b(zBEt5zF&fBGHQ#DenR%Y>2tJX5YCl>0aE>6DdkG%%U zVO@&L^gFzj)w`*(5*Z#yKvuxD7yZ2-FQ(*F1>f$b?izN5K44@B-FvGIS@zZytd|Gg zTp*rwkQ5BkGrqm9^e$f*S(|E*;(MZ&wq9g$Tj0cuL{RSZ9p=VeFX)}uE!C%uvKU#a zh`&K2ayMRe6nNss`cq) z`?x8LaKR-);^ttPSa12G3j|i<6%M9zz #include -#define K_AMP 0 -#define K_FREQ 1 -#define K_OSC1_VOL 2 -#define K_OSC1_WAVEF 3 -#define K_OSC1_PHASE 4 -#define K_OSC1_DET 22 -#define K_OSC2_VOL 5 -#define K_OSC2_WAVEF 6 -#define K_OSC2_PHASE 7 -#define K_OSC2_DET 23 -#define K_OSC3_VOL 8 -#define K_OSC3_WAVEF 9 -#define K_OSC3_PHASE 10 -#define K_OSC3_DET 24 -#define K_OSC4_VOL 11 -#define K_OSC4_WAVEF 12 -#define K_OSC4_PHASE 13 -#define K_OSC4_DET 25 -#define K_HP 14 -#define K_LP 15 -#define K_AENV_ATK 16 -#define K_AENV_REL 17 -#define K_FENV_ATK 18 -#define K_FENV_REL 19 -#define K_DET 20 -#define K_LIM 21 +// Knob indexes +enum +{ + K_AMP, K_FREQ, K_DET, K_LIM, + K_AENV_ATK, K_AENV_REL, + K_OSC1_VOL, K_OSC1_WAVEF, K_OSC1_PHASE, K_OSC1_DET, + K_OSC2_VOL, K_OSC2_WAVEF, K_OSC2_PHASE, K_OSC2_DET, + K_OSC3_VOL, K_OSC3_WAVEF, K_OSC3_PHASE, K_OSC3_DET, + K_OSC4_VOL, K_OSC4_WAVEF, K_OSC4_PHASE, K_OSC4_DET, + K_HP, K_LP, + K_FENV_ATK, K_FENV_REL, + K_LFO1_VOL, +}; -#define K_FMT_PERC 0 // Percent -#define K_FMT_FLOAT 1 -#define K_FMT_WAV 2 -#define K_FMT_FREQ 3 -#define K_FMT_HEX 4 +// Knob value display formats +enum +{ + K_FMT_PERC, + K_FMT_FLOAT, + K_FMT_WAV, + K_FMT_FREQ, + K_FMT_HEX, +}; typedef struct Knob { diff --git a/main.c b/main.c index 31a879a..cdef25f 100644 --- a/main.c +++ b/main.c @@ -107,48 +107,50 @@ int main(void) // Create knobs { - uint32_t x=0+12; - uint32_t y=164; + const uint32_t cell_w=153,cell_h=75; + const uint32_t cell_padx=16,cell_pady=18; + uint32_t x=0+cell_padx; + uint32_t y=cell_h+cell_pady; #define knob_space 32 create_knob(knobs+K_OSC1_VOL,"",x,y);++total_knobs; create_knob(knobs+K_OSC1_WAVEF,"",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC1_PHASE,"Phs",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC1_DET,"Fine",x+=knob_space,y);++total_knobs; - x=152+12; + x=cell_w+cell_padx; create_knob(knobs+K_OSC2_VOL,"",x,y);++total_knobs; create_knob(knobs+K_OSC2_WAVEF,"",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC2_PHASE,"Phs",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC2_DET,"Fine",x+=knob_space,y);++total_knobs; - x=152*2+12; + x=cell_w*2+cell_padx; create_knob(knobs+K_OSC3_VOL,"",x,y);++total_knobs; create_knob(knobs+K_OSC3_WAVEF,"",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC3_PHASE,"Phs",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC3_DET,"Fine",x+=knob_space,y);++total_knobs; - x=152*3+12; + x=cell_w*3+cell_padx; create_knob(knobs+K_OSC4_VOL,"",x,y);++total_knobs; create_knob(knobs+K_OSC4_WAVEF,"",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC4_PHASE,"Phs",x+=knob_space,y);++total_knobs; create_knob(knobs+K_OSC4_DET,"Fine",x+=knob_space,y);++total_knobs; - x=0+12; - y=148+90; + x=0+cell_padx; + y+=75; create_knob(knobs+K_AMP,"Amp",x,y);++total_knobs; create_knob(knobs+K_LIM,"Lim",x+=knob_space,y);++total_knobs; create_knob(knobs+K_DET,"Fine",x+=knob_space,y);++total_knobs; create_knob(knobs+K_FREQ,"",x+=knob_space,y);++total_knobs; - x=152*1+12; + x=cell_w*1+cell_padx; create_knob(knobs+K_AENV_ATK,"A",x,y);++total_knobs; create_knob(knobs+K_AENV_REL,"R",x+=knob_space,y);++total_knobs; - x=152*2+12; + x=cell_w*2+cell_padx; create_knob(knobs+K_LP,"LP",x,y);++total_knobs; create_knob(knobs+K_HP,"HP",x+=knob_space,y);++total_knobs; - x=152*3+12; + x=cell_w*3+cell_padx; create_knob(knobs+K_FENV_ATK,"A",x,y);++total_knobs; create_knob(knobs+K_FENV_REL,"R",x+=knob_space,y);++total_knobs; #undef knob_space @@ -604,21 +606,24 @@ int main(void) render_image(r,tex_bg,0,0,640,480); // Draw waveform - SDL_SetRenderDrawColor(r,86,86,86,86); - SDL_RenderDrawLine(r,0,70,640,70); - SDL_SetRenderDrawColor(r,255,0,0,0); - for(size_t i=1;i