Compare commits

...

520 Commits
v0.2.0 ... main

Author SHA1 Message Date
Stefano D'Angelo
18c7d41d87 update to latest tibia 2025-04-18 06:18:29 +02:00
Stefano D'Angelo
10b7c3834a bw_sampler doc + removed useless includes 2025-04-10 15:38:03 +02:00
Stefano D'Angelo
422cdcdb8d bw_sampler fixes + synth(pp)_sampler examples 2025-04-10 12:08:20 +02:00
Stefano D'Angelo
2ceca5cc0c bw_sampler param renaming + get phase 2025-04-10 10:26:08 +02:00
e319de1a1f bw_sampler tentative 2025-04-10 09:16:45 +02:00
11f49b4276 bw_drive cosmetics 2025-04-05 09:44:02 +02:00
f960114cfb added missing bw_mm1 to list of bw_drive deps 2025-03-27 05:20:28 +01:00
5f494781ac fix doc typos in bw_slew_lim 2025-03-21 16:17:27 +01:00
97790bc330 bw_common fix bad copyright header 2025-02-28 18:21:33 +01:00
5c185738c2 bw_math: relax bw_sechf() requirements 2025-02-28 18:20:23 +01:00
c91dbd5c95 bw_math: added bw_sechf() 2025-02-27 13:52:40 +01:00
d008662ffb fix copyright typo in bw_comb 2025-02-23 10:59:07 +01:00
b5cdf2ad19 bw_svf: small optmization 2025-02-21 14:58:35 +01:00
181285f4ff fix C++ implementation bw_iir{1,2} 2025-02-03 11:53:25 +01:00
ca4c4fa006 fix bug in debugging code in bw_iir2_process 2025-02-03 07:10:08 +01:00
512546f108 potential optimization in bw_iir{1,2}_process_multi 2025-02-03 07:03:23 +01:00
2a6f149612 fix doc typos 2025-02-03 06:21:31 +01:00
aaeba97a37 fix typo in bw_iir2 2025-02-01 15:23:11 +01:00
d49fc15db2 updated examples' README 2025-02-01 10:19:05 +01:00
b93eb5d836 updated to latest android packages 2025-02-01 09:11:11 +01:00
5661ebc0e7 now version and build version are set by tibia_gen.sh in examples 2025-01-31 18:20:38 +01:00
7d521e51e0 bw_iir{1,2}: fixed, updated doc 2025-01-31 11:35:02 +01:00
61afaca400 bw_iir1 doc + bw_iir2 limited prewarping freq 2025-01-31 08:13:32 +01:00
fbd0890017 fix asterisk-escaping typos in doc 2025-01-30 10:23:25 +01:00
4220bed501 bw_iir{1,2}: more debugging and api improvements 2025-01-29 16:11:40 +01:00
ee327ebe80 bw_iir1 debbugging code 2025-01-28 19:27:08 +01:00
a6d52765a6 now using BW_NULL instead of nullptr in C++ API/implementations 2025-01-28 16:22:07 +01:00
029ec29f6d added prewarp_at_cutoff in bw_iir{1,2} 2025-01-28 15:45:41 +01:00
20bb3a8193 new examples fxpp_iir{1,2} 2025-01-28 10:22:55 +01:00
fb3ab23599 fx_iir2: fix reset 2025-01-28 09:39:41 +01:00
f58353bc20 bw_iir{1,2} fixes + fx_iir{1,2} examples 2025-01-28 09:33:51 +01:00
1be6e06699 bw_iir{1,2} progress 2025-01-28 08:50:33 +01:00
4487ef2176 update copyright + bw_osc_sin cosmetics + beginning of bw_iir{1,2}.h 2025-01-27 23:27:01 +01:00
65eeade32d update to latest tibia changes 2024-12-13 17:15:41 +01:00
83e101cf8e added extra makefile rules for web-demo 2024-12-13 14:33:29 +01:00
Stefano D'Angelo
c779481486 update to latest tibia again 2024-12-12 12:13:11 +01:00
Stefano D'Angelo
a605293801 hopefully updated to latest tibia 2024-12-12 11:34:17 +01:00
67756cf502 updating to latest tibia (many examples likely broken now) 2024-12-12 08:18:32 +01:00
02e628e5b0 bw_one_pole: fix doc typo 2024-12-08 21:24:15 +01:00
ff459dece1 bw_gain: fix doc typo 2024-12-08 19:01:58 +01:00
defabafb45 bw_gain: fix changelog 2024-12-08 18:06:02 +01:00
578bec397f cosmetics 2024-12-08 15:44:43 +01:00
5c91a48e42 fix doc typo 2024-12-04 12:40:54 +01:00
abc65d292a fix tibia tag link 2024-12-04 11:27:03 +01:00
d2b15d9155 not including tibia in releases anymore 2024-12-04 10:46:29 +01:00
90f03881fd change ios deployment target to 14.0 in examples 2024-12-04 10:26:34 +01:00
Stefano D'Angelo
5015dd6bbd bw_common: remove Brickworks references in doc 2024-11-29 14:18:51 +01:00
724d7c6b8a bw_math doc cosmetic fix 2024-11-19 08:53:55 +01:00
da22954810 bw_buf doc cosmetics 2024-11-18 17:52:29 +01:00
f3a12e8e0a bw_mm{1,2}: clarified implemented transfer function 2024-11-11 08:03:10 +01:00
ff99bda751 bw_{delay,env_gen}: fix BW_DEBUG_DEEP 2024-11-10 10:53:07 +01:00
b214bc896e bw_math: add bw_log2_1p2xf, bw_log_1pexpxf, bw_log10_1p10xf 2024-11-01 12:24:15 +01:00
Stefano D'Angelo
6431749bf8 bw_reverb: add missing BW_RESTRICT and fix doc 2024-10-23 08:21:35 +02:00
3a8e279fde cosmetics 2024-10-14 11:27:47 +02:00
Stefano D'Angelo
2ba329f5ea cosmetics 2024-10-11 15:59:22 +02:00
Stefano D'Angelo
f1e471e9bf fix bug in bw_note_queue_is_valid() 2024-10-11 11:02:59 +02:00
340d527ffa add bw_note_queue_all_notes_off 2024-10-11 07:09:02 +02:00
dd6f6adb2c fix typo in bw_note_queue + cosmetics 2024-10-02 11:30:32 +02:00
c7f930673f add sticky thresh to bw_gain and needed related api to bw_one_pole 2024-09-24 07:28:39 +02:00
98e5ef65c4 bw_reverb: cosmetics 2024-09-21 15:38:05 +02:00
daf0cb3e1c introduce BW_{INCLUDE_WITH_QUOTES,NO_CXX,CXX_NO_EXTERN_C} 2024-09-21 12:45:00 +02:00
324aa911fd bw_voice_alloc: added static inline 2024-09-18 17:03:31 +02:00
Stefano D'Angelo
f530db5c45 bw_buf cosmetics 2024-08-30 14:27:58 +02:00
Stefano D'Angelo
eaaeebb8ff bw_buf: add bw_buf_copy() and bw_buf_copy_multi() 2024-08-30 12:11:28 +02:00
adbd1ab61c bw_env_gen: reintroduce BW_ENV_GEN_V_MAX 2024-08-29 18:16:59 +02:00
750c807db3 oops, removed generated files 2024-08-26 17:31:07 +02:00
f6b4e1b7ec adjusted to latest tibia updated 2024-08-26 17:30:25 +02:00
b517c83cb5 bw_env_gen added process output bound debugging check 2024-08-24 17:31:25 +02:00
9cb3bb00fa bw_math int64 routines 2024-08-24 17:20:46 +02:00
099fb7507b bw_env_gen fix reset w/ skip sustain and strengthened implementation 2024-08-23 17:28:09 +02:00
Paolo Marrone
091b677663 better instructions for android example 2024-07-09 11:45:24 +02:00
862e56840f bw_phase_gen: fix doc 2024-07-07 18:11:28 +02:00
Stefano D'Angelo
6f856ec04c bw_src_int cosmetics 2024-07-05 11:51:56 +02:00
Stefano D'Angelo
07387edcc6 fixed fx(pp)_bitcrush on daisy seed and adapted to latest tibia 2024-07-02 19:12:01 +02:00
Stefano D'Angelo
eef7f35dc5 enforcing combined parameter limits also in *reset_state 2024-07-02 12:08:55 +02:00
Stefano D'Angelo
7b53b045a9 fix missing #endif in bw_bd_reduce 2024-07-02 11:37:08 +02:00
Stefano D'Angelo
99b6ec2996 this should be it 2024-07-02 11:28:45 +02:00
Stefano D'Angelo
e5cc92c72f more of the same 2024-07-02 10:27:05 +02:00
f04fcac4ea more of the same 2024-07-02 07:17:12 +02:00
c2c1979cc3 more of the same + fix new checks in bw_osc_{pulse,tri}_coeffs_is_valid 2024-07-02 06:46:45 +02:00
1e34773da8 adding extra debug checks to process_multi functions (wip) 2024-07-02 06:15:27 +02:00
f623002c27 bw_phase_gen: bw_phase_get_set_phase_inc_{min,max} doc 2024-07-01 19:30:42 +02:00
Stefano D'Angelo
2860ddc141 bw_phase_gen: add phase_inc_{min,max} comparison checks 2024-07-01 17:45:56 +02:00
Stefano D'Angelo
06fc92a2e0 bw_phase_gen: add phase_inc_{min,max} parameters 2024-07-01 17:33:45 +02:00
Stefano D'Angelo
af6ce9ba5e bw_osc_tri cosmetics 2024-06-27 17:12:16 +02:00
93ddf112bb bw_osc_{saw,pulse,tri}: extra validation checks and cosmetics 2024-06-22 18:49:12 +02:00
Stefano D'Angelo
5d3fbdbb0a more freq-related fixes in bw_phase_gen 2024-06-20 09:52:13 +02:00
Stefano D'Angelo
861cdc427e fix rounding bug and extra debug checks for bw_phase_gen 2024-06-18 15:22:13 +02:00
Stefano D'Angelo
5bd685ed7b updated to latest tibia 2024-06-17 10:48:09 +02:00
10a2d1ff45 revised process_multi buffer assumptions 2024-06-15 13:16:08 +02:00
Stefano D'Angelo
1d731eaafb accomodate msvc reporting wrong C++ standard support 2024-04-15 12:15:54 +02:00
Stefano D'Angelo
4dfbded165 fix process() invokation in fxpp_pan 2024-03-19 13:54:26 +01:00
Stefano D'Angelo
5f2a413b4d add gate param to bw_bd_reduce and examples + fix fxpp_bitcrush 2024-03-13 12:28:35 +01:00
Stefano D'Angelo
a4a8ba96ca add bw_dry_wet_get_wet(_cur)() 2024-03-07 18:45:52 +01:00
Stefano D'Angelo
93f571af18 avoid bw_minf() to compute samples in synth* 2024-03-07 16:57:50 +01:00
Stefano D'Angelo
5a4b9dc9b3 fix a few bugs in synth(pp)_{mono,poly} 2024-02-24 19:23:25 +01:00
Stefano D'Angelo
ba9fdc710c some synth(pp)_poly optimization + synth_mono cosmetics 2024-02-24 13:48:50 +01:00
Stefano D'Angelo
e9d80f55ac synth(pp)_mono, some optimization 2024-02-24 11:04:41 +01:00
Stefano D'Angelo
e0bfcdbdd7 damn underlines 2024-02-23 15:09:13 +01:00
Stefano D'Angelo
0b64fcbb61 readme cosmetics 2024-02-23 15:08:29 +01:00
Stefano D'Angelo
5fcbe57ad0 update README 2024-02-23 15:07:34 +01:00
Stefano D'Angelo
7a8ef7ae25 updated changelog 2024-02-23 15:04:45 +01:00
Stefano D'Angelo
4b10a04b3c copyright notices in examples 2024-02-23 14:17:01 +01:00
Stefano D'Angelo
590dbb8177 example instructions remove leftovers 2024-02-23 12:05:01 +01:00
Stefano D'Angelo
442d5ac283 cmd line examples instructions 2024-02-23 12:04:08 +01:00
Stefano D'Angelo
cedcbce960 oops, fix examples readme typo 2024-02-23 11:55:58 +01:00
Stefano D'Angelo
c39e1df4a5 tibia instructions 2024-02-23 11:54:03 +01:00
Stefano D'Angelo
ed80795731 test new examples README 2024-02-23 10:35:13 +01:00
Stefano D'Angelo
d3ec90a16e changed lv2 versions and vst3 guids 2024-02-21 18:26:02 +01:00
Stefano D'Angelo
e6cb568b04 remove useless label 2024-02-21 14:44:45 +01:00
Stefano D'Angelo
3e26125eb4 exagerate some example parameter ranges 2024-02-21 12:26:04 +01:00
Stefano D'Angelo
43d20f5c52 add silence_dc param to bw_bd_reduce, use it in examples 2024-02-21 10:37:20 +01:00
Stefano D'Angelo
61d3459b95 synthpp_poly 2024-02-21 09:03:09 +01:00
Stefano D'Angelo
4f7eb0a82f synth_poly + small fixes synth(pp)_mono 2024-02-20 18:24:49 +01:00
Stefano D'Angelo
cbfae97e42 synthpp_mono + synth_mono adjustments 2024-02-20 14:47:23 +01:00
Stefano D'Angelo
a5e56e2dd1 synth_mono + portamento in ms also in synth(pp)_simple 2024-02-20 11:33:50 +01:00
Stefano D'Angelo
a80aa87b27 fx(pp)_wah 2024-02-16 11:44:29 +01:00
Stefano D'Angelo
2bb3d1c9f5 fx(pp)_vibrato 2024-02-16 11:27:13 +01:00
Stefano D'Angelo
da25dcde75 fx(pp)_trem + fixed some product.json 2024-02-16 10:09:35 +01:00
Stefano D'Angelo
1226e9797d fx(pp)_svf + no more tibia_{clean,gen}.sh juggling 2024-02-16 09:43:18 +01:00
Stefano D'Angelo
3982f14211 fx(pp)_slew_lim 2024-02-16 09:26:10 +01:00
Stefano D'Angelo
3dcfeaf9fa fx(pp)_satur + fixed bw_satur_process_multi gain compensation 2024-02-15 20:49:31 +01:00
Stefano D'Angelo
c9c425e30e fx(pp)_ring_mod 2024-02-15 17:16:46 +01:00
Stefano D'Angelo
ef299091ff fx(pp)_reverb 2024-02-15 16:36:49 +01:00
Stefano D'Angelo
5e5a2f0032 fxpp_phaser for real 2024-02-15 15:48:21 +01:00
Stefano D'Angelo
b9f49672d1 fx(pp)_phaser 2024-02-15 15:42:27 +01:00
Stefano D'Angelo
eff4dab968 fx(pp)_pan 2024-02-15 15:20:26 +01:00
93d960e3b8 DEBUG preprocessor flag 2024-02-14 06:20:00 +01:00
a4924ff832 fx(pp)_{notch,one_pole} 2024-02-14 05:44:11 +01:00
d17387f377 fx(pp)_noise_gate 2024-02-14 05:18:42 +01:00
Stefano D'Angelo
763a024f07 fx(pp)_mm2 2024-02-12 17:54:06 +01:00
Stefano D'Angelo
4769d090c4 fx(pp)_mm1 2024-02-12 17:26:38 +01:00
Stefano D'Angelo
da1a3ef91b fx(pp)_ls1 2024-02-12 13:58:44 +01:00
Stefano D'Angelo
14650e8495 fx(pp)_lp1 2024-02-12 13:48:37 +01:00
Stefano D'Angelo
65e0e13b55 fx(pp)_hs1 2024-02-12 13:40:27 +01:00
Stefano D'Angelo
a4a979ad1d fx(pp)_hp1 2024-02-12 12:21:03 +01:00
Stefano D'Angelo
56f98d6d89 fx(pp)_fuzz 2024-02-12 12:02:02 +01:00
Stefano D'Angelo
2dca881f03 fx(pp)_flanger 2024-02-12 11:21:25 +01:00
Stefano D'Angelo
e828804d35 fx(pp)_eq_3band 2024-02-12 10:54:27 +01:00
397c36a7a0 fx(pp)_drive + fix bw_drive #endif in wrong place 2024-02-11 10:58:11 +01:00
76343595d8 fx(pp)_dist + cleaning 2024-02-11 10:34:23 +01:00
9af1146e48 fx(pp)_delay + cosmetics 2024-02-11 10:09:15 +01:00
93df684ac8 fx(pp)_comb + homogenize c++ examples a bit 2024-02-10 12:27:53 +01:00
9685ac9b4b fx(pp)_clip 2024-02-10 11:45:04 +01:00
Stefano D'Angelo
74737a8787 fx(pp)_chorus + clean some examples + improve tibia_gen.sh 2024-02-10 10:34:07 +01:00
Stefano D'Angelo
17ec290ae6 fixed synthpp_simple on web 2024-02-10 09:25:18 +01:00
Stefano D'Angelo
129d44db76 non-working synthpp_simple/wasm attempt 2024-02-09 18:20:20 +01:00
Stefano D'Angelo
404530cbbe differentiate and fix c++ fx and synth, beginning of synthpp_simple 2024-02-09 17:21:29 +01:00
Stefano D'Angelo
a9a690bc69 fix android-make.json 2024-02-09 15:54:31 +01:00
Stefano D'Angelo
f9e1f5eb73 new synth_simple + cosmetics in fx_balance 2024-02-09 11:35:27 +01:00
Stefano D'Angelo
df5f3837ea fixed bw_{comp,noise_gate}_process_multi 2024-02-08 15:54:42 +01:00
Stefano D'Angelo
0b7da2dda9 added fxpp_comp, fixed/cleaned fx_comp 2024-02-08 15:54:05 +01:00
Stefano D'Angelo
1c74f053db relax sidechain input api in bw_{comp,noise_gate} 2024-02-07 14:09:50 +01:00
Stefano D'Angelo
745ba9c2dd fxpp_cab mostly 2024-02-06 11:56:23 +01:00
Stefano D'Angelo
9b0496474b lots of example-related improvements + fx(pp)_bitcrush 2024-02-06 11:19:39 +01:00
Stefano D'Angelo
684f021476 tibia/ios 2024-02-05 16:34:22 +01:00
4ff4ceed70 add fxpp_{ap2,balance}, fix fx_balance daisy seed, c++ array in non-wasm 2024-02-03 08:09:18 +01:00
Stefano D'Angelo
e4e9643509 finally we can use C++ in web examples 2024-02-02 17:48:53 +01:00
Stefano D'Angelo
1d2f9dda39 introuced BW_CXX_NO_ARRAY 2024-02-02 17:42:12 +01:00
Stefano D'Angelo
2a62abe93b beginning of new c++ examples (fxpp_ap1) 2024-02-02 11:26:00 +01:00
1b4035b5ac removed c++ examples, updated fx_balance and more 2024-02-01 16:32:40 +01:00
156374aca4 just comments 2024-02-01 15:15:47 +01:00
0605204593 replace pragmas with dumb code in bw_{env_gen,hs2,ls2,one_pole,peak} 2024-02-01 15:12:51 +01:00
4b2f07852b updated fx_ap2 and tibia-related scripts 2024-02-01 10:08:32 +01:00
233c9d7303 integrating tibia, fx_ap1 works 2024-02-01 09:56:12 +01:00
37055e65ad added changelog entries for bw_common and bw_math 2024-01-31 10:08:25 +01:00
Stefano D'Angelo
ef8b5626a3 remove useless bw_config.h 2024-01-13 10:54:15 +01:00
2ba9b443c1 introduced BW_NULL 2024-01-02 11:20:52 +01:00
Stefano D'Angelo
4ee0c0d0cc fix two more warnings in bw_math (thx again kevin molcard) 2023-12-08 00:24:04 +01:00
Stefano D'Angelo
2b104fc7f2 fix some sign-related warnings (thx kevin molcard) 2023-12-06 14:40:16 +01:00
Stefano D'Angelo
e6903eef7f fix building examples requiring memory on ios 2023-11-03 13:08:48 +01:00
Stefano D'Angelo
0cb5a29a8b fixed documentation typos in bw_ls2 2023-10-27 15:48:32 +02:00
891fa64c9b new bw_cab modules, fx(pp)_cab examples 2023-10-25 15:35:33 +02:00
92e312766b fixed rounding bug when frequency is tiny and negative in bw_phase_gen 2023-10-17 16:36:27 +02:00
Stefano D'Angelo
df05bf1740 add skip_sustain and always_reach_sustain parameters to bw_env_gen 2023-10-16 15:34:25 +02:00
3ae4947855 cosmetics 2023-10-03 10:39:32 +02:00
cb37f4f977 cosmetics 2023-10-03 10:08:06 +02:00
d1e4e0f7c3 bw_{mm1,mm2,reverb}: fix reset_state 2023-10-03 09:13:38 +02:00
928b0752ff cosmetics 2023-10-03 08:59:09 +02:00
dad7485016 fix bw_env_gen_reset_state (gate_0) + fix doc 2023-09-28 13:31:20 +02:00
e49cae6c8b updated ChangeLog 2023-09-28 07:01:53 +02:00
16d17cb5f4 big cleanup 2023-09-27 20:36:11 +02:00
7b968161ec TODO now lives in a better place + fix typos 2023-09-27 17:44:59 +02:00
dbee544059 remove #include <stdio.h> 2023-09-27 16:51:15 +02:00
Stefano D'Angelo
c1cb51ad84 update doc 2023-09-27 13:46:36 +02:00
Stefano D'Angelo
ff7a768c05 update publications doc 2023-09-27 13:33:54 +02:00
Stefano D'Angelo
34bf3bfeb9 fix build on win32 2023-09-26 08:59:15 +02:00
Stefano D'Angelo
2cef5cd584 update TODO 2023-09-26 08:30:26 +02:00
Stefano D'Angelo
9d4d5759a0 fix bw_phase_gen and build on mac 2023-09-26 08:28:20 +02:00
Stefano D'Angelo
313ec711fe change config.h version to 1.0.0 2023-09-25 17:42:39 +02:00
Stefano D'Angelo
9162c57cb1 more debug 2023-09-25 17:16:42 +02:00
Stefano D'Angelo
8ee4150889 more debug + cosmetics 2023-09-25 16:47:17 +02:00
eb8b057492 fix fxpp_bitcrush 2023-09-24 23:55:51 +02:00
Stefano D'Angelo
68df6bee86 removed sse2neon code from repo 2023-09-23 13:40:38 +02:00
cd0b867d88 update TODO 2023-09-23 07:45:49 +02:00
2bad45aabb updated synth examples 2023-09-23 07:21:55 +02:00
Stefano D'Angelo
d890510d0f finalized bw_reverb + examples + fix bw_dry_wet + cosmetics 2023-09-22 18:34:16 +02:00
Stefano D'Angelo
d5751c0c4c finalized bw_comb + examples + better doc bw_chorus 2023-09-22 16:10:42 +02:00
Stefano D'Angelo
07ff65597f finalized bw_comb + examples + better debug in bw_delay 2023-09-22 14:52:45 +02:00
Stefano D'Angelo
49a06b52eb what happened to README? 2023-09-22 11:23:05 +02:00
Stefano D'Angelo
58a50b3ba1 finalized bw_delay + examples 2023-09-22 11:21:08 +02:00
f267a015b7 update TODO 2023-09-22 07:52:58 +02:00
Stefano D'Angelo
4bc7eda8f3 change C++ process() using std::array in bw_src 2023-09-21 17:05:37 +02:00
Stefano D'Angelo
fc91d59f57 finalized bw_src + extra touches to bw_src_int 2023-09-21 14:32:17 +02:00
Stefano D'Angelo
9b123a28f2 finalized bw_src_int 2023-09-21 12:10:21 +02:00
Stefano D'Angelo
40adc296a2 reverted noise scaling in synth(pp)_mono 2023-09-21 10:37:59 +02:00
Stefano D'Angelo
e3cd1d4e21 finalized bw_pink_filt + updated synth_mono 2023-09-21 10:22:02 +02:00
52d33fa3c5 finalized bw_noise_gen + updated synth(pp)_mono + better bw_gain debug 2023-09-21 07:59:41 +02:00
aefd36aac1 finalized bw_osc_tri + fixed bw_osc_pulse 2023-09-20 16:52:06 +02:00
6d94c36677 finalized bw_osc_pulse 2023-09-20 16:03:13 +02:00
b4898a60b3 finalized bw_osc_saw + updated synth(pp)_mono + better doc/debug 2023-09-20 14:58:33 +02:00
f1d4de6457 improve vst3 makefiles (untested on mac/win) 2023-09-20 11:32:30 +02:00
ac0ffd632a finalized bw_osc_filt + updated synth(pp)_mono 2023-09-20 09:28:36 +02:00
398e051f93 finalized bw_env_gen + updated synth_simple 2023-09-20 08:26:17 +02:00
cb91af4576 finalized bw_{sr_reduce,bd_reduce} + examples 2023-09-19 14:35:38 +02:00
f470af1a92 finalized bw_phaser + examples + improved docs 2023-09-19 10:22:36 +02:00
3e1400922f finalized bw_trem + examples 2023-09-19 08:49:56 +02:00
Stefano D'Angelo
dc93bd675b finalized bw_{ring_mod,osc_sin}, bw_dry_wet (untested) + new fx(pp)_ring_mod + cosmetics 2023-09-18 17:04:11 +02:00
Stefano D'Angelo
baf440a171 finalized bw_phase_gen + updated synth(pp)_simple + better bw_svf doc 2023-09-18 13:41:15 +02:00
31b0afb83e finalized bw_balance + examples 2023-09-16 18:32:56 +02:00
05c6f58997 fix bw_*_state_is_valid in finalized modules 2023-09-15 21:21:51 +02:00
99fc95a693 finalize bw_{pan,ppm} + examples + fix bw_env_follow debug, bw_wah reset 2023-09-15 21:05:50 +02:00
Stefano D'Angelo
7b65b75d92 finalized bw_noise_gate + examples + fix bw_{comp,one_pole,slew_lim} + better bw_rcpf() doc 2023-09-15 16:27:04 +02:00
Stefano D'Angelo
19e37fd6e8 finalized bw_comp + fixed missing smooth init + examples 2023-09-15 11:01:58 +02:00
69b74c4ccb finalized bw_env_follow, untested + wip bw_comp 2023-09-15 08:30:01 +02:00
0ef455722f finalized bw_fuzz + examples 2023-09-14 11:07:33 +02:00
77db1a3cdb finalized bw_drive + examples + fix reset in bw_{cilp,satur} 2023-09-14 10:43:55 +02:00
8793af1864 finalized bw_dist + examples + better doc bw_wah 2023-09-14 09:36:34 +02:00
7d6409772f fixed and improved bw_src_int implementation 2023-09-13 16:55:06 +02:00
a3f42c8c57 finalized bw_satur + examples + fix reset in bw_clip 2023-09-13 13:23:15 +02:00
dae41a3831 finalized bw_clip + examples + stronger debug + uncheck coeffs in
process1
2023-09-13 11:36:26 +02:00
13987673f5 proper computing of initial values in finalized modules 2023-09-12 17:05:51 +02:00
1d763ef31e finalized bw_wah + examples 2023-09-12 16:49:33 +02:00
Stefano D'Angelo
524ce724bc set harder limits for gains in bw_{gain,hs1,hs2,ls1,ls2,peak} 2023-09-11 14:40:33 +02:00
Stefano D'Angelo
34402d720e now reset_state deals explicitly with initial values 2023-09-11 13:29:36 +02:00
Stefano D'Angelo
d9e021aca3 finalized bw_{notch,peak} + examples 2023-09-11 10:52:41 +02:00
Stefano D'Angelo
213bac4209 finalized bw_ls2 + fixed bw_hs2 prewarp cutoff + examples 2023-09-08 23:19:03 +02:00
Stefano D'Angelo
d50e7536d5 finalized bw_mm2 + examples 2023-09-08 22:21:08 +02:00
Stefano D'Angelo
04b027f564 finalize bw_hs2 (untested) + more debug in bw_{ls1,hs1} + fix doc 2023-09-08 07:42:53 +02:00
Stefano D'Angelo
b36a56ab70 fix bw_ap1 output polarity + finalize bw_ap2 + examples + cosmetics 2023-09-05 11:35:30 +02:00
Stefano D'Angelo
e12db3795a change bp polarity + limit prewarp in bw_svf + cosmetics 2023-09-05 09:46:09 +02:00
Stefano D'Angelo
a16cdd9c73 changed valid cutoff/prewarping range everywhere 2023-09-05 07:16:21 +02:00
Stefano D'Angelo
a7b3f5ce16 fix, finalize bw_svf + examples + more restrict + better debug 2023-09-03 20:22:52 +02:00
Stefano D'Angelo
72ba53385c finalize all 1st order filter modules and examples + bw_*_reset_state_multi() and init values + bw_gain get gain improv + use bw_gain_process1() in bw_dry_wet 2023-09-01 19:43:50 +02:00
Stefano D'Angelo
2d653f471f finalized bw_ls1 + examples + fix bw_hs1 changelog 2023-08-31 12:06:34 +02:00
Stefano D'Angelo
e4aef951f2 finalized bw_hs1 + examples 2023-08-31 10:47:20 +02:00
Stefano D'Angelo
003c3b62d7 fix bw_gain + finalize bw_mm1 + examples 2023-08-31 07:23:26 +02:00
Stefano D'Angelo
d5dda7f26b add coeffs to *state_is_valid everywhere it's implemented 2023-08-30 20:11:02 +02:00
Stefano D'Angelo
99afa41b8d almost finalized bw_gain + cosmetics 2023-08-30 19:42:06 +02:00
Stefano D'Angelo
537cd5d17b fix debug in bw_{one_pole,slew_lim,lp1,hp1} + force min out in bw_ppm + cosmetics 2023-08-30 17:54:09 +02:00
Stefano D'Angelo
d15e7951f7 finalize bw_hp1 + examples + fix bw_slew_lim + ChangeLogs/cosmetics 2023-08-30 17:12:27 +02:00
Stefano D'Angelo
637cefb636 added pragmas to calm gcc in bw_{env_gen,hs2,ls2,one_pole,peak} 2023-08-30 11:44:59 +02:00
Stefano D'Angelo
d2994b0e12 finalized bw_lp1, examples + more debug for bw_slew_lim + cosmetic changes 2023-08-30 11:00:11 +02:00
Stefano D'Angelo
e9a935a964 fix bw_one_pole + finalize and fix bw_slew_lim + update fx*slew_lim 2023-08-29 13:11:12 +02:00
Stefano D'Angelo
af2d21e45c finalize bw_one_pole + adjust example Makefiles + fix stupid bug in bw_dist 2023-08-29 10:49:08 +02:00
Stefano D'Angelo
26f98b3ec7 some code formatting and bug fix in bw_{note_queue,one_pole} 2023-08-28 19:42:35 +02:00
Stefano D'Angelo
2792602e2f some code formatting in bw_{buf,common,math,note_queue,rand,voice_alloc} 2023-08-28 17:19:19 +02:00
6c29b1f0cd wip on many modules, all is broken, all is good 2023-08-20 15:49:04 +02:00
fe02a79329 changed default gain compensation value in bw_{clip,satur} 2023-08-15 06:48:19 +02:00
da30569d61 changed bw_drive input gain to be more like other distortions 2023-08-15 06:37:51 +02:00
3d63665df2 adjusted peak cutoff in bw_dist 2023-08-15 06:26:27 +02:00
c9ca239a0b improved bw_fuzz algorithm + more bw_drive improvements 2023-08-15 05:28:55 +02:00
52233a9d63 improved bw_drive algorithm + added notes to bw_osc_{pulse,tri} 2023-08-14 17:34:22 +02:00
b50e429aad more TODO 2023-08-14 15:06:09 +02:00
82f66009f7 cite scientific articles 2023-08-14 15:05:30 +02:00
c3d8546e75 ensure buffers are not NULL in bw_buf + remove useless array of nullptr
in synthpp_poly
2023-08-14 12:51:53 +02:00
4313cea18c renamed bw_env_gen_update_state_ctrl as bw_env_gen_process_ctrl 2023-08-14 12:22:56 +02:00
ee94fba57b now using backward Euler method in bw_one_pole 2023-08-14 12:11:11 +02:00
262d4f9a5d clarified buffer rules in bw_src* 2023-08-14 11:49:29 +02:00
12a574c07d restrict qualified everything 2023-08-14 09:57:06 +02:00
399325359d renamed bw_{drywet,ringmod} -> bw_{dry_wet,ring_mod} 2023-08-14 06:05:21 +02:00
6b38be600e updated init value name in bw_{slew_lim,one_pole} + updated TODO 2023-08-13 16:00:19 +02:00
ec1a70835c added const everywhere + fixed bw_buf + fixed c++ api in bw_src +
improved bw_src + using new buf api in synthpp_poly
2023-08-13 15:37:15 +02:00
61c2b48817 polished bw_{svf,wah} + removed bwpps + fixed examples 2023-08-13 11:55:25 +02:00
eb49fedd5e polished bw_src{,_int} + removed bwpps + fixed examples 2023-08-13 11:42:06 +02:00
a5e4fa0c76 polished bw_{reverb,ringmod,satur,slew_lim,sr_reduce,trem} + removed
bwpps + fixed examples
2023-08-13 11:18:45 +02:00
ccc94c1b0f polished + bw_{phaser,pink_filt,ppm} + removed bwpps + fixed examples 2023-08-13 06:57:50 +02:00
f55a9a146b polished bw_{pan,peak,phase_gen} + removed corresponding bwpp + fixed
examples
2023-08-13 06:36:35 +02:00
40503b7cb1 polished bw_osc* + removed bwpp_osc* + fixed examples 2023-08-13 05:28:45 +02:00
2a5d1721f8 polished bw_{mm1,mm2,noise_gate,noise_gen,notch} + removed corresponding bwpp and bwpp_note_queue + fixed examples 2023-08-13 04:55:29 +02:00
22030272d9 polished bw_{hp1,hs1,hs2,lp1,ls2,ls2} + removed corresponding bwpp_ +
fixed examples + fixed doc in bw_clip
2023-08-13 04:18:10 +02:00
7e32e18d66 polished bw_{env_follow,env_gen,fuzz,gain} + removed
bwpp_{env_follow,env_gen,fuzz,gain} + fix examples
2023-08-12 19:46:14 +02:00
f89188f790 polished bw_{delay,dist,drive,drywet} + removed
bwpp_{delay,dist,drive,drywet} + fixed doc in bw_{clip,comb,comp} + fixed examples
2023-08-12 18:45:19 +02:00
425aa020e1 polished bw_{comb,comp} + removed bwpp_{comb,comp} + fix examples 2023-08-12 18:00:12 +02:00
ac7d49028b polished bw_{chorus,clip} + removed bwpp_{chorus,clip} + fixed doc typos
in bw_{balance,bd_reduce} + fixed examples
2023-08-12 17:38:55 +02:00
7a2630951f polished bw_{balance,bd_reduce,one_pole} + removed
bwpp_{balance,bd_reduce} + fixed fxpp_bitcrush
2023-08-12 17:20:34 +02:00
5ec809bc4f polished bw_{ap1,ap2,one_pole} + removed bwpp_{ap1,ap2} + fixed examples 2023-08-12 16:51:19 +02:00
48275d077d improved bw_one_pole + removed bwpp_one_pole + c++ reshuffling 2023-08-12 10:15:04 +02:00
225ef9108c add overloaded C++ API w/ C-style arrays in bw_buf + update examples 2023-08-12 08:04:51 +02:00
3a948b1c99 improve arguments in bw_buf + remove BW_SIZE_T and use C++ buf api in examples 2023-08-11 16:54:01 +02:00
55a78a5ab4 done bw_{buf,common,math,note_queue,rand,voice_alloc} + related changes 2023-08-11 12:49:05 +02:00
41f56ec91c update doc and TODO 2023-08-11 10:25:41 +02:00
7616c590a0 fixed input validity ranges in bw_sinhf and bw_acoshf + doc and tests 2023-08-11 10:15:43 +02:00
Stefano D'Angelo
39bad57099 more of the same 2023-08-10 17:06:45 +02:00
Stefano D'Angelo
84d82d039b forgot to remove precision suffix to bw_sqrtf() in bw_peak 2023-08-10 16:19:20 +02:00
Stefano D'Angelo
0da7b31504 more bw_math doc improvements + more tests 2023-08-10 16:17:45 +02:00
Stefano D'Angelo
6e2f5b1bce now everything should work ok again 2023-08-10 10:17:22 +02:00
08c8656259 removing precision suffixes from bw_math functions (now all is broken) 2023-08-10 08:00:44 +02:00
ffe1db7749 updated bw_math ChangeLog + more math tests 2023-08-10 07:48:14 +02:00
88fad66dd6 bw_math: more improvements, more tests (prev commit: also fixes) 2023-08-09 19:17:54 +02:00
c25bd5bc78 bw_math wip + settling on c++11 + some tests 2023-08-09 13:11:09 +02:00
da517ed4bc using size_t and improved bw_common 2023-08-08 10:46:05 +02:00
Stefano D'Angelo
c1e16c4338 better ios instructions 2023-08-07 13:26:04 +02:00
fd6c9cc052 fix new doc mistake in bw_note_queue 2023-08-05 09:11:31 +02:00
d76aa6cb48 added missing doc 2023-08-05 08:58:45 +02:00
45e2cd7976 ChangeLog 0.6.0 2023-08-05 08:30:31 +02:00
f824bf0bc4 ios instructions 2023-08-04 16:20:35 +02:00
Stefano D'Angelo
ad115964a6 even better fix 2023-08-04 15:48:46 +02:00
Stefano D'Angelo
4542235dac oops, real fix 2023-08-04 15:43:30 +02:00
Stefano D'Angelo
046680c503 fix signedness warnings bw_voice_alloc 2023-08-04 15:41:31 +02:00
Stefano D'Angelo
0a586e9764 ios ffs 2023-08-04 15:08:46 +02:00
Stefano D'Angelo
6d92e83b57 improved android code + fixes in bw_ppm and bw_rand 2023-08-04 07:30:57 +02:00
Stefano D'Angelo
13659d9aad remember remember 2023-03-20 15:33:22 +01:00
Stefano D'Angelo
8364afaef2 let me remember stuff 2023-07-30 13:45:08 +02:00
Stefano D'Angelo
e788c26cc6 updated android ndk version + more info on android sdk and ndk installation 2023-07-30 13:32:57 +02:00
Stefano D'Angelo
fa9062968b android instructions 2023-07-30 11:30:05 +02:00
Stefano D'Angelo
1eaa1621c5 added copyright notices to new source files 2023-07-30 10:19:55 +02:00
Stefano D'Angelo
7d1c0e47b1 generated all android example Makefiles and config.js 2023-07-30 10:05:35 +02:00
Stefano D'Angelo
e82731e1f0 android support done + fixes bw_{note_queue,voice_alloc} 2023-07-30 09:48:56 +02:00
Stefano D'Angelo
df554f2572 android fx work + cleaner Android makefile + fixed num channels in fx_reverb 2023-07-28 11:38:49 +02:00
Stefano D'Angelo
b719737eda more android progress 2023-07-27 16:48:03 +02:00
Stefano D'Angelo
9e31fb8058 android progress 2023-07-27 11:42:45 +02:00
Stefano D'Angelo
c2769cdf21 beginning of android + moved config.js files to src + temp warn fix in bw_one_pole 2023-07-26 18:38:21 +02:00
Stefano D'Angelo
d9272453fd const arg for bw_note_queue_is_valid() + bw_one_pole_process{_multi} use BW_SIZE_T + beginning of debugging code in bw_one_pole 2023-07-25 15:03:29 +02:00
Stefano D'Angelo
8299cb7eae use NDEBUG in examples + fix velocity in synth(pp)_poly + really remove bw_omega* + fix bw_math + fix high cutoff in bw_one_pole + debugging in bw_{note_queue,rand,voice_alloc} 2023-07-25 08:52:01 +02:00
Stefano D'Angelo
681008abdb fix bw_acoshf_3 2023-07-24 16:39:57 +02:00
Stefano D'Angelo
cd71cd9063 deep debug + removed bw_omega* + math debug + fixed bw_pow10f_3 2023-07-24 16:14:16 +02:00
Stefano D'Angelo
b08d9ae4f0 removed bw_config + beginning of debug (bw_common, bw_buf) 2023-07-21 08:56:27 +02:00
Stefano D'Angelo
41e87b69a4 fixed typo in bw_common doc + updated ChangeLog 2023-07-13 16:40:31 +02:00
Stefano D'Angelo
c71f7abdb7 ChangeLog 0.5.0 2023-07-13 16:26:41 +02:00
Stefano D'Angelo
1cf8c1050b doc trivia 2023-07-13 12:35:37 +02:00
Stefano D'Angelo
bce3949cd1 minimum attack and release in synth examples + update TODO 2023-07-12 15:36:17 +02:00
Stefano D'Angelo
bddbf72462 c++ doc 2023-07-12 12:07:50 +02:00
Stefano D'Angelo
bd3a6367e0 bw_voice_alloc_mode -> bw_voice_alloc_priority + finished C doc 2023-07-12 10:52:16 +02:00
Stefano D'Angelo
73185217e7 update TODO 2023-07-11 16:33:43 +02:00
20b66887b6 question marks in TODO are important 2023-07-04 16:35:23 +02:00
fc3a596a0b update TODO 2023-07-04 15:34:38 +02:00
b2cb3cad1e multichannel api in bw(pp)_src(_int) 2023-07-04 15:33:18 +02:00
af5dbc0a1c use c++ note queue in synthpp_poly 2023-07-04 11:20:41 +02:00
6e1212d8f5 multichannel api in bw_buf + bwpp_buf + adjusted synth(pp)_poly 2023-07-04 11:06:34 +02:00
c4074927ce multichannel api for bw(pp)_{noise_gen,osc_filt,osc_saw,osc_sin,pink_filt,sr_reduce} 2023-07-04 09:34:37 +02:00
Stefano D'Angelo
61e57084e4 fxpp_reverb 2023-07-01 11:46:47 +02:00
Stefano D'Angelo
146904938b fxpp_vibrato 2023-07-01 11:39:11 +02:00
Stefano D'Angelo
cceaa5077f fxpp_flanger 2023-07-01 11:26:23 +02:00
Stefano D'Angelo
b192b4baa6 fix bwpp_comb + fxpp_comb 2023-07-01 11:12:48 +02:00
Stefano D'Angelo
6326eed219 change default delay length in bwpp_chorus + fxpp_chorus 2023-07-01 10:22:40 +02:00
Stefano D'Angelo
1a4ada6ef6 tentative bwpp_{chorus,comb,reverb} 2023-07-01 09:56:10 +02:00
ebf1712e74 bwpp_{src,delay} + fxpp_delay 2023-07-01 07:33:21 +02:00
c3caa91f99 oops, swap file 2023-06-30 19:46:45 +02:00
de52df395e bwpp_note_queue + synthpp_poly + inline all C++ methods 2023-06-30 19:44:02 +02:00
5245adea14 synthpp_mono + fix bwpp_{noise_gen,osc_tri,pink_filt} and synth* 2023-06-28 10:48:08 +02:00
1b8e4c56e3 synthpp_simple + fixes in bwpp_{osc_filt,osc_pulse,phase_gen} 2023-06-28 08:07:25 +02:00
d01e558622 bwpp_{env_gen,osc_sin,osc_filt} 2023-06-28 07:14:49 +02:00
fccb7712a9 bwpp_{phase_gen,osc_saw,osc_pulse,osc_tri} 2023-06-27 18:01:25 +02:00
7a0c76652f bwpp_{drywet,env_follow,gain,pink_filt,ringmod} + using BW_SIZE_T to index channels 2023-06-27 16:51:53 +02:00
768aa6d81e bwpp_pan + fxpp_pan + use process_multi in fx_balance, fx_pan 2023-06-27 15:55:37 +02:00
Stefano D'Angelo
8c83345f25 bwpp_{phaser,trem} + fxpp_{phaser,trem} 2023-06-26 11:52:35 +02:00
Stefano D'Angelo
4dd9e863ce bwpp_{satur,noise_gate,noise_gen} + fxpp_{satur,noise_gate} 2023-06-26 11:19:08 +02:00
2a5e3d3ece bwpp_{dist,drive,fuzz} + fxpp_{dist,drive,fuzz} 2023-06-25 16:40:30 +02:00
dccc39907e bwpp_comp + fxpp_comp 2023-06-25 11:38:01 +02:00
e331ce1125 bwpp_{bd_reduce,src_reduce,clip,src_int} + fxpp_{bitcrush,clip} 2023-06-25 10:58:47 +02:00
063d4ffb02 bwpp_{ppm,balance} + fxpp_balance 2023-06-22 16:29:06 +02:00
bfee4340a4 more TODO 2023-06-22 11:27:39 +02:00
3490f35e26 more TODO 2023-06-22 11:14:19 +02:00
13223ea427 fix bwpp_slew_lim. unused param warn in bw_slew_lim + fx(pp)_{one_pole,slew_lim} 2023-06-21 17:57:05 +02:00
1092dc14af new bwpp_{mm1,mm2,slew_lim}, fxpp_{mm1,mm2} 2023-06-21 17:02:32 +02:00
Stefano D'Angelo
65bc52b55e new bwpp_{notch,wah} + examples 2023-06-20 15:12:45 +02:00
dbff09f83c welcome bwpp_peak and fxpp_eq_3band 2023-06-19 18:40:00 +02:00
a04e9a2d07 more c++ wrappers 2023-06-19 18:06:19 +02:00
b16a964498 a bunch of c++ wrappers and fxpp examples + new fx_lp1 2023-06-19 17:41:52 +02:00
Stefano D'Angelo
c79d799842 more TODO 2023-06-19 15:30:05 +02:00
Stefano D'Angelo
c1f58ba76d new bwpp_svf, fxpp_svf + free mem, stronger, cleaner vst3 and web wrappers 2023-06-19 15:26:21 +02:00
Stefano D'Angelo
4037735123 fix fx_vibrato 2023-06-14 12:19:40 +02:00
Stefano D'Angelo
06dcbe3f3e more TODO 2023-06-14 08:44:59 +02:00
Stefano D'Angelo
a486e7a90c taking TODO notes 2023-06-14 08:07:53 +02:00
Stefano D'Angelo
8cd630c80e better note stealing in bw_voice_alloc 2023-06-09 09:47:05 +02:00
a5741471d6 synth_poly done 2023-06-08 10:43:18 +02:00
6cecf0d654 fix bw_{note_queue,voice_alloc}, synth_poly begins to work 2023-06-08 09:35:36 +02:00
b2169b6792 multichannel + no NULL to bw_{balance,pan}_process + fix doc, bw_svf_process 2023-06-07 15:41:20 +02:00
20775c532e change bw_env_gen gate api, no unison in bw_voice_alloc, started synth_poly 2023-06-06 16:17:47 +02:00
9d699fe554 bw_voice_alloc should be ok, cosmetic changes to bw_note_queue 2023-06-06 08:08:39 +02:00
5c2030bf97 bw_note_queue and bw_voice_alloc progress 2023-06-05 18:41:14 +02:00
ee4fa3c9f2 tentative bw_note_queue + beginning of bw_voice(_alloc) 2023-06-05 11:30:38 +02:00
Stefano D'Angelo
c3dff38987 fixed bw_reverb reset bug 2023-06-02 14:31:24 +02:00
Stefano D'Angelo
2d170def71 fx_reverb done 2023-06-02 14:13:29 +02:00
Stefano D'Angelo
78e8b911c7 bw_reverb done 2023-06-02 14:10:05 +02:00
Stefano D'Angelo
71a2a00eaf more reverb work 2023-06-02 12:20:01 +02:00
Stefano D'Angelo
8136a09e72 updated mem_req/set in bw_{delay,comb,chorus,reverb} and fxs + more reverb work 2023-06-02 10:50:42 +02:00
1b6cb5a029 bw_reverb WIP (broken) 2023-06-01 17:41:05 +02:00
5d988b0c05 bw_drywet fixed + beginning of bw_reverb, fx_reverb 2023-06-01 13:39:47 +02:00
695dca5769 new bw_gain_get_gain() + fixed bw_ringmod inv polarity and doc +
tentative bw_drywet
2023-06-01 12:20:37 +02:00
44691855ae cosmetic doc change in most modules 2023-05-29 13:51:57 +02:00
5201d3363a fix reset in bw_{chorus,phaser} + better enum param name in fx_chorus 2023-05-29 11:50:16 +02:00
47cdfb4ee1 fixed doc typos 2023-05-29 10:13:13 +02:00
60ca76b9a3 added bw_buf_neg() 2023-05-12 08:03:45 +02:00
c57ddb8877 add some TODO 2023-05-10 15:50:15 +02:00
37415a0b0e fixed bw_drive, new example fx_drive 2023-05-10 11:16:38 +02:00
a8f594916c tentative new module bw_drive 2023-05-10 10:56:02 +02:00
7f42cb70d9 fix bw_dist 2023-05-10 09:34:03 +02:00
Stefano D'Angelo
468f66453b fixed bw_svf prewarp-related instability bug 2023-05-09 14:31:42 +02:00
Stefano D'Angelo
2d101a315e fixed initial state in bw_clip and bw_satur 2023-04-29 06:34:19 +02:00
b811796e35 beginning of bw_dist and fx_dist + fix bw_peak doc and bw_fuzz init 2023-04-26 03:21:20 +02:00
f3911765f5 fix unused variable warnings in daisy seed examples 2023-04-26 03:06:41 +02:00
7354f40a14 enable all warnings when building vst3 and for the web 2023-04-26 01:56:40 +02:00
e6466ce0c8 new bw_clip and fx_clip 2023-04-26 01:48:01 +02:00
Stefano D'Angelo
6228fba4d5 TODO: should add gain compensation to bw_fuzz? 2023-04-25 21:48:59 +02:00
175481e4a5 hello bw_fuzz and fx_fuzz 2023-04-25 12:01:54 +02:00
99ccb2da2d more of that 2023-04-21 06:12:09 +02:00
85488e76a8 fix heading level of some doc in bw_{chorus,comb,delay} 2023-04-21 06:07:50 +02:00
847f99264f TODO: remember to review types 2023-04-21 05:30:35 +02:00
86df4d4580 fix left shift negative value warning in bw_math 2023-04-21 05:28:15 +02:00
4d9de61a9c fix code quote in doc of bw_peak 2023-04-20 02:03:28 +02:00
9322e658b4 fix code quotes in doc of many modules 2023-04-20 01:46:41 +02:00
Stefano D'Angelo
5dfa580d3e 0.4.0 ChangeLog 2023-04-19 08:49:20 +02:00
Stefano D'Angelo
2b211b772e TODO stuff 2023-04-19 08:37:25 +02:00
Stefano D'Angelo
b91a0f8e54 added x0 to reset_state in bw_{lp1,ap1,hp1,hs1,ls1,mm1}, adjusted bw_phaser and examples 2023-04-19 08:33:18 +02:00
b741611b26 removed useless cast from bw_src_int 2023-04-08 10:01:55 +02:00
5f11868282 adjusted fx_chorus, added fx_vibrato and fx_flanger 2023-04-08 09:25:44 +02:00
98db248b5b improved bw_comb and bw_chorus, simplified fx_chorus 2023-04-08 08:25:05 +02:00
Stefano D'Angelo
02996e72d7 removed explicit modulation from bw_comb and adjusted everything else 2023-04-07 15:46:23 +02:00
Stefano D'Angelo
6d77af6319 fix modulation bug in bw_comb + bw_chorus tentative 2023-04-06 12:03:39 +02:00
Stefano D'Angelo
69b8931ece daisy seed midi usb + uart at the same time 2023-04-06 09:46:04 +02:00
8db29e8bec fixed bw_delay and bw_comb, cleaned fx_delay, added fx_comb 2023-04-05 12:46:22 +02:00
7f8198b00e bw_comb tenative plus surrouding changes
* bw_delay: added const to state in bw_delay_read and added
  bw_delay_get_length
* bw_math: added bw_intfracf
* bw_wah: fixed bw_wah_process doc
* cosmetic changes to bw_one_pole
2023-04-05 11:56:42 +02:00
721dc3da27 bw_src, removed useless casts 2023-04-04 15:24:33 +02:00
388ece962a bw_src, fix coeffs, seriously 2023-04-04 15:23:05 +02:00
5eed8c2878 fixed coeffs for bw_src(_int).h for real 2023-04-04 15:17:37 +02:00
c05b6d84db improved bw_src and added proper doc + fixed bw_src_int coeffs 2023-04-04 15:13:26 +02:00
67fcbf8b7d improved bw_src_int and added proper doc 2023-04-04 14:37:38 +02:00
389c6266b5 bw_delay optimized coefficient computation + fixed doc 2023-04-04 10:40:35 +02:00
8fe8a6f995 fixed unused parameter warnings 2023-04-02 21:54:17 +02:00
8f4e50f0a7 added one more TODO task 2023-03-30 17:58:11 +02:00
Stefano D'Angelo
8b5dd45e50 beginning of daisy synth midi uart 2023-03-27 17:53:54 +02:00
Stefano D'Angelo
8750d5cf89 fix bad commit 2023-03-24 16:13:59 +01:00
Stefano D'Angelo
20437e0a23 common index increment style in bw_src 2023-03-24 16:01:33 +01:00
3a44034694 bw_src(_int), start from index 0 when downsampling 2023-03-23 15:58:32 +01:00
fb4d041838 bw_src(_int) don't need bw_math + use natural ratio in bw_src 2023-03-23 15:12:10 +01:00
8c9796f025 added initial value to bw_{ap2,hs2,ls2,mm2,notch,peak,svf,wah} 2023-03-23 14:03:27 +01:00
1aa2cca858 added more hyperbolic functions to bw_math 2023-03-23 09:52:19 +01:00
6504833be0 fix bw_src 2023-03-16 12:01:39 +01:00
db06874a17 tentative bw_src 2023-03-15 20:50:39 +01:00
fd4db8fd4f fix bw_src_int upsampling 2023-03-15 17:45:38 +01:00
d8ac7cadcc fix bw_src_int + use it in fx_satur 2023-03-14 16:46:13 +01:00
02a964d453 tentative bw_src_int, cosmetic change to bw_svf 2023-03-14 15:50:00 +01:00
Stefano D'Angelo
9b746f746f split process in read and write in bw_delay 2023-03-09 16:14:02 +01:00
Stefano D'Angelo
a817b23f50 {bw,fx}_delay now working 2023-03-07 09:27:50 +01:00
Stefano D'Angelo
9dcfb2de30 bw_delay progress + fx_delay + add dynamic mem to common + bw_buf fix new stuff 2023-03-05 08:33:45 +01:00
Stefano D'Angelo
1f1571177a bw_delay: remove useless state parameter from mem_req 2023-03-04 15:24:13 +01:00
Stefano D'Angelo
ab417d4c61 bw_delay tentative + bw_ceilf + bw_buf_fill + BW_SIZE_T + fix bw_wah doc 2023-03-04 08:17:31 +01:00
1843233c96 added bw_buf_add 2023-03-01 07:36:28 +01:00
Stefano D'Angelo
6fe46ef56b fixed bw_phaser coeffs vs state 2023-02-28 11:37:19 +01:00
Stefano D'Angelo
7e855aac96 bw_trem fix doc + rename param + new bw_/fx_phaser tentative 2023-02-27 12:30:40 +01:00
Stefano D'Angelo
a20678a409 renamed mod amount as amount param in bw_ringmod + new bw_trem and fx_trem 2023-02-24 16:12:32 +01:00
Stefano D'Angelo
05d0ea8b1f ringmod tentative 2023-02-23 18:13:21 +01:00
Stefano D'Angelo
fd2b8e69fe added missing vco3 pw midi control on daisy seed 2023-02-22 14:35:50 +01:00
75caf17b16 fix typo 2023-02-20 18:12:17 +01:00
537e309793 updated README.md and added example building/running documentation 2023-02-20 18:09:17 +01:00
b808ef5421 fix module versions in bw_common and bw_rand 2023-02-20 16:28:06 +01:00
767c4f649a use bw_ppm in synth_mono + cosmetic changes 2023-02-20 13:43:10 +01:00
acec8947a0 update ChangeLog(s) 2023-02-20 09:40:04 +01:00
Stefano D'Angelo
3e15f95284 added missing daisy seed examples 2023-02-16 14:38:12 +01:00
Stefano D'Angelo
faa17613f4 fix param enumerations in fx examples 2023-02-16 11:54:40 +01:00
aa6bdeea97 TODO stuff 2023-02-15 14:46:02 +01:00
fffab40cd2 added missing examples + fixed bw_{ap2,hs1,ls1} + cosmetic changes 2023-02-15 14:04:21 +01:00
f2f04264d3 MIDI CC mappings for daisy seed synth examples 2023-02-15 12:45:21 +01:00
Stefano D'Angelo
aed3357957 set default param values in daisy seed synth examples 2023-02-14 16:36:03 +01:00
Stefano D'Angelo
64d9133d7b fix fx_balance example stereo on web 2023-02-14 14:15:15 +01:00
Stefano D'Angelo
0db0e1b42d fix bw_balance + new fx_balance example + fix daisy seed synth simple 2023-02-14 10:14:37 +01:00
Stefano D'Angelo
e4d2d984c8 fix bw_env_gen uninit var + beginning of daisy synth examples 2023-02-07 12:44:41 +01:00
Stefano D'Angelo
fece83f179 some daisy seed fx examples + fixes (in examples) 2023-02-07 11:01:04 +01:00
Stefano D'Angelo
850f787e15 remove useless variable in coeffs in bw_hs2, bw_ls2 2023-02-05 19:39:04 +01:00
Stefano D'Angelo
0a56d74388 daisy seed fx should be good, implemented for bw_wah 2023-02-03 17:29:08 +01:00
Stefano D'Angelo
e199678912 make bw_wah bandpass, don't use malloc in examples 2023-02-03 14:50:28 +01:00
Stefano D'Angelo
1972040cb0 beginning of daisy seed support 2023-02-03 11:48:37 +01:00
0f204c3aa9 new fx pan example + fix bw_pan, copyright, web code (vst3 broken) 2023-01-24 17:27:56 +01:00
Stefano D'Angelo
720e02e857 fix bw_notch + notch fx example 2023-01-24 00:27:42 +01:00
Stefano D'Angelo
bc26c9ed74 removed slope nonsense from bw_{h,l}s2 and eq example + fixes 2023-01-20 19:21:35 +01:00
Stefano D'Angelo
3384d0ea69 fix bw_sqrtf_2() and 3band eq example 2023-01-20 18:27:55 +01:00
Stefano D'Angelo
4077c5271b fix Makefile on win32 and macos 2023-01-20 16:16:57 +01:00
1d4d715449 bw_{hs2,ls2,mm2,peak} half-fixes + 3band eq example + fix svf ex. Makefile 2023-01-19 19:12:12 +01:00
f795e9520f updated and rationalized makefiles + updated copyright notices 2023-01-18 19:47:12 +01:00
483bad7196 rationalize web make 2023-01-17 17:36:17 +01:00
Stefano D'Angelo
d72f1beca7 new bw_ppm module + using it in synth simple example 2023-01-17 16:34:24 +01:00
Stefano D'Angelo
46383fde17 new bw_pan and bw_balance + using BW_RESTRICT in process1 in bw_phase_gen and bw_svf 2023-01-16 19:50:27 +01:00
Stefano D'Angelo
a5cb9b9c06 new bw_buf and using it in synth examples + small optimization to bw_peak 2023-01-16 18:08:39 +01:00
Stefano D'Angelo
3254074efc custom prewarping in bw_mm2 + using it in bw_{l,h}s2 + fix doc in bw_mm1 2023-01-13 12:18:36 +01:00
Stefano D'Angelo
87cb193a48 bw_svf: copryight notice update and draft 0.3.0 changelog 2023-01-12 20:22:37 +01:00
Stefano D'Angelo
97492ce701 add custom prewarping option to bw_svf 2023-01-12 20:18:57 +01:00
Stefano D'Angelo
233a016ba4 hopefully... 2023-01-12 17:07:14 +01:00
Stefano D'Angelo
ac0d98f2da more fixes for bw_hs2 + now bw_peak is theoretically ok (i hope) 2023-01-12 16:41:24 +01:00
5988b4bc49 updated dates, fixed bw_{h,l}s2.h, renamed bw_notch, start of bw_peak 2023-01-12 15:44:24 +01:00
1eeba2252a add prewarp ctrl in bw_{lp1,mm1}, used in bw_{l,h}s1, fixed bw_{l,h}s2 2022-12-30 11:30:21 +01:00
fe21e533f9 new modules bw_ls2 bw_hs2 2022-12-24 10:21:38 +01:00
6455ef34fe new modules bw_hs1, bw_ls1 2022-12-22 08:10:39 +01:00
016a769615 new modules bw_ap1, bw_ap2, bw_hp1, bw_notch2 2022-12-22 07:17:32 +01:00
1584f77a8b new module bw_mm2 and mm2 example + renamed bw_lowpass1 as bw_lp1 2022-12-20 11:23:18 +01:00
71dfbc9186 fixed bw_lowpass1, bw_mm1 + new mm1 example 2022-12-20 10:15:37 +01:00
7865aedbfc new module bw_mm1 (untested) 2022-12-20 09:45:27 +01:00
ad79e9ec65 added smooth tau parameter to bw_gain 2022-12-20 08:53:18 +01:00
2096a877aa removed bw_allpass* + renamed bw_vol to bw_gain + new bw_lowpass1 2022-12-20 08:35:28 +01:00
Stefano D'Angelo
a23ee901a2 use fvisibility=hidden on macos 2022-12-14 15:34:57 +01:00
Stefano D'Angelo
aacd8236b4 bw_allpass2 done (untested) + fix doc bw_svf and more TODOs 2022-12-13 22:41:18 +01:00
Stefano D'Angelo
2a482b77b0 move header inclusion in bw_env_follow as in other modules 2022-12-13 15:41:44 +01:00
Stefano D'Angelo
84c3a7d1cd made bw_allpass1 supposedly super robust 2022-12-13 15:37:39 +01:00
Stefano D'Angelo
7c941fa26b make bw_svf super robust + fix bw_allpass1 + beginning of bw_allpass2 2022-12-13 15:11:08 +01:00
Stefano D'Angelo
03f3b8a67f new module bw_allpass1 (untested) 2022-12-12 16:16:22 +01:00
Stefano D'Angelo
c5c031c915 don't forget stuff in TODO 2022-12-11 10:39:13 +01:00
Stefano D'Angelo
e06cd2426b fixed bw_*_reduce + new fx_bitcrush example 2022-12-11 10:36:56 +01:00
Stefano D'Angelo
57afadd87d new module bw_bd_reduce (untested) 2022-12-11 10:11:51 +01:00
Stefano D'Angelo
39a82639a2 new bw_sr_reduce module (untested) 2022-12-10 15:01:40 +01:00
Stefano D'Angelo
89a70ef9c9 fix definition in bw_pink_filt 2022-12-10 14:50:31 +01:00
Stefano D'Angelo
47f26337cf bw_pink_filt_coeffs needed documentation 2022-12-10 14:18:49 +01:00
007fd59da6 bw_noise + noise gate example + doc improvement bw_comp 2022-12-06 10:10:35 +01:00
f9beb49d00 fix license header in all source files 2022-12-06 09:01:34 +01:00
aff5093234 remember to polish examples 2022-12-05 13:41:30 +01:00
6206530309 added smoothing in bw_comp + fix docs + cosmetic changes 2022-12-05 13:39:28 +01:00
11c399929f fixed bw_comp + new comp example + fixed meaningless bugs in examples 2022-12-05 12:00:44 +01:00
747b6322d4 added in pow10, log10, lin2dB and dB2lin in bw_math 2022-12-05 11:17:28 +01:00
f55a0e53a2 forgot to apply makeup gain in bw_comp 2022-12-05 10:11:37 +01:00
a74323897f added bw_comp (untested) + volume setting in dB in bw_vol 2022-12-05 10:09:15 +01:00
737 changed files with 68486 additions and 11276 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
build
node_modules
package-lock.json
.DS_Store

221
ChangeLog
View File

@ -1,3 +1,224 @@
1.1.0
-----
* Added new bw_cab module.
* Added new fx_cab and fxpp_cab examples.
* Added skip_sustain and always_reach_sustain parameters to bw_env_gen.
* Added silence_dc parameter to bw_bd_reduce.
* Added BW_NULL definition in bw_common and used it throughout the entire
codebase.
* Added BW_CXX_NO_ARRAY to control the inclusion of features depending on
C++ <array>.
* Relaxed sidechain APIs in bw_comp and bw_noise_gate to accept BW_NULL to
represent null sidechain inputs.
* Added setThreshLin() and setThreshDb() methods to the C++ APIs of bw_comp
and bw_noise_gate to fix naming typos without breaking the API.
* Reworked all example code and added LV2, command line application, and
C++/WebAssembly targets.
* Fixed gain compensation in bw_satur_process_multi().
* Fixed rounding bug in bw_phase_gen when frequency is tiny and negative.
* Fixed smoothing of decay parameter in bw_reverb.
* Fixed computation of initial states in bw_mm1 and bw_mm2.
* Fixed sign-related issues in bw_hash_sdbm(), bw_truncf(), bw_roundf(), and
bw_sqrtf() (thanks Kevin Molcard).
* Replace GCC pragmas to suppress uninitalized variable warnings with
useless harmless statements in bw_env_gen, bw_hs2, bw_ls2, bw_one_pole, and
bw_peak.
* Fixed documentation typos in bw_ls2.
* Updated examples' documentation.
1.0.0
-----
* Removed C++ headers and moved C++ code to now-unique C/C++ headers.
* Added extern "C" linkage specifier to C functions declarations and
definitions.
* Added bw_*_reset_state_multi() and updated C++ APIs in this regard.
* Now bw_*_reset_state() take initial input values and return initial output
values.
* Added more const and BW_RESTRICT specifiers to input arguments.
* Added overloaded C++ functions taking C-style arrays as arguments.
* Added debugging code to all modules and improved existing debugging code.
* Removed usage of reserved identifiers and designated initializers.
* Now using size_t rather than BW_SIZE_T and for counting items.
* Improved documentation w.r.t. validity of input values and approximation
errors.
* Added pragmas to silence bogus GCC uninitialized variable warnings.
* Made control over inclusion of standard library headers more explicit via
specific preprocessor definitions.
* Introduced BW_NO_DEBUG and prevented useless inclusion of assert.h.
* Changed order of arguments to improve consistency in bw_buf.
* Renamed bw_min0xf() as bw_min0f() and bw_max0xf() as bw_max0f().
* Removed precision suffixes from function names in bw_math.
* New implementations for bw_min0f(), bw_max0f(), bw_minf(), bw_maxf(), and
bw_clipf().
* Fixed rounding bug in bw_roundf() when absolute value of input was in [0.5f,
1.f].
* Fixed bw_ceilf() for negative input values.
* Fixed bw_sqrtf() for very large input values and improved implementation.
* Fixed input validity ranges in bw_asinhf() and bw_acoshf().
* Removed redundant status member from bw_note_queue_event.
* Possibly improved memeory layout of bw_note_queue.
* Clarified ambiguity in the documentation of bw_note_queue_status.
* Specified that velocity can be negative in bw_voice_alloc_opts.
* Fixed output polarity in bw_ap1.
* Added bw_bd_reduce_set_sample_rate().
* Changed default value for gain compensation to off in bw_clip.
* Fixed missing smoothing filter initialization in bw_comp.
* Fixed missing forced coefficients' update in bw_comp_reset_coeffs().
* Improved and strengthened algorithm in bw_comp.
* Removed read() and write() from C++ API in bw_delay.
* Adjusted internal peak cutoff to more sensible value in bw_dist.
* Improved algorithm to be a bit more faithful to the original in bw_drive.
* bw_drywet renamed as bw_dry_wet.
* Renamed bw_env_gen_update_state_ctrl() as bw_env_gen_process_ctrl().
* Faster and more robust implementation in bw_env_gen.
* Improved algorithm to be a bit more faithful to the original in bw_fuzz.
* Added bw_gain_get_gain_lin().
* Renamed bw_gain_get_gain() as bw_gain_get_gain_cur().
* Simplified implementation to use less memory in bw_gain.
* Added prewarp_at_cutoff and prewarp_freq parameters in bw_ap1, bw_ap2,
bw_hp1, bw_hs1, bw_ls1, bw_ls2, bw_notch, and bw_peak.
* Fixed documentation to indicate correct default parameter values in bw_hs1,
bw_hs2, bw_ls1, bw_ls2, bw_notch, and bw_peak.
* Fixed bug when setting default parameter values in bw_hs1_init().
* Limited actual prewarping frequency to prevent instability in bw_lp1.
* Fixed missing smoothing filter initialization in bw_noise_gate.
* Fixed missing forced coefficients' update in bw_noise_gate_reset_coeffs().
* Added bw_noise_gen_reset_coeffs(), bw_noise_gen_update_coeffs_ctrl(), and
bw_noise_gen_update_coeffs_audio().
* Improved and strengthened algorithm in bw_noise_gate.
* Now using backward Euler rather than impulse invariant method in
bw_one_pole.
* Added coeffs argument to bw_one_pole_state_is_valid().
* Changed implementation topology to use less memory in bw_osc_filt.
* Now antialiasing should work also with negative input increments in
bw_osc_pulse, bw_osc_saw, and bw_osc_tri.
* Clearly specified validity ranges for audio-rate signals in bw_osc_pulse,
bw_osc_saw, bw_osc_sin, and bw_osc_tri.
* Added bw_osc_saw_set_sample_rate(), bw_osc_saw_reset_coeffs(),
bw_osc_saw_update_coeffs_ctrl(), and bw_osc_saw_update_coeffs_audio().
* Now using parabolic curves instead of trigonometric ones in bw_pan.
* Fixed smoothing coefficients update in bw_phase_gen_reset_coeffs().
* Removed internal limits on cutoff frequency in bw_phaser.
* Added bw_pink_filt_reset_coeffs(), bw_pink_filt_update_coeffs_ctrl(), and
bw_pink_filt_update_coeffs_audio().
* Fixed type of coefficient in bw_pink_filt_process1().
* Enforced minimum output value -600.f in bw_ppm.
* bw_ringmod renamed as bw_ring_mod.
* Fixed inverted-polarity modulation (for real this time) in bw_ring_mod.
* Changed default value for gain compensation to off in bw_satur.
* Added bw_slew_lim_process1_none().
* Fixed setting of default parameter values in bw_slew_lim_init().
* Fixed documentation of bw_slew_lim_update_coeffs_audio().
* Added bw_sr_reduce_set_sample_rate(), bw_sr_reduce_reset_coeffs(),
bw_sr_reduce_update_coeffs_ctrl(), and bw_sr_reduce_update_coeffs_audio().
* Removed useless computation when upsampling in bw_src.
* Clarified when the same buffers cannot be used for both input and output in
bw_src and bw_src_int.
* Fixed frequency response and improved speed in bw_src_int.
* Changed model to get positive polarity at the bandpass output in bw_svf.
* Limited actual prewarping frequency to prevent instability in bw_svf.
* Adjusted examples accordingly to changes.
0.6.0
-----
* Added support and examples for Android and iOS.
* Added debugging definitions and related new functions in bw_common.
* Added debugging code to bw_buf, bw_math, bw_note_queue, bw_rand, and
bw_voice_alloc, and also partly to bw_one_pole.
* Removed bw_config module.
* Removed bw_omega_3log() and bw_omega_3lognr() from bw_math.
* bw_one_pole_process*() now use BW_SIZE_T to count samples and channels.
* bw_voice_alloc() now uses BW_SIZE_T to count voices.
* Fixed bugs in bw_pow10f_3() and bw_acoshf_3().
* Fixed bug when using very high cutoff values in bw_one_pole.
* Fixed bug when signal level is extremely low in bw_ppm.
* Fixed harmless compiler warning in bw_randu32().
* Fixed number of channels in fx_reverb.
* Fixed (unused) note velocity in synth_poly and synthpp_poly.
0.5.0
-----
* Added new bw_fuzz, bw_clip, bw_dist, bw_drive, bw_drywet, bw_reverb,
bw_note_queue, and bw_voice_alloc modules.
* Added new fx_fuzz, fx_clip, fx_dist, fx_drive, fx_reverb, synth_poly,
fx_lp1, fx_one_pole, and fx_slew_lim examples.
* Added C++ wrappers for all dsp modules and for bw_buf.
* Added new corresponding C++ examples for each C example.
* Added multichannel API to all dsp modules and to bw_buf.
* Added new bw_buf_neg() routine to bw_buf.
* Added new bw_gain_get_gain() function to bw_gain.
* Changed mem_req/set API in bw_delay, bw_comb, bw_chorus, bw_reverb.
* Turned gate parameter into a control-rate input in bw_env_gen.
* bw_balance_process() and bw_pan_process() do not accept NULL buffers
anymore.
* Made VST3 and web examples' common code stricter and more redundant w.r.t.
memory usage and finalization.
* Fixed bug in bw_svf_process() occurring when only y_hp was NULL.
* Fixed prewarping-related instability bug in bw_svf.
* Fixed inverted-polarity modulation in bw_ringmod.
* Fixed coefficients' reset in bw_phaser and bw_chorus.
* Fixed initial conditions in bw_satur.
* Fixed unused variable warnings in VST3 and Daisy Seed examples' common code.
* Fixed unused variable warnings in bw_slew_lim.
* Fixed left shift of negative value warnings in bw_math.
* Fixed typos in the documentaion of bw_peak, bw_comp, bw_osc_tri,
bw_ringmod, bw_balance, bw_slew_lim, and bw_common.
* Fixed code tags and heading levels in documentation of several modules.
* Fixed setting of default parameter values in synth_simple and synth_mono.
* Updated examples to use multichannel APIs where possible.
* Removed useless random state from synth_simple.
* Now forcing minimum attack and release times for VCAs of synth examples.
* Build system updated to emit as many compilation warnings as possible.
0.4.0
-----
* Added new bw_ringmod, bw_trem, bw_phaser, bw_delay, bw_src_int, bw_src,
bw_comb, and bw_chorus modules.
* Added new fx_ringmod, fx_trem, fx_phaser, fx_delay, fx_comb, fx_chorus,
fx_vibrato, and fx_flanger examples.
* Added MIDI over UART support for example synthesizers running on the Daisy
Seed platform.
* Added new bw_buf_add() and bw_buf_fill() routines to bw_buf.
* Added new bw_ceilf(), bw_intfracf(), bw_sinhf_3(), bw_coshf_3(),
bw_asinhf_3(), and bw_acoshf_3() math routines.
* Added BW_SIZE_T definition to bw_common.
* Added initial value parameters to bw_*_reset_state() in
bw_{lp1,ap1,hp1,hs1,ls1,mm1,ap2,hs2,ls2,mm2,notch,peak,svf}.
* Fixed typos in the documentation of bw_wah.
* Fixed unused parameter warnings.
* Now using bw_src_int in fx_satur.
0.3.0
-----
* Added new bw_ap1, bw_ap2, bw_balance, bw_bd_reduce, bw_buf, bw_comp, bw_hp1,
bw_hs1, bw_hs2, bw_lp1, bw_ls1, bw_ls2, bw_mm1, bw_mm2, bw_notch,
bw_noise_gate, bw_pan, bw_peak, bw_ppm, and bw_sr_reduce modules.
* Added new fx_ap1, fx_ap2, fx_balance, fx_bitcrush, fx_comp, fx_eq_3band,
fx_hp1, fx_hs1, fx_ls1, fx_mm1, fx_mm2, fx_noise_gate, fx_notch, fx_pan
examples.
* Added support and examples for the Daisy Seed platform.
* Strengthened bw_svf algorithm for modulation and added prewarp_at_cutoff
and prewarp_freq parameters.
* Changed bw_wah to be a bandpass and not a lowpass filter.
* Renamed bw_vol as bw_gain, added new smooth_tau parameter, and changed gain
parameter API to express values in linear gain an dB.
* Added new bw_log10f_3(), bw_pow10f_3(), bw_dB2linf_3(), and bw_lin2dBf_3()
math routines.
* Fixed computation bug in bw_sqrtf_2().
* Avoid a warning related to a potentially uninitialized variable in
bw_env_gen.
* Reworked example source code structure and Makefiles.
* Stopped using dynamic memory allocation for individual modules in example
code.
* Adjusted noise levels in synth_mono example.
* Added BW_RESTRICT to bw_svf_process1() arguments.
* Fixed bad defintion of bw_pink_filt_set_sample_rate_scaling().
* Now using bw_ppm in synth_mono and synth_simple examples.
* Moved header inclusions where most appropriate in bw_env_follow.
* Added missing API documentation in bw_pink_filt.
* Fixed typo in the documentation of bw_svf_set_Q().
* Fixed license headers in all source files.
0.2.0
-----
* Refactored API of DSP modules for better flexibility and performance.

View File

@ -6,22 +6,18 @@ You can find information and documentation [on the official web page](https://ww
## Subfolders
* examples: synth and an effect examples in VST3 and Web Audio formats;
* include: header files.
* `examples`: synth and an effect examples in VST3, LV2, Web Audio, Daisy Seed, Android app, iOS app, and command line program formats;
* `include`: header files.
## Legal
Copyright (C) 2021, 2022 Orastron Srl unipersonale.
Copyright (C) 2021-2025 Orastron Srl unipersonale.
Authors: Stefano D'Angelo, Paolo Marrone.
All the code in the repo is released under GPLv3. See the LICENSE file. Alternatively, we offer a commercial license that doesn't restrict usage with respect to time, projects, or developers involved. More details [on the official web page](https://www.orastron.com/brickworks#license-pricing).
All the code in the repo is released under GPLv3. See the `LICENSE` file. Alternatively, we offer a commercial license that doesn't restrict usage with respect to time, projects, or developers involved. More details [on the official web page](https://www.orastron.com/brickworks#license-pricing).
The file examples/common/vst3/plugin.cpp contains code from sse2neon (https://github.com/DLTcollab/sse2neon/), which was released under the MIT license. Details in said file.
The file include/bw\_math.h contains code derived from https://dangelo.audio/code/omega.h, which was released under the ISC license. Details in said file.
The file include/bw\_rand.h contains code from https://nullprogram.com/blog/2017/09/21/, which was released into the public domain by its author.
The `include/bw_rand.h` file contains code from https://nullprogram.com/blog/2017/09/21/, which was released into the public domain by its author.
VST is a registered trademark of Steinberg Media Technologies GmbH.

17
THANKS.md Normal file
View File

@ -0,0 +1,17 @@
We wish to thank and give credit to:
- the adopters of this software, of which at the moment we can publicly mention, in alphabetical order:
- [Elk Audio](https://www.elk.audio/);
- [Faselunare](http://faselunare.com/);
- Kevin Molcard for finding compilation warnings that needed fixing in Brickworks 1.0.0;
- users participating to [this thread on the KVR Audio forum](https://www.kvraudio.com/forum/viewtopic.php?f=33&t=589519) for providing useful feedback;
- [Mads Kjeldgaard](https://madskjeldgaard.dk/) for publishing [instructions to build for the Daisy Seed and uploading the firmware](https://madskjeldgaard.dk/posts/daisy-setup/);
- [Hereket](https://hereket.github.io/) for providing instructions on [how to build an Android app without Android Studio or Gradle](https://hereket.github.io/posts/android_from_command_line/);
- the authors of the following publications, which some algorithms in this software are based on:
- J. Dattorro, "Effect Design, Part 1: Reverberator and Other Filters", J. Audio Eng. Soc., vol. 45, no. 9, pp. 660-684, September 1997;
- J. Dattorro, "Effect Design, Part 2: Delay-Line Modulation and Chorus", J. Audio Eng. Soc., vol. 45, no. 10, pp. 764-788, October 1997;
- V. Valimaki and A. Huovilainen, "Antialiasing Oscillators in Subtractive Synthesis", IEEE Signal Processing Magazine, vol. 24, no. 2, pp. 116-125, March 2007;
- M. E. O'Neill, "PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation", September 2014, available at <https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf>;
- J. D. Parker, V. Zavalishin, and E. Le Bivic, "Reducing the Aliasing of Nonlinear Waveshaping Using Continuous-Time Convolution", Proc. 19th Intl. Conf. Digital Audio Effects (DAFx-16), pp. 137-144, Brno, Czech Republic, September 2016.
- C. Wellons, "Finding the Best 64-bit Simulation PRNG", September 2017, available at <https://nullprogram.com/blog/2017/09/21/>;
- M. Holters and J. D. Parker, "A Combined Model for a Bucket Brigade Device and its Input and Output Filters", 21st Intl. Conf. Digital Audio Effects (DAFx-18), Aveiro, Portugal, September 2018;
- P. P. La Pastina and S. D'Angelo, "Optimal Integer Order Approximation of Fractional Order Filters", Proc. 24th Intl. Conf. Digital Audio Effects (DAFx20in21), pp. 89-96, Vienna, Austria, September 2021.

26
TODO
View File

@ -1,26 +0,0 @@
code:
* blep etc in a module?
* osc post filter (and one pole init, slew rate, etc.) val from input? set state instead?
* audio rate optional pulse width/slope inputs?
* one pole process const input? (return also if const out)
* optimize triangle generation for constant pulse width
* API for buffer fill, scale, offset, zero, copy...?
* web examples construction/destruction
* web effect multichannel in?
* check const restrict etc.
* define BW_RESTRICT to __restrict or similar when the compiler supports it
* empty functions etc. to keep consistency and forward compatibility?
* float in [-1,1] for velocity, pitch bend, mod wheel
* should clip slope in triangle?
* fix vst3 mapped values (visible in Ableton Live) and short names
* bw_vol set volume in dB?
build system:
* make makefiles handle paths with spaces etc
* can run su on windows? (system-wide install)
* make autodependencies (.d?)
* make from... directories
* order-only prerequisites to avoid multiple make updates? (https://interrupt.memfault.com/blog/gnu-make-guidelines#order-only-prerequisites)
* clang + Ofast & bulk memory (maybe using old binaryen) - or implement memset etc.
* put common parts of Makefiles together somewhere/somehow (DRY)
* recursive make?

164
examples/README.md Normal file
View File

@ -0,0 +1,164 @@
# Examples
## Premise
Each of these examples consists of common and boilerplate code, which is not Brickworks-related, and a specific part which actually implements the audio engine. The common code is copied/generated by an external tool called [Tibia](https://git.orastron.com/orastron/tibia), which you first need to [run as outlined below](#tibia).
Each subfolder contains an example, except the `common` folder, which contains a good deal of common code and common Tibia-related metadata. In order to build an example, once Tibia has generated common and boilerplate code, you can just `cd` to <code>*example*/*platform*</code> and use the following platform-specific instructions. Building for any platform requires a recent enough version of [GNU Make](https://www.gnu.org/software/make/) installed.
## Tibia
### Prerequisites
You need [Node.js](https://nodejs.org/en) and [npm](https://www.npmjs.com/) to be installed.
### Usage
Get [Tibia 0.1.0](https://git.orastron.com/orastron/tibia/releases/tag/v0.1.0), extract the `tibia` folder and place it in the same parent directory as the Brickworks folder. Then either `cd` to the `tibia` folder and `npm install dot`, or install the [dot npm package](https://www.npmjs.com/package/dot) globally and make sure that the `NODE_PATH` environment variable is corretly set to find it.
Now you can `cd` to the `examples` folder and run `./tibia_gen.sh` to copy/generate files for all examples, or otherwise run `./tibia_gen.sh common` to only copy/generate files in `examples/common` or <code>./tibia\_gen.sh *example*</code> to do the same for files in <code>examples/*example*</code>.
If you want to remove all files copied/generated by Tibia, and thus restore the `examples` directory as it would appear in the official repository, run `./tibia_clean.sh` from the `examples` directory.
## VST3
### Prerequisites
Windows (via [MSYS2/Mingw-w64](https://www.msys2.org/)), macOS, and Linux OSes are supported. Building tested with [GCC](https://gcc.gnu.org/), probably also works with [Clang](https://clang.llvm.org/).
You also need to download or clone the [VST3 C API](https://github.com/steinbergmedia/vst3_c_api) and place it in the same parent folder as the Brickworks folder, or otherwise edit `common/src/vars-pre.mk` and change `CFLAGS_EXTRA` to point to the correct directory, or invoke `make` with appropriate `CFLAGS` straight from the command line.
### Build
In order to build just type `make`. You'll find the resulting VST3 directory in <code>build/bw\_example\_*example*.vst3</code>.
### Installation
If all went fine, you can install for the current user (i.e., into the user VST3 folder) by invoking `make install-user` or for all users (i.e., into the system VST3 folder) by `make install`.
## LV2
### Prerequisites
Windows (via [MSYS2/Mingw-w64](https://www.msys2.org/)), macOS, and Linux OSes are supported. Building tested with [GCC](https://gcc.gnu.org/), probably also works with [Clang](https://clang.llvm.org/).
You also need to download/install [LV2](https://lv2plug.in/), so that either header files are found by the compiler in its default include path, or otherwise you could add an appropriate `CFLAGS_EXTRA` value to `common/src/vars-pre.mk`, or invoke `make` with appropriate `CFLAGS` straight from the command line.
### Build
In order to build just type `make`. You'll find the resulting LV2 bundle in <code>build/bw\_example\_*example*.lv2</code>.
### Installation
If all went fine, you can install for the current user (i.e., into the user LV2 folder) by invoking `make install-user` or for all users (i.e., into the system LV2 folder) by `make install`.
## Web
### Prerequisites
You need [Clang](https://clang.llvm.org/) with WebAssembly target support and [OpenSSL](https://www.openssl.org/) installed.
### Build
In order to build just type `make`. You'll find the resulting output directory in `build/web`.
### Running
The output files need to be served over HTTPS. A self-signed certificate is generated in the output directory (hence the OpenSSL requirement) to make it possible to run an HTTPS-enabled web server, e.g. `http-server -S`, directly on/from the output folder.
## Daisy Seed
### Prerequisites
Building and firmware upload was only tested on Linux. You need [arm-none-eabi-gcc](https://developer.arm.com/Tools%20and%20Software/GNU%20Toolchain) (for building) and [dfu-util](https://dfu-util.sourceforge.net/) (for firmware upload) installed.
You also need to clone/download [libDaisy](https://github.com/electro-smith/libDaisy) (beware that since version 7.0.0 you also need to clone submodules, see the [release notes](https://github.com/electro-smith/libDaisy/releases/tag/v7.0.0)), `cd` to it, and run `make`. You should either place it in the same folder as the Brickworks folder, or otherwise edit `common/src/vars-pre.mk` and change `LIBDAISY_DIR` to point to the correct directory.
### Build
In order to build just type `make`. You'll find the resulting output files in `build`.
### Firmware upload
To upload the firmware:
1. branch the board to the uploading machine via USB;
2. put the board in DFU mode by pressing BOOT, then RESET, then letting go of RESET and then of BOOT;
3. type `make program-dfu`.
Effect examples report output parameter values and CPU usage statistics via USB serial. You can read the output by, e.g., `screen /dev/ttyACM0`.
## Android
### Prerequisites
Android examples are built without the help of Android Studio or Gradle. You'll however need to have a recent enough JDK (we need `javac`), as well as to download the latest stable:
- Android SDK (https://developer.android.com/studio/index.html) \*;
- Android NDK (https://developer.android.com/ndk/downloads) \*;
- `.jar`s and `.aar`s (and you'll also need to manually extract the inner `classes.jar` from each `xxx.aar`, which are just ZIP files, and rename `classes.jar` to `xxx.jar`) for:
- AndroidX Core (https://mvnrepository.com/artifact/androidx.core/core);
- AndroidX Lifecycle Common (https://mvnrepository.com/artifact/androidx.lifecycle/lifecycle-common)
- AndroidX VersionedParcelable (https://mvnrepository.com/artifact/androidx.versionedparcelable/versionedparcelable)
- Kotlin Stdlib (https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib);
- Koltin Coroutines Core (https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core);
- Koltin Coroutines Core JVM (https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-jvm);
- `miniaudio.h` library (http://miniaud.io/).
Then you'll probably also need to adjust paths and values in `common/src/vars-pre.mk`.
\* You can install both the needed parts of the Android SDK and the NDK by downloading the so-called "command line tools" (https://developer.android.com/studio#command-line-tools-only) and using the included `sdkmanager` program. In such case you need to install the following packages: "platforms;android-*latest*", "build-tools;*latest*", "platform-tools", and "ndk;*latest*".
### Build
In order to build just type `make`. You'll find the resulting `.apk` file in `build`.
### Installation
If all went fine, you can branch your device and install using `make install` or otherwise install manually.
### Usage
Effect examples process audio input signals, therefore they will require permission to use the capture device.
Synth examples use input MIDI and support hotplugging.
## iOS
### Prerequisites
iOS examples are not directly built by the supplied Makefiles. These rather generate the corresponding XCode projects and required files.
For this to work you need to have the latest [Xcode](https://developer.apple.com/xcode/) and [XcodeGen](https://github.com/yonaskolb/XcodeGen) installed, as well as a copy of the latest [`miniaudio.h`](http://miniaud.io/).
Finally, you might need to adjust header search path for miniaudio in `common/src/ios-make.json` and [run Tibia](#tibia).
### Build
Typing `make` will generate the required Xcode project in `build/gen`.
You'll need to open it and select a development team (click on the project root in the left side pane, then choose the "Signing & Capabilities" tab, and finally pick a "Team").
At this point you can build and run as with any other iOS app.
### Usage
Effect examples process audio input signals, therefore they will require permission to use the capture device.
Synth examples use input MIDI and support hotplugging.
## Command line program
### Prerequisites
Windows (via [MSYS2/Mingw-w64](https://www.msys2.org/)), macOS, and Linux OSes are supported. Building tested with [GCC](https://gcc.gnu.org/), probably also works with [Clang](https://clang.llvm.org/).
Depending on the specific example, you might need to download or clone [tinywav](https://github.com/mhroth/tinywav) and/or [midi-parser](https://github.com/abique/midi-parser) and place them in the same folder as the Brickworks folder, or otherwise edit `common/src/vars-pre.mk`
### Build
In order to build just type `make`. You'll find the resulting executable file in `build`.
### Usage
Just run the executable without arguments to get usage instructions.

View File

@ -1,7 +1,7 @@
/*
* Brickworks
*
* Copyright (C) 2021, 2022 Orastron Srl unipersonale
* Copyright (C) 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -13,17 +13,17 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#ifndef _WALLOC_H
#define _WALLOC_H
#include <stddef.h>
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);
#ifdef WASM
# define BW_CXX_NO_ARRAY
# define BW_NO_MATH_H
# define INFINITY (__builtin_inff())
#endif
#ifndef DEBUG
# define BW_NO_DEBUG
#endif

View File

@ -0,0 +1,7 @@
{
"company": {
"name": "Orastron",
"url": "https://www.orastron.com/",
"email": "info@orastron.com"
}
}

View File

@ -1,7 +1,7 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
* Copyright (C) 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -13,22 +13,29 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#ifndef _VST3_COMMON_H
#define _VST3_COMMON_H
#include <stddef.h>
#include "config.h"
#include "plugin_api.h"
#if defined(P_PITCH_BEND)
# define TAG_PITCH_BEND NUM_PARAMETERS
# if defined(P_MOD_WHEEL)
# define TAG_MOD_WHEEL (NUM_PARAMETERS + 1)
# endif
#elif defined(P_MOD_WHEEL)
# define TAG_MOD_WHEEL NUM_PARAMETERS
#ifdef __cplusplus
extern "C" {
#endif
typedef void * impl;
impl impl_new(void);
void impl_free(impl handle);
void impl_set_sample_rate(impl handle, float sample_rate);
void impl_reset(impl handle);
void impl_set_parameter(impl handle, size_t index, float value);
float impl_get_parameter(impl handle, size_t index);
void impl_process(impl handle, const float ** inputs, float ** outputs, size_t n_samples);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,65 @@
/*
* Brickworks
*
* Copyright (C) 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include "impl.h"
typedef struct plugin {
impl handle;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
instance->handle = impl_new();
}
static void plugin_fini(plugin *instance) {
impl_free(instance->handle);
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
impl_set_sample_rate(instance->handle, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
impl_reset(instance->handle);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
impl_set_parameter(instance->handle, index, value);
}
static float plugin_get_parameter(plugin *instance, size_t index) {
return impl_get_parameter(instance->handle, index);
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
impl_process(instance->handle, inputs, outputs, n_samples);
}

View File

@ -0,0 +1,43 @@
/*
* Brickworks
*
* Copyright (C) 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include <stddef.h>
#include <stdint.h>
#include "plugin_api.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef void * impl;
impl impl_new(void);
void impl_free(impl handle);
void impl_set_sample_rate(impl handle, float sample_rate);
void impl_reset(impl handle);
void impl_set_parameter(impl handle, size_t index, float value);
float impl_get_parameter(impl handle, size_t index);
void impl_process(impl handle, const float ** inputs, float ** outputs, size_t n_samples);
void impl_midi_msg_in(impl handle, size_t index, const uint8_t * data);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,69 @@
/*
* Brickworks
*
* Copyright (C) 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include "impl.h"
typedef struct plugin {
impl handle;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
instance->handle = impl_new();
}
static void plugin_fini(plugin *instance) {
impl_free(instance->handle);
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
impl_set_sample_rate(instance->handle, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
impl_reset(instance->handle);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
impl_set_parameter(instance->handle, index, value);
}
static float plugin_get_parameter(plugin *instance, size_t index) {
return impl_get_parameter(instance->handle, index);
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
impl_process(instance->handle, inputs, outputs, n_samples);
}
static void plugin_midi_msg_in(plugin *instance, size_t index, const uint8_t *data) {
impl_midi_msg_in(instance->handle, index, data);
}

View File

@ -0,0 +1,10 @@
{
"ios_make": {
"headerSearchPaths": [
"../../../../../../miniaudio",
"../../../../common/src",
"../../../../../include"
],
"deploymentTarget": 14.0
}
}

Binary file not shown.

View File

@ -0,0 +1,6 @@
{
"make": {
"mkincDir": "../../common/src",
"extra": "EXAMPLE_TYPE := cxx-fx"
}
}

View File

@ -0,0 +1,6 @@
{
"make": {
"mkincDir": "../../common/src",
"extra": "EXAMPLE_TYPE := cxx-synth"
}
}

View File

@ -0,0 +1,6 @@
{
"make": {
"mkincDir": "../../common/src",
"extra": "EXAMPLE_TYPE := c"
}
}

View File

@ -0,0 +1,3 @@
ifeq ($(TEMPLATE), web)
include $(COMMON_DIR)/../web/rules-extra-web-demo.mk
endif

View File

@ -0,0 +1,3 @@
ifeq ($(TEMPLATE), web)
include $(COMMON_DIR)/../web/vars-extra-web-demo.mk
endif

View File

@ -0,0 +1,76 @@
API_DIR := ../api
ifeq ($(EXAMPLE_TYPE), c)
PLUGIN_DIR := ../src
CFLAGS_EXTRA := -I../../../include -I../../common/src
endif
ifeq ($(EXAMPLE_TYPE), cxx-fx)
PLUGIN_DIR := ../../common/src/cxx-fx
CXX_SRCS_EXTRA := ../src/impl.cpp
CFLAGS_EXTRA := -I../../../include -I../../common/src -I../../common/src/cxx-fx
CXXFLAGS_EXTRA := -I../../../include -I../../common/src -I../../common/src/cxx-fx -std=c++11
endif
ifeq ($(EXAMPLE_TYPE), cxx-synth)
PLUGIN_DIR := ../../common/src/cxx-synth
CXX_SRCS_EXTRA := ../src/impl.cpp
CFLAGS_EXTRA := -I../../../include -I../../common/src -I../../common/src/cxx-synth
CXXFLAGS_EXTRA := -I../../../include -I../../common/src -I../../common/src/cxx-synth -std=c++11
endif
ifeq ($(TEMPLATE), cmd)
COMMON_DIR := ../../common/cmd
TINYWAV_DIR := ../../../../tinywav
MIDI_PARSER_DIR := ../../../../midi-parser
endif
ifeq ($(TEMPLATE), lv2)
COMMON_DIR := ../../common/lv2
endif
ifeq ($(TEMPLATE), vst3)
COMMON_DIR := ../../common/vst3
CFLAGS_EXTRA := $(CFLAGS_EXTRA) -I../../../../vst3_c_api
endif
ifeq ($(TEMPLATE), web)
COMMON_DIR := ../../common/web
CFLAGS_EXTRA := $(CFLAGS_EXTRA) -DWASM
CXXFLAGS_EXTRA := $(CXXFLAGS_EXTRA) -DWASM -std=c++11
endif
ifeq ($(TEMPLATE), daisy-seed)
COMMON_DIR := ../../common/daisy-seed
LIBDAISY_DIR := ../../../../libDaisy
endif
ifeq ($(TEMPLATE), ios)
COMMON_DIR := ../../common/ios
ifeq ($(EXAMPLE_TYPE), cxx-fx)
C_SRCS_EXTRA := ../../common/src/cxx-fx/impl.h
endif
ifeq ($(EXAMPLE_TYPE), cxx-synth)
C_SRCS_EXTRA := ../../common/src/cxx-synth/impl.h
endif
endif
ifeq ($(TEMPLATE), android)
COMMON_DIR := ../../common/android
CXXFLAGS_EXTRA := -I../../../include -I../../common/src -I../../../../miniaudio
KEY_STORE := ../../common/src/keystore.jks
KEY_ALIAS := androidkey
STORE_PASS := android
KEY_PASS := android
SDK_DIR := $(HOME)/Android/Sdk
ANDROIDX_DIR := $(HOME)/Android/androidx
KOTLIN_DIR := $(HOME)/Android/kotlin
NDK_VERSION := 28.0.13004108
BUILD_TOOLS_VERSION := 36.0.0
ANDROIDX_CORE_VERSION := 1.16.0
ANDROIDX_LIFECYCLE_COMMON_VERSION := 2.8.7
ANDROIDX_VERSIONEDPARCELABLE_VERSION := 1.2.1
KOTLIN_STDLIB_VERSION := 2.1.20
KOTLINX_COROUTINES_CORE_VERSION := 1.10.2
KOTLINX_COROUTINES_CORE_JVM_VERSION := 1.10.2
endif

View File

@ -1,114 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#include "controller.h"
#include "pluginterfaces/base/conststringtable.h"
#include "base/source/fstreamer.h"
#include "pluginterfaces/vst/ivstmidicontrollers.h"
#include "common.h"
tresult PLUGIN_API Controller::initialize(FUnknown *context) {
tresult r = EditController::initialize(context);
if (r != kResultTrue)
return r;
// add parameters
for (int i = 0; i < NUM_PARAMETERS; i++)
parameters.addParameter(
ConstStringTable::instance()->getString(config_parameters[i].name),
config_parameters[i].units ? ConstStringTable::instance()->getString(config_parameters[i].units) : nullptr,
config_parameters[i].steps,
config_parameters[i].defaultValueUnmapped,
(config_parameters[i].out ? ParameterInfo::kIsReadOnly | ParameterInfo::kIsHidden : ParameterInfo::kCanAutomate)
| (config_parameters[i].bypass ? ParameterInfo::kIsBypass : 0),
i,
0,
config_parameters[i].shortName ? ConstStringTable::instance()->getString(config_parameters[i].shortName) : nullptr
);
#ifdef P_PITCH_BEND
parameters.addParameter(
ConstStringTable::instance()->getString("MIDI Pitch Bend"),
nullptr,
0,
0.5f,
ParameterInfo::kCanAutomate,
TAG_PITCH_BEND,
0,
nullptr
);
#endif
#ifdef P_MOD_WHEEL
parameters.addParameter(
ConstStringTable::instance()->getString("MIDI Mod Wheel"),
nullptr,
0,
0.5f,
ParameterInfo::kCanAutomate,
TAG_MOD_WHEEL,
0,
nullptr
);
#endif
return kResultTrue;
}
tresult PLUGIN_API Controller::setComponentState(IBStream *state) {
if (!state)
return kResultFalse;
IBStreamer streamer(state, kLittleEndian);
float f;
for (int i = 0; i < NUM_PARAMETERS; i++) {
if (config_parameters[i].out)
continue;
if (streamer.readFloat(f) == false)
return kResultFalse;
setParamNormalized(i, f);
}
return kResultTrue;
}
#if defined(P_PITCH_BEND) || defined(P_MOD_WHEEL)
tresult PLUGIN_API Controller::getMidiControllerAssignment(int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id) {
if (busIndex != 0)
return kResultFalse;
#ifdef P_PITCH_BEND
if (midiControllerNumber == Vst::kPitchBend) {
id = TAG_PITCH_BEND;
return kResultTrue;
}
#endif
#ifdef P_MOD_WHEEL
if (midiControllerNumber == Vst::kCtrlModWheel) {
id = TAG_MOD_WHEEL;
return kResultTrue;
}
#endif
return kResultFalse;
}
#endif

View File

@ -1,57 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#ifndef _VST3_CONTROLLER_H
#define _VST3_CONTROLLER_H
#include "config.h"
#include "config_vst3.h"
#include "public.sdk/source/vst/vsteditcontroller.h"
using namespace Steinberg;
using namespace Steinberg::Vst;
#if defined(P_PITCH_BEND) || defined(P_MOD_WHEEL)
class Controller : EditController, IMidiMapping {
#else
class Controller : EditController {
#endif
public:
static FUnknown *createInstance(void *context) {
return (IEditController *) new Controller();
}
tresult PLUGIN_API initialize(FUnknown *context) SMTG_OVERRIDE;
tresult PLUGIN_API setComponentState(IBStream *state) SMTG_OVERRIDE;
#if defined(P_PITCH_BEND) || defined(P_MOD_WHEEL)
tresult PLUGIN_API getMidiControllerAssignment(int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id) SMTG_OVERRIDE;
OBJ_METHODS (Controller, EditController)
DEFINE_INTERFACES
DEF_INTERFACE (IMidiMapping)
END_DEFINE_INTERFACES (EditController)
REFCOUNT_METHODS (EditController)
#endif
private:
};
#endif

View File

@ -1,52 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#include "plugin.h"
#include "controller.h"
#include "pluginterfaces/vst/ivstaudioprocessor.h"
#include "pluginterfaces/vst/ivsteditcontroller.h"
#include "public.sdk/source/main/pluginfactory.h"
BEGIN_FACTORY_DEF(COMPANY_NAME, COMPANY_WEBSITE, COMPANY_MAILTO)
DEF_CLASS2(
INLINE_UID(PLUGIN_GUID_1, PLUGIN_GUID_2, PLUGIN_GUID_3, PLUGIN_GUID_4), // GUID
PClassInfo::kManyInstances, // cardinality
kVstAudioEffectClass, // VST component class
PLUGIN_NAME, // plugin name
Vst::kDistributable, // plugin and controller can work on different computers
PLUGIN_SUBCATEGORY, // VST subcategory
PLUGIN_VERSION, // plugin version
kVstVersionString, // VST version
Plugin::createInstance // instatiation function pointer
)
DEF_CLASS2(
INLINE_UID(CTRL_GUID_1, CTRL_GUID_2, CTRL_GUID_3, CTRL_GUID_4), // GUID
PClassInfo::kManyInstances, // cardinality
kVstComponentControllerClass, // VST component class
PLUGIN_NAME "Controller", // controller name
0, // unused
"", // unused
PLUGIN_VERSION, // plugin version
kVstVersionString, // VST version
Controller::createInstance // instatiation function pointer
)
END_FACTORY

View File

@ -1,381 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo, Paolo Marrone
*
* This file contains code from sse2neon (https://github.com/DLTcollab/sse2neon/),
* which is released under the following licensing conditions.
*
* sse2neon is freely redistributable under the MIT License.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "plugin.h"
#include "pluginterfaces/base/conststringtable.h"
#include "pluginterfaces/vst/ivstparameterchanges.h"
#include "pluginterfaces/vst/ivstevents.h"
#include "base/source/fstreamer.h"
#include "common.h"
#include <algorithm>
#if defined(__aarch64__)
/* Beginning of sse2neon code */
/* Denormals are zeros mode macros. */
#define _MM_DENORMALS_ZERO_MASK 0x0040
#define _MM_DENORMALS_ZERO_ON 0x0040
#define _MM_DENORMALS_ZERO_OFF 0x0000
#define _MM_GET_DENORMALS_ZERO_MODE _sse2neon_mm_get_denormals_zero_mode
#define _MM_SET_DENORMALS_ZERO_MODE _sse2neon_mm_set_denormals_zero_mode
/* Flush zero mode macros. */
#define _MM_FLUSH_ZERO_MASK 0x8000
#define _MM_FLUSH_ZERO_ON 0x8000
#define _MM_FLUSH_ZERO_OFF 0x0000
#define _MM_GET_FLUSH_ZERO_MODE _sse2neon_mm_get_flush_zero_mode
#define _MM_SET_FLUSH_ZERO_MODE _sse2neon_mm_set_flush_zero_mode
typedef struct {
uint16_t res0;
uint8_t res1 : 6;
uint8_t bit22 : 1;
uint8_t bit23 : 1;
uint8_t bit24 : 1;
uint8_t res2 : 7;
uint32_t res3;
} fpcr_bitfield;
static inline unsigned int _sse2neon_mm_get_denormals_zero_mode()
{
union {
fpcr_bitfield field;
uint64_t value;
} r;
__asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value));
return r.field.bit24 ? _MM_DENORMALS_ZERO_ON : _MM_DENORMALS_ZERO_OFF;
}
static inline void _sse2neon_mm_set_denormals_zero_mode(unsigned int flag)
{
union {
fpcr_bitfield field;
uint64_t value;
} r;
__asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value));
r.field.bit24 = (flag & _MM_DENORMALS_ZERO_MASK) == _MM_DENORMALS_ZERO_ON;
__asm__ __volatile__("msr FPCR, %0" ::"r"(r));
}
static inline unsigned int _sse2neon_mm_get_flush_zero_mode()
{
union {
fpcr_bitfield field;
uint64_t value;
} r;
__asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value));
return r.field.bit24 ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF;
}
static inline void _sse2neon_mm_set_flush_zero_mode(unsigned int flag)
{
union {
fpcr_bitfield field;
uint64_t value;
} r;
__asm__ __volatile__("mrs %0, FPCR" : "=r"(r.value));
r.field.bit24 = (flag & _MM_FLUSH_ZERO_MASK) == _MM_FLUSH_ZERO_ON;
__asm__ __volatile__("msr FPCR, %0" ::"r"(r));
}
/* End of sse2neon code */
#elif defined(__i386__) || defined(__x86_64__)
#include <xmmintrin.h>
#include <pmmintrin.h>
#else
#define NO_DAZ_FTZ
#endif
Plugin::Plugin() {
setControllerClass(FUID(CTRL_GUID_1, CTRL_GUID_2, CTRL_GUID_3, CTRL_GUID_4));
}
tresult PLUGIN_API Plugin::initialize(FUnknown *context) {
instance = P_NEW();
if (instance == nullptr)
return kResultFalse;
tresult r = AudioEffect::initialize(context);
if (r != kResultTrue) {
P_FREE(instance);
return r;
}
#ifdef P_NOTE_ON
addEventInput(ConstStringTable::instance()->getString("MIDI Input"));
#endif
// FIXME: vst3 sdk validator always seem to get kDefaultActive even in sdk plugins - it's probably broken, but let's check
#if NUM_BUSES_IN != 0
for (int i = 0; i < NUM_BUSES_IN; i++)
addAudioInput(
ConstStringTable::instance()->getString(config_buses_in[i].name),
config_buses_in[i].configs & IO_STEREO ? SpeakerArr::kStereo : SpeakerArr::kMono,
config_buses_in[i].aux ? kAux : kMain,
(config_buses_in[i].cv ? BusInfo::kIsControlVoltage : 0)
| (config_buses_in[i].aux ? 0 : BusInfo::kDefaultActive)
);
#endif
#if NUM_BUSES_OUT != 0
for (int i = 0; i < NUM_BUSES_OUT; i++)
addAudioOutput(
ConstStringTable::instance()->getString(config_buses_out[i].name),
config_buses_out[i].configs & IO_STEREO ? SpeakerArr::kStereo : SpeakerArr::kMono,
config_buses_out[i].aux ? kAux : kMain,
(config_buses_out[i].cv ? BusInfo::kIsControlVoltage : 0)
| (config_buses_out[i].aux ? 0 : BusInfo::kDefaultActive)
);
#endif
#if NUM_PARAMETERS != 0
for (int i = 0; i < NUM_PARAMETERS; i++) {
parameters[i] = config_parameters[i].defaultValueUnmapped;
P_SET_PARAMETER(instance, i, parameters[i]);
}
#endif
return kResultTrue;
}
tresult PLUGIN_API Plugin::terminate() {
P_FREE(instance);
return AudioEffect::terminate();
}
tresult PLUGIN_API Plugin::setActive(TBool state) {
if (state) {
P_SET_SAMPLE_RATE(instance, sampleRate);
P_RESET(instance);
}
return AudioEffect::setActive(state);
}
tresult PLUGIN_API Plugin::setupProcessing(ProcessSetup &setup) {
sampleRate = static_cast<float>(setup.sampleRate);
return AudioEffect::setupProcessing(setup);
}
tresult PLUGIN_API Plugin::process(ProcessData &data) {
if (data.numInputs != NUM_BUSES_IN || data.numOutputs != NUM_BUSES_OUT)
return kResultFalse;
#if NUM_PARAMETERS != 0
if (data.inputParameterChanges) {
int32 n = data.inputParameterChanges->getParameterCount();
for (int32 i = 0; i < n; i++) {
IParamValueQueue *q = data.inputParameterChanges->getParameterData(i);
if (!q)
continue;
ParamValue v;
int32 o;
if (q->getPoint(q->getPointCount() - 1, o, v) == kResultTrue) {
int32 pi = q->getParameterId();
switch (pi) {
#ifdef P_PITCH_BEND
case TAG_PITCH_BEND:
P_PITCH_BEND(instance, static_cast<int>(16383.f * std::min(std::max(static_cast<float>(v), 0.f), 1.f)));
break;
#endif
#ifdef P_MOD_WHEEL
case TAG_MOD_WHEEL:
P_MOD_WHEEL(instance, static_cast<char>(127.f * std::min(std::max(static_cast<float>(v), 0.f), 1.f)));
break;
#endif
default:
parameters[pi] = v;
P_SET_PARAMETER(instance, pi, std::min(std::max(static_cast<float>(v), 0.f), 1.f));
break;
}
}
}
}
#endif
#ifdef P_NOTE_ON
if (data.inputEvents) {
int32 n = data.inputEvents->getEventCount();
for (int i = 0; i < n; i++) {
Event e;
if (data.inputEvents->getEvent(i, e) != kResultOk)
continue;
switch (e.type) {
case Event::kNoteOnEvent:
P_NOTE_ON(instance, e.noteOn.pitch, 127.f * e.noteOn.velocity);
break;
case Event::kNoteOffEvent:
P_NOTE_OFF(instance, e.noteOff.pitch);
break;
}
}
}
#endif
#if NUM_BUSES_IN != 0
int ki = 0;
for (int i = 0; i < data.numInputs; i++)
for (int j = 0; j < data.inputs[i].numChannels; j++, ki++)
inputs[ki] = (const float *)data.inputs[i].channelBuffers32[j];
#endif
#if NUM_BUSES_OUT != 0
int ko = 0;
for (int i = 0; i < data.numOutputs; i++)
for (int j = 0; j < data.outputs[i].numChannels; j++, ko++)
outputs[ko] = data.outputs[i].channelBuffers32[j];
#endif
const unsigned int flush_zero_mode = _MM_GET_FLUSH_ZERO_MODE();
const unsigned int denormals_zero_mode = _MM_GET_DENORMALS_ZERO_MODE();
#ifndef NO_DAZ_FTZ
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
#endif
#if NUM_BUSES_IN == 0
const float **inputs = nullptr;
#endif
#if NUM_BUSES_OUT == 0
float **outputs = nullptr;
#endif
P_PROCESS(instance, inputs, outputs, data.numSamples);
#ifndef NO_DAZ_FTZ
_MM_SET_FLUSH_ZERO_MODE(flush_zero_mode);
_MM_SET_DENORMALS_ZERO_MODE(denormals_zero_mode);
#endif
#if NUM_PARAMETERS != 0
for (int i = 0; i < NUM_PARAMETERS; i++) {
if (!config_parameters[i].out)
continue;
float v = P_GET_PARAMETER(instance, i);
if (parameters[i] == v)
continue;
parameters[i] = v;
if (data.outputParameterChanges) {
int32 index;
IParamValueQueue* paramQueue = data.outputParameterChanges->addParameterData(i, index);
if (paramQueue)
paramQueue->addPoint(0, v, index);
}
}
#endif
return kResultTrue;
}
tresult PLUGIN_API Plugin::setBusArrangements(SpeakerArrangement *inputs, int32 numIns, SpeakerArrangement *outputs, int32 numOuts) {
if (numIns != NUM_BUSES_IN || numOuts != NUM_BUSES_OUT)
return kResultFalse;
#if NUM_BUSES_IN != 0
for (int32 i = 0; i < numIns; i++)
if ((config_buses_in[i].configs == IO_MONO && inputs[i] != SpeakerArr::kMono)
|| (config_buses_in[i].configs == IO_STEREO && inputs[i] != SpeakerArr::kStereo))
return kResultFalse;
#endif
#if NUM_BUSES_OUT != 0
for (int32 i = 0; i < numOuts; i++)
if ((config_buses_out[i].configs == IO_MONO && outputs[i] != SpeakerArr::kMono)
|| (config_buses_out[i].configs == IO_STEREO && outputs[i] != SpeakerArr::kStereo))
return kResultFalse;
#endif
return kResultTrue;
}
tresult PLUGIN_API Plugin::setState(IBStream *state) {
if (!state)
return kResultFalse;
#if NUM_PARAMETERS != 0
IBStreamer streamer(state, kLittleEndian);
float f;
for (int i = 0; i < NUM_PARAMETERS; i++) {
if (config_parameters[i].out)
continue;
if (streamer.readFloat(f) == false)
return kResultFalse;
parameters[i] = f;
P_SET_PARAMETER(instance, i, f);
}
#endif
return kResultTrue;
}
tresult PLUGIN_API Plugin::getState(IBStream *state) {
#if NUM_PARAMETERS != 0
IBStreamer streamer(state, kLittleEndian);
for (int i = 0; i < NUM_PARAMETERS; i++)
if (!config_parameters[i].out)
streamer.writeFloat(parameters[i]);
#endif
return kResultTrue;
}

View File

@ -1,64 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#ifndef _VST3_PLUGIN_H
#define _VST3_PLUGIN_H
#include "config.h"
#include "config_vst3.h"
#include "public.sdk/source/vst/vstaudioeffect.h"
using namespace Steinberg;
using namespace Steinberg::Vst;
class Plugin : AudioEffect {
public:
Plugin();
static FUnknown *createInstance(void *context) {
return (IAudioProcessor *) new Plugin();
}
tresult PLUGIN_API initialize(FUnknown *context) SMTG_OVERRIDE;
tresult PLUGIN_API terminate() SMTG_OVERRIDE;
tresult PLUGIN_API setActive(TBool state) SMTG_OVERRIDE;
tresult PLUGIN_API setupProcessing(ProcessSetup &setup) SMTG_OVERRIDE;
tresult PLUGIN_API process(ProcessData &data) SMTG_OVERRIDE;
tresult PLUGIN_API setBusArrangements(SpeakerArrangement *inputs, int32 numIns, SpeakerArrangement *outputs, int32 numOuts) SMTG_OVERRIDE;
tresult PLUGIN_API setState(IBStream *state) SMTG_OVERRIDE;
tresult PLUGIN_API getState(IBStream *state) SMTG_OVERRIDE;
private:
float sampleRate;
#if NUM_PARAMETERS != 0
float parameters[NUM_PARAMETERS];
#endif
P_TYPE instance;
#if NUM_BUSES_IN != 0
const float *inputs[NUM_CHANNELS_IN];
#endif
#if NUM_BUSES_OUT != 0
float *outputs[NUM_CHANNELS_OUT];
#endif
};
#endif

View File

@ -1,25 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#ifndef _BW_CONFIG_H
#define _BW_CONFIG_H
#define INFINITY (__builtin_inff())
#endif

View File

@ -1,147 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
class BWExample extends AudioWorkletProcessor {
constructor(options) {
super();
var module = new WebAssembly.Module(options.processorOptions.wasmBytes);
var instance = new WebAssembly.Instance(module, { env: {} });
this.module = instance.exports;
this.instance = this.module.wrapper_new(sampleRate);
if (!this.instance)
// TODO: what to do if this is the case?
throw "Could not instantiate";
function getBuffers(p, output) {
var ret = [];
for (var i = 0; i < buses.length; i++) {
if ((!output && buses[i].output) || (output && !buses[i].output))
continue;
var b = [ new Float32Array(this.module.memory.buffer, p, 128) ];
p += 128 * 4;
if (buses[i].stereo) {
b.push(new Float32Array(this.module.memory.buffer, p, 128));
p += 128 * 4;
}
ret.push(b);
}
return ret;
}
this.ins = getBuffers.call(this, this.module.wrapper_get_ins(this.instance), false);
this.outs = getBuffers.call(this, this.module.wrapper_get_outs(this.instance), true);
if (parameters.length) {
this.paramValues = new Float32Array(this.module.memory.buffer, this.module.wrapper_get_param_values(this.instance), parameters.length);
this.paramValuesPrev = new Float32Array(this.paramValues);
} else {
this.paramValues = [];
this.paramValuesPrev = [];
}
var self = this;
this.port.onmessage = function (e) {
switch (e.data.type) {
case "noteOn":
self.module.wrapper_note_on(self.instance, e.data.note, e.data.velocity);
break;
case "noteOff":
self.module.wrapper_note_off(self.instance, e.data.note);
break;
case "pitchBend":
self.module.wrapper_pitch_bend(self.instance, e.data.pitchBend);
break;
case "modWheel":
self.module.wrapper_mod_wheel(self.instance, e.data.modWheel);
break;
}
};
}
// TODO: "destructor"
process(inputs, outputs, params) {
for (var i = 0; i < parameters.length; i++) {
if (parameters[i].output)
continue;
var n = parameters[i].name;
var v = params[n][0];
if (v != this.paramValues[n]) {
this.module.wrapper_set_parameter(this.instance, i, v);
this.paramValues[n] = v;
}
}
//mmm...
var n = outputs[0][0].length;
var i = 0;
while (i < n) {
var s = Math.min(n - i, 128);
for (var j = 0; j < this.ins.length; j++) {
var input = inputs[j];
if (!input.length) {
for (var k = 0; k < this.ins[j].length; k++)
this.ins[j][k].fill(0);
} else {
if (this.ins[j].length != input.length)
throw "input " + j + " has " + this.ins[j].length + " channels, not " + input.length;
for (var k = 0; k < this.ins[j].length; k++)
for (var l = 0; l < s; l++)
this.ins[j][k][l] = input[k][i + l];
}
}
this.module.wrapper_process(this.instance, s);
for (var j = 0; j < this.outs.length; j++) {
var output = outputs[j];
for (var k = 0; k < output.length; k++)
for (var l = 0; l < s; l++)
output[k][i + l] = this.outs[j][k][l];
}
i += s;
}
for (var i = 0; i < parameters.length; i++) {
if (!parameters[i].output)
continue;
if (this.paramValuesPrev[i] != this.paramValues[i])
this.port.postMessage({ index: i, value: this.paramValues[i] });
}
this.paramValuesPrev.set(this.paramValues);
return true;
}
static get parameterDescriptors() {
var ret = [];
for (var i = 0; i < parameters.length; i++) {
var p = parameters[i];
if (p.output)
continue;
ret.push({ name: p.name, minValue: 0.0, maxValue: 1.0, defaultValue: p.defaultValue, automationRate: "k-rate" });
}
return ret;
}
}
registerProcessor("BWExample", BWExample);

View File

@ -1,142 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2021, 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File author: Stefano D'Angelo
*/
#include <stdint.h>
#include "walloc.h"
extern unsigned char __heap_base;
typedef struct _header {
struct _header *next;
struct _header *prev;
char free;
} header;
static char inited = 0;
static size_t get_size(header *h) {
char *n = (char *)h->next;
return (n ? n : (char *)(__builtin_wasm_memory_size(0) << 16)) - (char *)h - sizeof(header);
}
static void split_if_possible(header *h, size_t s, size_t size) {
if (s <= size + sizeof(header) + sizeof(header))
return;
header *hn = (header *)((char *)h + sizeof(header) + size);
hn->prev = h;
hn->next = h->next;
hn->free = 1;
h->next = hn;
if (hn->next)
hn->next->prev = hn;
}
void *malloc(size_t size) {
if (size == 0)
return NULL;
header *h = (header *)&__heap_base;
if (!inited) {
h->next = NULL;
h->prev = NULL;
h->free = 1;
inited = 1;
}
header *p;
for (; h; p = h, h = h->next) {
if (!h->free)
continue;
size_t s = get_size(h);
if (s < size)
continue;
split_if_possible(h, s, size);
h->free = 0;
return (char *)h + sizeof(header);
}
int32_t n = __builtin_wasm_memory_grow(0, ((size + sizeof(header) - 1) >> 16) + 1);
if (n < 0)
return NULL;
if (p->free)
h = p;
else {
h = (header *)(n << 16);
p->next = h;
h->prev = p;
h->next = NULL;
}
split_if_possible(h, get_size(h), size);
h->free = 0;
return (char *)h + sizeof(header);
}
void *realloc(void *ptr, size_t size) {
if (ptr == NULL)
return malloc(size);
if (size == 0) {
free(ptr);
return NULL;
}
header *h = (header *)((char *)ptr - sizeof(header));
size_t s = get_size(h);
if (s >= size)
return ptr;
void *p = malloc(size);
if (p == NULL)
return NULL;
char *src = (char *)ptr;
char *dest = (char *)p;
for (size_t i = 0; i < s; i++)
dest[i] = src[i];
free(ptr);
return p;
}
void free(void *ptr) {
header *h = (header *)((char *)ptr - sizeof(header));
h->free = 1;
if (h->next && h->next->free) {
h->next = h->next->next;
if (h->next)
h->next->prev = h;
}
if (h->prev && h->prev->free) {
h->prev->next = h->next;
if (h->next)
h->next->prev = h->prev;
}
}

View File

@ -1,165 +0,0 @@
/*
* Brickworks
*
* Copyright (C) 2022 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
*
* File authors: Stefano D'Angelo
*/
#include "config.h"
#include "walloc.h"
struct _wrapper {
P_TYPE instance;
// wasting a little bit of memory if buses are mono, but let's KISS
#if NUM_BUSES_IN != 0
float ins[NUM_BUSES_IN * 2 * 128];
const float *x[NUM_BUSES_IN * 2];
#endif
#if NUM_BUSES_OUT != 0
float outs[NUM_BUSES_OUT * 2 * 128];
float *y[NUM_BUSES_OUT * 2];
#endif
#if NUM_PARAMETERS != 0
float param_values[NUM_PARAMETERS];
#endif
};
typedef struct _wrapper *wrapper;
void wrapper_set_parameter(wrapper w, int index, float value);
wrapper wrapper_new(float sample_rate) {
wrapper ret = malloc(sizeof(struct _wrapper));
if (ret == NULL)
return NULL;
ret->instance = P_NEW();
if (ret->instance == NULL) {
free(ret);
return NULL;
}
#if NUM_BUSES_IN != 0
int dx = 0;
for (int i = 0; i < NUM_BUSES_IN; i++) {
ret->x[i] = ret->ins + dx;
dx += 128;
if (config_buses_in[i].configs & IO_STEREO) {
ret->x[i] = ret->ins + dx;
dx += 128;
}
}
#endif
#if NUM_BUSES_OUT != 0
int dy = 0;
for (int i = 0; i < NUM_BUSES_OUT; i++) {
ret->y[i] = ret->outs + dy;
dy += 128;
if (config_buses_out[i].configs & IO_STEREO) {
ret->y[i] = ret->outs + dy;
dy += 128;
}
}
#endif
#if NUM_PARAMETERS != 0
for (int i = 0; i < NUM_PARAMETERS; i++)
wrapper_set_parameter(ret, i, config_parameters[i].defaultValueUnmapped);
#endif
P_SET_SAMPLE_RATE(ret->instance, sample_rate);
P_RESET(ret->instance);
return ret;
}
void wrapper_free(wrapper w) {
P_FREE(w->instance);
free(w);
}
float *wrapper_get_ins(wrapper w) {
#if NUM_BUSES_IN != 0
return w->ins;
#else
return NULL;
#endif
}
float *wrapper_get_outs(wrapper w) {
#if NUM_BUSES_OUT != 0
return w->outs;
#else
return NULL;
#endif
}
float *wrapper_get_param_values(wrapper w) {
#if NUM_PARAMETERS != 0
return w->param_values;
#else
return NULL;
#endif
}
void wrapper_process(wrapper w, int n_samples) {
#if NUM_BUSES_IN != 0
const float **x = w->x;
#else
const float **x = NULL;
#endif
#if NUM_BUSES_OUT != 0
float **y = w->y;
#else
float **y = NULL;
#endif
P_PROCESS(w->instance, x, y, n_samples);
#if NUM_PARAMETERS != 0
for (int i = 0; i < NUM_PARAMETERS; i++)
w->param_values[i] = P_GET_PARAMETER(w->instance, i);
#endif
}
void wrapper_set_parameter(wrapper w, int index, float value) {
#if NUM_PARAMETERS != 0
P_SET_PARAMETER(w->instance, index, value);
w->param_values[index] = value;
#endif
}
void wrapper_note_on(wrapper w, int note, int velocity) {
#ifdef P_NOTE_ON
P_NOTE_ON(w->instance, note, velocity);
#endif
}
void wrapper_note_off(wrapper w, int note) {
#ifdef P_NOTE_OFF
P_NOTE_OFF(w->instance, note);
#endif
}
void wrapper_pitch_bend(wrapper w, int bend) {
#ifdef P_PITCH_BEND
P_PITCH_BEND(w->instance, bend);
#endif
}
void wrapper_mod_wheel(wrapper w, int wheel) {
#ifdef P_MOD_WHEEL
P_MOD_WHEEL(w->instance, wheel);
#endif
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_ap1"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_ap1"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_ap1",
"types": [ "@lv2:AllpassPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,70 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_ap1.h>
typedef struct plugin {
bw_ap1_coeffs ap1_coeffs;
bw_ap1_state ap1_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_ap1_init(&instance->ap1_coeffs);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_ap1_set_sample_rate(&instance->ap1_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_ap1_reset_coeffs(&instance->ap1_coeffs);
bw_ap1_reset_state(&instance->ap1_coeffs, &instance->ap1_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
(void)index;
bw_ap1_set_cutoff(&instance->ap1_coeffs, value);
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_ap1_process(&instance->ap1_coeffs, &instance->ap1_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,37 @@
{
"product": {
"name": "Brickworks 1st-order allpass example",
"bundleName": "bw_example_fx_ap1",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Cutoff",
"shortName": "Cutoff",
"id" : "cutoff",
"direction": "input",
"defaultValue": 1000.0,
"minimum": 20.0,
"maximum": 20000.0,
"unit": "hz",
"map": "logarithmic"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "483913deb69e46f985403d9a0bd0c472"
},
"controller": {
"cid": "ef95c4fcae0c4f2eac45878df032c511"
},
"subCategory": "Fx|Filter"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_ap2"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_ap2"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_ap2",
"types": [ "@lv2:AllpassPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,76 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_ap2.h>
typedef struct plugin {
bw_ap2_coeffs ap2_coeffs;
bw_ap2_state ap2_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_ap2_init(&instance->ap2_coeffs);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_ap2_set_sample_rate(&instance->ap2_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_ap2_reset_coeffs(&instance->ap2_coeffs);
bw_ap2_reset_state(&instance->ap2_coeffs, &instance->ap2_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_cutoff:
bw_ap2_set_cutoff(&instance->ap2_coeffs, value);
break;
case plugin_parameter_q:
bw_ap2_set_Q(&instance->ap2_coeffs, value);
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_ap2_process(&instance->ap2_coeffs, &instance->ap2_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,47 @@
{
"product": {
"name": "Brickworks 2nd-order allpass example",
"bundleName": "bw_example_fx_ap2",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Cutoff",
"shortName": "Cutoff",
"id": "cutoff",
"direction": "input",
"defaultValue": 1000.0,
"minimum": 20.0,
"maximum": 20000.0,
"unit": "hz",
"map": "logarithmic"
},
{
"name": "Q",
"shortName": "Q",
"id": "q",
"direction": "input",
"defaultValue": 0.5,
"minimum": 0.5,
"maximum": 10.0,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "89a2e5db96114130a2b45d1ca20b4d92"
},
"controller": {
"cid": "36c5c2701b434536aa35b720b9e9ce47"
},
"subCategory": "Fx|Filter"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_balance"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 22, 23 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_balance"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_balance",
"types": [ "@lv2:SpatialPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,86 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_balance.h>
#include <bw_ppm.h>
typedef struct plugin {
bw_balance_coeffs balance_coeffs;
bw_ppm_coeffs ppm_coeffs;
bw_ppm_state ppm_l_state;
bw_ppm_state ppm_r_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_balance_init(&instance->balance_coeffs);
bw_ppm_init(&instance->ppm_coeffs);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_balance_set_sample_rate(&instance->balance_coeffs, sample_rate);
bw_ppm_set_sample_rate(&instance->ppm_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_balance_reset_coeffs(&instance->balance_coeffs);
bw_ppm_reset_coeffs(&instance->ppm_coeffs);
bw_ppm_reset_state(&instance->ppm_coeffs, &instance->ppm_l_state, 0.f);
bw_ppm_reset_state(&instance->ppm_coeffs, &instance->ppm_r_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
(void)index;
bw_balance_set_balance(&instance->balance_coeffs, 0.01f * value);
}
static float plugin_get_parameter(plugin *instance, size_t index) {
float v = 0.f;
switch (index) {
case plugin_parameter_l_level:
v = bw_ppm_get_y_z1(&instance->ppm_l_state);
break;
case plugin_parameter_r_level:
v = bw_ppm_get_y_z1(&instance->ppm_r_state);
break;
}
return bw_clipf(v, -60.f, 0.f);
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_balance_process(&instance->balance_coeffs, inputs[0], inputs[1], outputs[0], outputs[1], n_samples);
bw_ppm_state *ppm_states[2] = { &instance->ppm_l_state, &instance->ppm_r_state };
bw_ppm_process_multi(&instance->ppm_coeffs, ppm_states, (const float **)outputs, NULL, 2, n_samples);
}

View File

@ -0,0 +1,59 @@
{
"product": {
"name": "Brickworks stereo balance example",
"bundleName": "bw_example_fx_balance",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "stereo",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "stereo",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Balance",
"shortName": "Balance",
"id": "balance",
"direction": "input",
"defaultValue": 0.0,
"minimum": -100.0,
"maximum": 100.0,
"unit": "pc",
"map": "linear"
},
{
"name": "Left level",
"shortName": "L level",
"id": "l_level",
"direction": "output",
"defaultValue": -60.0,
"minimum": -60.0,
"maximum": 0.0,
"unit": "db",
"map": "linear"
},
{
"name": "Right level",
"shortName": "R level",
"id": "r_level",
"direction": "output",
"defaultValue": -60.0,
"minimum": -60.0,
"maximum": 0.0,
"unit": "db",
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "00cbb2d431da48b2bc5dec424d135847"
},
"controller": {
"cid": "4ad012b1b12f4c1b995cac1167dadc90"
},
"subCategory": "Fx|Spatial"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_bitcrush"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16, 22 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_bitcrush"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_bitcrush",
"types": [ "@lv2:DistortionPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,86 @@
/*
* Brickworks
*
* Copyright (C) 2022-2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_sr_reduce.h>
#include <bw_bd_reduce.h>
typedef struct plugin {
bw_sr_reduce_coeffs sr_reduce_coeffs;
bw_sr_reduce_state sr_reduce_state;
bw_bd_reduce_coeffs bd_reduce_coeffs;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_sr_reduce_init(&instance->sr_reduce_coeffs);
bw_bd_reduce_init(&instance->bd_reduce_coeffs);
bw_bd_reduce_set_silence_dc(&instance->bd_reduce_coeffs, 0);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_sr_reduce_set_sample_rate(&instance->sr_reduce_coeffs, sample_rate);
bw_bd_reduce_set_sample_rate(&instance->bd_reduce_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_sr_reduce_reset_coeffs(&instance->sr_reduce_coeffs);
bw_sr_reduce_reset_state(&instance->sr_reduce_coeffs, &instance->sr_reduce_state, 0.f);
bw_bd_reduce_reset_coeffs(&instance->bd_reduce_coeffs);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_sr_ratio:
bw_sr_reduce_set_ratio(&instance->sr_reduce_coeffs, 0.01f * value);
break;
case plugin_parameter_bit_depth:
bw_bd_reduce_set_bit_depth(&instance->bd_reduce_coeffs, (char)value);
break;
case plugin_parameter_gate:
bw_bd_reduce_set_gate_lin(&instance->bd_reduce_coeffs, value);
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_sr_reduce_process(&instance->sr_reduce_coeffs, &instance->sr_reduce_state, inputs[0], outputs[0], n_samples);
bw_bd_reduce_process(&instance->bd_reduce_coeffs, outputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,59 @@
{
"product": {
"name": "Brickworks bitcrusher example",
"bundleName": "bw_example_fx_bitcrush",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Sample rate ratio",
"shortName": "SR ratio",
"id": "sr_ratio",
"direction": "input",
"defaultValue": 100.0,
"minimum": 1.0,
"maximum": 100.0,
"unit": "pc",
"map": "logarithmic"
},
{
"name": "Bit depth",
"shortName": "Bit depth",
"id": "bit_depth",
"direction": "input",
"defaultValue": 16.0,
"minimum": 1.0,
"maximum": 16.0,
"integer": true,
"map": "linear"
},
{
"name": "Gate",
"shortName": "Gate",
"id": "gate",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 1.0,
"optional": true,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "2f4ddf20e28446b7807a61a2a9530316"
},
"controller": {
"cid": "171dc1cfa853455796b6abe2d539e9f9"
},
"subCategory": "Fx|Distortion"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_cab"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16, 17 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_cab"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_cab",
"types": [ "@lv2:SimulatorPlugin", "@lv2:FilterPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,79 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_cab.h>
typedef struct plugin {
bw_cab_coeffs cab_coeffs;
bw_cab_state cab_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_cab_init(&instance->cab_coeffs);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_cab_set_sample_rate(&instance->cab_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_cab_reset_coeffs(&instance->cab_coeffs);
bw_cab_reset_state(&instance->cab_coeffs, &instance->cab_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_cutoff_low:
bw_cab_set_cutoff_low(&instance->cab_coeffs, 0.01f * value);
break;
case plugin_parameter_cutoff_high:
bw_cab_set_cutoff_high(&instance->cab_coeffs, 0.01f * value);
break;
case plugin_parameter_tone:
bw_cab_set_tone(&instance->cab_coeffs, 0.01f * value);
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_cab_process(&instance->cab_coeffs, &instance->cab_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,59 @@
{
"product": {
"name": "Brickworks cab simulator example",
"bundleName": "bw_example_fx_cab",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Cutoff low",
"shortName": "Cutoff low",
"id": "cutoff_low",
"direction": "input",
"defaultValue": 50.0,
"minimum": 0.0,
"maximum": 100.0,
"unit": "pc",
"map": "linear"
},
{
"name": "Cutoff high",
"shortName": "Cutoff high",
"id": "cutoff_high",
"direction": "input",
"defaultValue": 50.0,
"minimum": 0.0,
"maximum": 100.0,
"unit": "pc",
"map": "linear"
},
{
"name": "Tone",
"shortName": "Tone",
"id": "tone",
"direction": "input",
"defaultValue": 50.0,
"minimum": 0.0,
"maximum": 100.0,
"unit": "pc",
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "cf0dbf103bd64d69b10cbd1bfddb51dc"
},
"controller": {
"cid": "a54d87f2bddd4e94ad1a69537ee468a0"
},
"subCategory": "Fx|Filter"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_chorus"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16, 17 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_chorus"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_chorus",
"types": [ "@lv2:ChorusPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,87 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_chorus.h>
typedef struct plugin {
bw_chorus_coeffs chorus_coeffs;
bw_chorus_state chorus_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_chorus_init(&instance->chorus_coeffs, 0.01f);
bw_chorus_set_delay(&instance->chorus_coeffs, 0.005f);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_chorus_set_sample_rate(&instance->chorus_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
return bw_chorus_mem_req(&instance->chorus_coeffs);
}
static void plugin_mem_set(plugin *instance, void *mem) {
bw_chorus_mem_set(&instance->chorus_coeffs, &instance->chorus_state, mem);
}
static void plugin_reset(plugin *instance) {
bw_chorus_reset_coeffs(&instance->chorus_coeffs);
bw_chorus_reset_state(&instance->chorus_coeffs, &instance->chorus_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_rate:
bw_chorus_set_rate(&instance->chorus_coeffs, value);
break;
case plugin_parameter_depth:
bw_chorus_set_amount(&instance->chorus_coeffs, (0.01f * 0.004f) * value);
break;
case plugin_parameter_type:
// values taken from Dattorro's paper
if (value < 1.5f) { // "Industry standard chorus"
bw_chorus_set_coeff_x(&instance->chorus_coeffs, 1.f);
bw_chorus_set_coeff_mod(&instance->chorus_coeffs, 0.7071f);
bw_chorus_set_coeff_fb(&instance->chorus_coeffs, 0.f);
} else { // "White chorus"
bw_chorus_set_coeff_x(&instance->chorus_coeffs, 0.7071f);
bw_chorus_set_coeff_mod(&instance->chorus_coeffs, 1.f);
bw_chorus_set_coeff_fb(&instance->chorus_coeffs, -0.7071f);
}
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_chorus_process(&instance->chorus_coeffs, &instance->chorus_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,64 @@
{
"product": {
"name": "Brickworks chorus example",
"bundleName": "bw_example_fx_chorus",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Rate",
"shortName": "Rate",
"id": "rate",
"direction": "input",
"defaultValue": 1.0,
"minimum": 0.01,
"maximum": 20.0,
"unit": "hz",
"map": "logarithmic"
},
{
"name": "Depth",
"shortName": "Depth",
"id": "depth",
"direction": "input",
"defaultValue": 50.0,
"minimum": 0.0,
"maximum": 100.0,
"unit": "pc",
"map": "linear"
},
{
"name": "Type",
"shortName": "Type",
"id": "type",
"direction": "input",
"defaultValue": 1,
"minimum": 1,
"maximum": 2,
"integer": true,
"scalePoints": {
"Standard": 1,
"White": 2
},
"list": true,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "c0beb57ad2494b448e2a84edc9135748"
},
"controller": {
"cid": "9dbe322d2402440a874391a57dab56a8"
},
"subCategory": "Fx|Modulation"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_clip"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_clip"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_clip",
"types": [ "@lv2:WaveshaperPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,97 @@
/*
* Brickworks
*
* Copyright (C) 2022-2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_clip.h>
#include <bw_src_int.h>
#define BUF_SIZE 32
typedef struct plugin {
bw_clip_coeffs clip_coeffs;
bw_clip_state clip_state;
bw_src_int_coeffs src_up_coeffs;
bw_src_int_state src_up_state;
bw_src_int_coeffs src_down_coeffs;
bw_src_int_state src_down_state;
float buf[BUF_SIZE];
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_clip_init(&instance->clip_coeffs);
bw_src_int_init(&instance->src_up_coeffs, 2);
bw_src_int_init(&instance->src_down_coeffs, -2);
bw_clip_set_gain_compensation(&instance->clip_coeffs, 1);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_clip_set_sample_rate(&instance->clip_coeffs, 2.f * sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_clip_reset_coeffs(&instance->clip_coeffs);
bw_clip_reset_state(&instance->clip_coeffs, &instance->clip_state, 0.f);
bw_src_int_reset_state(&instance->src_up_coeffs, &instance->src_up_state, 0.f);
bw_src_int_reset_state(&instance->src_down_coeffs, &instance->src_down_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_gain:
bw_clip_set_gain(&instance->clip_coeffs, value);
break;
case plugin_parameter_bias:
bw_clip_set_bias(&instance->clip_coeffs, value);
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
size_t i = 0;
while (i < n_samples) {
int n = bw_mini32(n_samples - i, BUF_SIZE >> 1);
bw_src_int_process(&instance->src_up_coeffs, &instance->src_up_state, inputs[0] + i, instance->buf, n);
bw_clip_process(&instance->clip_coeffs, &instance->clip_state, instance->buf, instance->buf, n << 1);
bw_src_int_process(&instance->src_down_coeffs, &instance->src_down_state, instance->buf, outputs[0] + i, n << 1);
i += n;
}
}

View File

@ -0,0 +1,46 @@
{
"product": {
"name": "Brickworks hard clipper example",
"bundleName": "bw_example_fx_clip",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Gain",
"shortName": "Gain",
"id": "gain",
"direction": "input",
"defaultValue": 1.0,
"minimum": 0.1,
"maximum": 10.0,
"map": "linear"
},
{
"name": "Bias",
"shortName": "Bias",
"id": "bias",
"direction": "input",
"defaultValue": 0.0,
"minimum": -2.5,
"maximum": 2.5,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "51612ca35f5744b1baadb76adc81ba96"
},
"controller": {
"cid": "442600725f304e6a9d07783b04446e48"
},
"subCategory": "Fx|Distortion"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_comb"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16, 17, 18, 19 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_comb"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_comb",
"types": [ "@lv2:CombPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,83 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_comb.h>
typedef struct plugin {
bw_comb_coeffs comb_coeffs;
bw_comb_state comb_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_comb_init(&instance->comb_coeffs, 1.f);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_comb_set_sample_rate(&instance->comb_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
return bw_comb_mem_req(&instance->comb_coeffs);
}
static void plugin_mem_set(plugin *instance, void *mem) {
bw_comb_mem_set(&instance->comb_coeffs, &instance->comb_state, mem);
}
static void plugin_reset(plugin *instance) {
bw_comb_reset_coeffs(&instance->comb_coeffs);
bw_comb_reset_state(&instance->comb_coeffs, &instance->comb_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_ff_delay:
bw_comb_set_delay_ff(&instance->comb_coeffs, 0.001f * value);
break;
case plugin_parameter_fb_delay:
bw_comb_set_delay_fb(&instance->comb_coeffs, 0.001f * value);
break;
case plugin_parameter_blend:
bw_comb_set_coeff_blend(&instance->comb_coeffs, value);
break;
case plugin_parameter_ff:
bw_comb_set_coeff_ff(&instance->comb_coeffs, value);
break;
case plugin_parameter_fb:
bw_comb_set_coeff_fb(&instance->comb_coeffs, value);
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_comb_process(&instance->comb_coeffs, &instance->comb_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,78 @@
{
"product": {
"name": "Brickworks comb filter example",
"bundleName": "bw_example_fx_comb",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Feedforward delay",
"shortName": "FF delay",
"id": "ff_delay",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 1000.0,
"unit": "ms",
"map": "linear"
},
{
"name": "Feedback delay",
"shortName": "FB delay",
"id": "fb_delay",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 1000.0,
"unit": "ms",
"map": "linear"
},
{
"name": "Blend coefficient",
"shortName": "Blend coeff",
"id": "blend",
"direction": "input",
"defaultValue": 1.0,
"minimum": 0.0,
"maximum": 1.0,
"map": "linear"
},
{
"name": "Feedforward coefficient",
"shortName": "FF coeff",
"id": "ff",
"direction": "input",
"defaultValue": 0.0,
"minimum": -1.0,
"maximum": 1.0,
"map": "linear"
},
{
"name": "Feedback coefficient",
"shortName": "FB coeff",
"id": "fb",
"direction": "input",
"defaultValue": 0.0,
"minimum": -0.999,
"maximum": 0.999,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "3347f70263444985b2010e0e7fd7cd3f"
},
"controller": {
"cid": "572a5d3be47d4315a58354cb4d288e0c"
},
"subCategory": "Fx|Delay"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_comp"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15, 16, 17, 18, 19, 20 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_comp"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_comp",
"types": [ "@lv2:CompressorPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,91 @@
/*
* Brickworks
*
* Copyright (C) 2022-2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_comp.h>
typedef struct plugin {
bw_comp_coeffs comp_coeffs;
bw_comp_state comp_state;
char ext_sidechain;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_comp_init(&instance->comp_coeffs);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_comp_set_sample_rate(&instance->comp_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
(void)instance;
return 0;
}
static void plugin_mem_set(plugin *instance, void *mem) {
(void)instance;
(void)mem;
}
static void plugin_reset(plugin *instance) {
bw_comp_reset_coeffs(&instance->comp_coeffs);
bw_comp_reset_state(&instance->comp_coeffs, &instance->comp_state, 0.f, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
switch (index) {
case plugin_parameter_threshold:
bw_comp_set_thresh_dBFS(&instance->comp_coeffs, value);
break;
case plugin_parameter_ratio:
bw_comp_set_ratio(&instance->comp_coeffs, bw_rcpf(value));
break;
case plugin_parameter_attack:
// using rise time 10% -> 90%: tau = rise time / log(9)
bw_comp_set_attack_tau(&instance->comp_coeffs, (0.001f * 0.4551196133134186f) * value);
break;
case plugin_parameter_release:
// as before
bw_comp_set_release_tau(&instance->comp_coeffs, (0.001f * 0.4551196133134186f) * value);
break;
case plugin_parameter_gain:
bw_comp_set_gain_dB(&instance->comp_coeffs, value);
break;
case plugin_parameter_ext_sidechain:
instance->ext_sidechain = (char)value;
break;
}
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_comp_process(&instance->comp_coeffs, &instance->comp_state, inputs[0], instance->ext_sidechain ? inputs[1] : inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,102 @@
{
"product": {
"name": "Brickworks compressor example",
"bundleName": "bw_example_fx_comp",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
},
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Sidechain input",
"shortName": "Sidechain in",
"id": "sidechain_in",
"sidechain": true,
"cv": false,
"optional": true
}
],
"parameters": [
{
"name": "Threshold",
"shortName": "Threshold",
"id": "threshold",
"direction": "input",
"defaultValue": 0.0,
"minimum": -60.0,
"maximum": 0.0,
"unit": "db",
"map": "linear"
},
{
"name": "Ratio",
"shortName": "Ratio",
"id": "ratio",
"direction": "input",
"defaultValue": 1.0,
"minimum": 1.0,
"maximum": 20.0,
"map": "linear"
},
{
"name": "Attack",
"shortName": "Attack",
"id": "attack",
"direction": "input",
"defaultValue": 20.0,
"minimum": 1.0,
"maximum": 2000.0,
"unit": "ms",
"map": "logarithmic"
},
{
"name": "Release",
"shortName": "Release",
"id": "release",
"direction": "input",
"defaultValue": 250.0,
"minimum": 1.0,
"maximum": 2000.0,
"unit": "ms",
"map": "logarithmic"
},
{
"name": "Makeup gain",
"shortName": "Gain",
"id": "gain",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 40.0,
"unit": "db",
"map": "linear"
},
{
"name": "External sidechain",
"shortName": "Ext sidechain",
"id": "ext_sidechain",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 1.0,
"toggled": true,
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "4fcae287e903438aa1b2105e4627aa7e"
},
"controller": {
"cid": "9d41e55b70a04f31a4e27ce6cc0337d5"
},
"subCategory": "Fx|Dynamics"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_delay"
}
}

View File

@ -0,0 +1,5 @@
{
"daisy_seed": {
"parameterPins": [ 15 ]
}
}

View File

@ -0,0 +1,5 @@
{
"ios": {
"productBundleIdentifier": "com.orastron.bw_example_fx_delay"
}
}

View File

@ -0,0 +1,10 @@
{
"lv2": {
"prefixes": {
"bw_examples": "https://www.orastron.com/brickworks/examples/"
},
"uri": "@bw_examples:fx_delay",
"types": [ "@lv2:DelayPlugin" ],
"version": "0.0"
}
}

View File

@ -0,0 +1,68 @@
/*
* Brickworks
*
* Copyright (C) 2023, 2024 Orastron Srl unipersonale
*
* Brickworks is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Brickworks is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Brickworks. If not, see <http://www.gnu.org/licenses/>.
*
* File author: Stefano D'Angelo
*/
#include "common.h"
#include <bw_delay.h>
typedef struct plugin {
bw_delay_coeffs delay_coeffs;
bw_delay_state delay_state;
} plugin;
static void plugin_init(plugin *instance, plugin_callbacks *cbs) {
(void)cbs;
bw_delay_init(&instance->delay_coeffs, 1.f);
}
static void plugin_fini(plugin *instance) {
(void)instance;
}
static void plugin_set_sample_rate(plugin *instance, float sample_rate) {
bw_delay_set_sample_rate(&instance->delay_coeffs, sample_rate);
}
static size_t plugin_mem_req(plugin *instance) {
return bw_delay_mem_req(&instance->delay_coeffs);
}
static void plugin_mem_set(plugin *instance, void *mem) {
bw_delay_mem_set(&instance->delay_coeffs, &instance->delay_state, mem);
}
static void plugin_reset(plugin *instance) {
bw_delay_reset_coeffs(&instance->delay_coeffs);
bw_delay_reset_state(&instance->delay_coeffs, &instance->delay_state, 0.f);
}
static void plugin_set_parameter(plugin *instance, size_t index, float value) {
(void)index;
bw_delay_set_delay(&instance->delay_coeffs, 0.001f * value);
}
static float plugin_get_parameter(plugin *instance, size_t index) {
(void)instance;
(void)index;
return 0.f;
}
static void plugin_process(plugin *instance, const float **inputs, float **outputs, size_t n_samples) {
bw_delay_process(&instance->delay_coeffs, &instance->delay_state, inputs[0], outputs[0], n_samples);
}

View File

@ -0,0 +1,37 @@
{
"product": {
"name": "Brickworks non-smoothed delay line example",
"bundleName": "bw_example_fx_delay",
"buses": [
{
"type": "audio",
"direction": "input",
"channels": "mono",
"name": "Input",
"shortName": "Input",
"id": "input"
},
{
"type": "audio",
"direction": "output",
"channels": "mono",
"name": "Output",
"shortName": "Output",
"id": "output"
}
],
"parameters": [
{
"name": "Delay",
"shortName": "Delay",
"id": "delay",
"direction": "input",
"defaultValue": 0.0,
"minimum": 0.0,
"maximum": 1000.0,
"unit": "ms",
"map": "linear"
}
]
}
}

View File

@ -0,0 +1,11 @@
{
"vst3": {
"plugin": {
"cid": "2656cc61b746463d8ff7dfa41aa4d426"
},
"controller": {
"cid": "64fb08db42e64a6aae3fe30a55363bb6"
},
"subCategory": "Fx|Delay"
}
}

View File

@ -0,0 +1,5 @@
{
"android": {
"javaPackageName": "com.orastron.bw_example_fx_dist"
}
}

Some files were not shown because too many files have changed in this diff Show More