Compare commits
520 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
18c7d41d87 | ||
![]() |
10b7c3834a | ||
![]() |
422cdcdb8d | ||
![]() |
2ceca5cc0c | ||
e319de1a1f | |||
11f49b4276 | |||
f960114cfb | |||
5f494781ac | |||
97790bc330 | |||
5c185738c2 | |||
c91dbd5c95 | |||
d008662ffb | |||
b5cdf2ad19 | |||
181285f4ff | |||
ca4c4fa006 | |||
512546f108 | |||
2a6f149612 | |||
aaeba97a37 | |||
d49fc15db2 | |||
b93eb5d836 | |||
5661ebc0e7 | |||
7d521e51e0 | |||
61afaca400 | |||
fbd0890017 | |||
4220bed501 | |||
ee327ebe80 | |||
a6d52765a6 | |||
029ec29f6d | |||
20bb3a8193 | |||
fb3ab23599 | |||
f58353bc20 | |||
1be6e06699 | |||
4487ef2176 | |||
65eeade32d | |||
83e101cf8e | |||
![]() |
c779481486 | ||
![]() |
a605293801 | ||
67756cf502 | |||
02e628e5b0 | |||
ff459dece1 | |||
defabafb45 | |||
578bec397f | |||
5c91a48e42 | |||
abc65d292a | |||
d2b15d9155 | |||
90f03881fd | |||
![]() |
5015dd6bbd | ||
724d7c6b8a | |||
da22954810 | |||
f3a12e8e0a | |||
ff99bda751 | |||
b214bc896e | |||
![]() |
6431749bf8 | ||
3a8e279fde | |||
![]() |
2ba329f5ea | ||
![]() |
f1e471e9bf | ||
340d527ffa | |||
dd6f6adb2c | |||
c7f930673f | |||
98e5ef65c4 | |||
daf0cb3e1c | |||
324aa911fd | |||
![]() |
f530db5c45 | ||
![]() |
eaaeebb8ff | ||
adbd1ab61c | |||
750c807db3 | |||
f6b4e1b7ec | |||
b517c83cb5 | |||
9cb3bb00fa | |||
099fb7507b | |||
![]() |
091b677663 | ||
862e56840f | |||
![]() |
6f856ec04c | ||
![]() |
07387edcc6 | ||
![]() |
eef7f35dc5 | ||
![]() |
7b53b045a9 | ||
![]() |
99b6ec2996 | ||
![]() |
e5cc92c72f | ||
f04fcac4ea | |||
c2c1979cc3 | |||
1e34773da8 | |||
f623002c27 | |||
![]() |
2860ddc141 | ||
![]() |
06fc92a2e0 | ||
![]() |
af6ce9ba5e | ||
93ddf112bb | |||
![]() |
5d3fbdbb0a | ||
![]() |
861cdc427e | ||
![]() |
5bd685ed7b | ||
10a2d1ff45 | |||
![]() |
1d731eaafb | ||
![]() |
4dfbded165 | ||
![]() |
5f2a413b4d | ||
![]() |
a4a8ba96ca | ||
![]() |
93f571af18 | ||
![]() |
5a4b9dc9b3 | ||
![]() |
ba9fdc710c | ||
![]() |
e9d80f55ac | ||
![]() |
e0bfcdbdd7 | ||
![]() |
0b64fcbb61 | ||
![]() |
5fcbe57ad0 | ||
![]() |
7a8ef7ae25 | ||
![]() |
4b10a04b3c | ||
![]() |
590dbb8177 | ||
![]() |
442d5ac283 | ||
![]() |
cedcbce960 | ||
![]() |
c39e1df4a5 | ||
![]() |
ed80795731 | ||
![]() |
d3ec90a16e | ||
![]() |
e6cb568b04 | ||
![]() |
3e26125eb4 | ||
![]() |
43d20f5c52 | ||
![]() |
61d3459b95 | ||
![]() |
4f7eb0a82f | ||
![]() |
cbfae97e42 | ||
![]() |
a5e56e2dd1 | ||
![]() |
a80aa87b27 | ||
![]() |
2bb3d1c9f5 | ||
![]() |
da25dcde75 | ||
![]() |
1226e9797d | ||
![]() |
3982f14211 | ||
![]() |
3dcfeaf9fa | ||
![]() |
c9c425e30e | ||
![]() |
ef299091ff | ||
![]() |
5e5a2f0032 | ||
![]() |
b9f49672d1 | ||
![]() |
eff4dab968 | ||
93d960e3b8 | |||
a4924ff832 | |||
d17387f377 | |||
![]() |
763a024f07 | ||
![]() |
4769d090c4 | ||
![]() |
da1a3ef91b | ||
![]() |
14650e8495 | ||
![]() |
65e0e13b55 | ||
![]() |
a4a979ad1d | ||
![]() |
56f98d6d89 | ||
![]() |
2dca881f03 | ||
![]() |
e828804d35 | ||
397c36a7a0 | |||
76343595d8 | |||
9af1146e48 | |||
93df684ac8 | |||
9685ac9b4b | |||
![]() |
74737a8787 | ||
![]() |
17ec290ae6 | ||
![]() |
129d44db76 | ||
![]() |
404530cbbe | ||
![]() |
a9a690bc69 | ||
![]() |
f9e1f5eb73 | ||
![]() |
df5f3837ea | ||
![]() |
0b7da2dda9 | ||
![]() |
1c74f053db | ||
![]() |
745ba9c2dd | ||
![]() |
9b0496474b | ||
![]() |
684f021476 | ||
4ff4ceed70 | |||
![]() |
e4e9643509 | ||
![]() |
1d2f9dda39 | ||
![]() |
2a62abe93b | ||
1b4035b5ac | |||
156374aca4 | |||
0605204593 | |||
4b2f07852b | |||
233c9d7303 | |||
37055e65ad | |||
![]() |
ef8b5626a3 | ||
2ba9b443c1 | |||
![]() |
4ee0c0d0cc | ||
![]() |
2b104fc7f2 | ||
![]() |
e6903eef7f | ||
![]() |
0cb5a29a8b | ||
891fa64c9b | |||
92e312766b | |||
![]() |
df05bf1740 | ||
3ae4947855 | |||
cb37f4f977 | |||
d1e4e0f7c3 | |||
928b0752ff | |||
dad7485016 | |||
e49cae6c8b | |||
16d17cb5f4 | |||
7b968161ec | |||
dbee544059 | |||
![]() |
c1cb51ad84 | ||
![]() |
ff7a768c05 | ||
![]() |
34bf3bfeb9 | ||
![]() |
2cef5cd584 | ||
![]() |
9d4d5759a0 | ||
![]() |
313ec711fe | ||
![]() |
9162c57cb1 | ||
![]() |
8ee4150889 | ||
eb8b057492 | |||
![]() |
68df6bee86 | ||
cd0b867d88 | |||
2bad45aabb | |||
![]() |
d890510d0f | ||
![]() |
d5751c0c4c | ||
![]() |
07ff65597f | ||
![]() |
49a06b52eb | ||
![]() |
58a50b3ba1 | ||
f267a015b7 | |||
![]() |
4bc7eda8f3 | ||
![]() |
fc91d59f57 | ||
![]() |
9b123a28f2 | ||
![]() |
40adc296a2 | ||
![]() |
e3cd1d4e21 | ||
52d33fa3c5 | |||
aefd36aac1 | |||
6d94c36677 | |||
b4898a60b3 | |||
f1d4de6457 | |||
ac0ffd632a | |||
398e051f93 | |||
cb91af4576 | |||
f470af1a92 | |||
3e1400922f | |||
![]() |
dc93bd675b | ||
![]() |
baf440a171 | ||
31b0afb83e | |||
05c6f58997 | |||
99fc95a693 | |||
![]() |
7b65b75d92 | ||
![]() |
19e37fd6e8 | ||
69b74c4ccb | |||
0ef455722f | |||
77db1a3cdb | |||
8793af1864 | |||
7d6409772f | |||
a3f42c8c57 | |||
dae41a3831 | |||
13987673f5 | |||
1d763ef31e | |||
![]() |
524ce724bc | ||
![]() |
34402d720e | ||
![]() |
d9e021aca3 | ||
![]() |
213bac4209 | ||
![]() |
d50e7536d5 | ||
![]() |
04b027f564 | ||
![]() |
b36a56ab70 | ||
![]() |
e12db3795a | ||
![]() |
a16cdd9c73 | ||
![]() |
a7b3f5ce16 | ||
![]() |
72ba53385c | ||
![]() |
2d653f471f | ||
![]() |
e4aef951f2 | ||
![]() |
003c3b62d7 | ||
![]() |
d5dda7f26b | ||
![]() |
99afa41b8d | ||
![]() |
537cd5d17b | ||
![]() |
d15e7951f7 | ||
![]() |
637cefb636 | ||
![]() |
d2994b0e12 | ||
![]() |
e9a935a964 | ||
![]() |
af2d21e45c | ||
![]() |
26f98b3ec7 | ||
![]() |
2792602e2f | ||
6c29b1f0cd | |||
fe02a79329 | |||
da30569d61 | |||
3d63665df2 | |||
c9ca239a0b | |||
52233a9d63 | |||
b50e429aad | |||
82f66009f7 | |||
c3d8546e75 | |||
4313cea18c | |||
ee94fba57b | |||
262d4f9a5d | |||
12a574c07d | |||
399325359d | |||
6b38be600e | |||
ec1a70835c | |||
61c2b48817 | |||
eb49fedd5e | |||
a5e4fa0c76 | |||
ccc94c1b0f | |||
f55a9a146b | |||
40503b7cb1 | |||
2a5d1721f8 | |||
22030272d9 | |||
7e32e18d66 | |||
f89188f790 | |||
425aa020e1 | |||
ac7d49028b | |||
7a2630951f | |||
5ec809bc4f | |||
48275d077d | |||
225ef9108c | |||
3a948b1c99 | |||
55a78a5ab4 | |||
41f56ec91c | |||
7616c590a0 | |||
![]() |
39bad57099 | ||
![]() |
84d82d039b | ||
![]() |
0da7b31504 | ||
![]() |
6e2f5b1bce | ||
08c8656259 | |||
ffe1db7749 | |||
88fad66dd6 | |||
c25bd5bc78 | |||
da517ed4bc | |||
![]() |
c1e16c4338 | ||
fd6c9cc052 | |||
d76aa6cb48 | |||
45e2cd7976 | |||
f824bf0bc4 | |||
![]() |
ad115964a6 | ||
![]() |
4542235dac | ||
![]() |
046680c503 | ||
![]() |
0a586e9764 | ||
![]() |
6d92e83b57 | ||
![]() |
13659d9aad | ||
![]() |
8364afaef2 | ||
![]() |
e788c26cc6 | ||
![]() |
fa9062968b | ||
![]() |
1eaa1621c5 | ||
![]() |
7d1c0e47b1 | ||
![]() |
e82731e1f0 | ||
![]() |
df554f2572 | ||
![]() |
b719737eda | ||
![]() |
9e31fb8058 | ||
![]() |
c2769cdf21 | ||
![]() |
d9272453fd | ||
![]() |
8299cb7eae | ||
![]() |
681008abdb | ||
![]() |
cd71cd9063 | ||
![]() |
b08d9ae4f0 | ||
![]() |
41e87b69a4 | ||
![]() |
c71f7abdb7 | ||
![]() |
1cf8c1050b | ||
![]() |
bce3949cd1 | ||
![]() |
bddbf72462 | ||
![]() |
bd3a6367e0 | ||
![]() |
73185217e7 | ||
20b66887b6 | |||
fc3a596a0b | |||
b2cb3cad1e | |||
af5dbc0a1c | |||
6e1212d8f5 | |||
c4074927ce | |||
![]() |
61e57084e4 | ||
![]() |
146904938b | ||
![]() |
cceaa5077f | ||
![]() |
b192b4baa6 | ||
![]() |
6326eed219 | ||
![]() |
1a4ada6ef6 | ||
ebf1712e74 | |||
c3caa91f99 | |||
de52df395e | |||
5245adea14 | |||
1b8e4c56e3 | |||
d01e558622 | |||
fccb7712a9 | |||
7a0c76652f | |||
768aa6d81e | |||
![]() |
8c83345f25 | ||
![]() |
4dd9e863ce | ||
2a5e3d3ece | |||
dccc39907e | |||
e331ce1125 | |||
063d4ffb02 | |||
bfee4340a4 | |||
3490f35e26 | |||
13223ea427 | |||
1092dc14af | |||
![]() |
65bc52b55e | ||
dbff09f83c | |||
a04e9a2d07 | |||
b16a964498 | |||
![]() |
c79d799842 | ||
![]() |
c1f58ba76d | ||
![]() |
4037735123 | ||
![]() |
06dcbe3f3e | ||
![]() |
a486e7a90c | ||
![]() |
8cd630c80e | ||
a5741471d6 | |||
6cecf0d654 | |||
b2169b6792 | |||
20775c532e | |||
9d699fe554 | |||
5c2030bf97 | |||
ee4fa3c9f2 | |||
![]() |
c3dff38987 | ||
![]() |
2d170def71 | ||
![]() |
78e8b911c7 | ||
![]() |
71a2a00eaf | ||
![]() |
8136a09e72 | ||
1b6cb5a029 | |||
5d988b0c05 | |||
695dca5769 | |||
44691855ae | |||
5201d3363a | |||
47cdfb4ee1 | |||
60ca76b9a3 | |||
c57ddb8877 | |||
37415a0b0e | |||
a8f594916c | |||
7f42cb70d9 | |||
![]() |
468f66453b | ||
![]() |
2d101a315e | ||
b811796e35 | |||
f3911765f5 | |||
7354f40a14 | |||
e6466ce0c8 | |||
![]() |
6228fba4d5 | ||
175481e4a5 | |||
99ccb2da2d | |||
85488e76a8 | |||
847f99264f | |||
86df4d4580 | |||
4d9de61a9c | |||
9322e658b4 | |||
![]() |
5dfa580d3e | ||
![]() |
2b211b772e | ||
![]() |
b91a0f8e54 | ||
b741611b26 | |||
5f11868282 | |||
98db248b5b | |||
![]() |
02996e72d7 | ||
![]() |
6d77af6319 | ||
![]() |
69b8931ece | ||
8db29e8bec | |||
7f8198b00e | |||
721dc3da27 | |||
388ece962a | |||
5eed8c2878 | |||
c05b6d84db | |||
67fcbf8b7d | |||
389c6266b5 | |||
8fe8a6f995 | |||
8f4e50f0a7 | |||
![]() |
8b5dd45e50 | ||
![]() |
8750d5cf89 | ||
![]() |
20437e0a23 | ||
3a44034694 | |||
fb4d041838 | |||
8c9796f025 | |||
1aa2cca858 | |||
6504833be0 | |||
db06874a17 | |||
fd4db8fd4f | |||
d8ac7cadcc | |||
02a964d453 | |||
![]() |
9b746f746f | ||
![]() |
a817b23f50 | ||
![]() |
9dcfb2de30 | ||
![]() |
1f1571177a | ||
![]() |
ab417d4c61 | ||
1843233c96 | |||
![]() |
6fe46ef56b | ||
![]() |
7e855aac96 | ||
![]() |
a20678a409 | ||
![]() |
05d0ea8b1f | ||
![]() |
fd2b8e69fe | ||
75caf17b16 | |||
537e309793 | |||
b808ef5421 | |||
767c4f649a | |||
acec8947a0 | |||
![]() |
3e15f95284 | ||
![]() |
faa17613f4 | ||
aa6bdeea97 | |||
fffab40cd2 | |||
f2f04264d3 | |||
![]() |
aed3357957 | ||
![]() |
64d9133d7b | ||
![]() |
0db0e1b42d | ||
![]() |
e4d2d984c8 | ||
![]() |
fece83f179 | ||
![]() |
850f787e15 | ||
![]() |
0a56d74388 | ||
![]() |
e199678912 | ||
![]() |
1972040cb0 | ||
0f204c3aa9 | |||
![]() |
720e02e857 | ||
![]() |
bc26c9ed74 | ||
![]() |
3384d0ea69 | ||
![]() |
4077c5271b | ||
1d4d715449 | |||
f795e9520f | |||
483bad7196 | |||
![]() |
d72f1beca7 | ||
![]() |
46383fde17 | ||
![]() |
a5cb9b9c06 | ||
![]() |
3254074efc | ||
![]() |
87cb193a48 | ||
![]() |
97492ce701 | ||
![]() |
233a016ba4 | ||
![]() |
ac0d98f2da | ||
5988b4bc49 | |||
1eeba2252a | |||
fe21e533f9 | |||
6455ef34fe | |||
016a769615 | |||
1584f77a8b | |||
71dfbc9186 | |||
7865aedbfc | |||
ad79e9ec65 | |||
2096a877aa | |||
![]() |
a23ee901a2 | ||
![]() |
aacd8236b4 | ||
![]() |
2a482b77b0 | ||
![]() |
84c3a7d1cd | ||
![]() |
7c941fa26b | ||
![]() |
03f3b8a67f | ||
![]() |
c5c031c915 | ||
![]() |
e06cd2426b | ||
![]() |
57afadd87d | ||
![]() |
39a82639a2 | ||
![]() |
89a70ef9c9 | ||
![]() |
47f26337cf | ||
007fd59da6 | |||
f9beb49d00 | |||
aff5093234 | |||
6206530309 | |||
11c399929f | |||
747b6322d4 | |||
f55a0e53a2 | |||
a74323897f |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
build
|
||||
node_modules
|
||||
package-lock.json
|
||||
.DS_Store
|
||||
|
221
ChangeLog
221
ChangeLog
@ -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.
|
||||
|
14
README.md
14
README.md
@ -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
17
THANKS.md
Normal 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
26
TODO
@ -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
164
examples/README.md
Normal 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.
|
@ -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
|
7
examples/common/src/company.json
Normal file
7
examples/common/src/company.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"company": {
|
||||
"name": "Orastron",
|
||||
"url": "https://www.orastron.com/",
|
||||
"email": "info@orastron.com"
|
||||
}
|
||||
}
|
@ -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
|
65
examples/common/src/cxx-fx/plugin.h
Normal file
65
examples/common/src/cxx-fx/plugin.h
Normal 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);
|
||||
}
|
43
examples/common/src/cxx-synth/impl.h
Normal file
43
examples/common/src/cxx-synth/impl.h
Normal 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
|
69
examples/common/src/cxx-synth/plugin.h
Normal file
69
examples/common/src/cxx-synth/plugin.h
Normal 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);
|
||||
}
|
10
examples/common/src/ios-make.json
Normal file
10
examples/common/src/ios-make.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"ios_make": {
|
||||
"headerSearchPaths": [
|
||||
"../../../../../../miniaudio",
|
||||
"../../../../common/src",
|
||||
"../../../../../include"
|
||||
],
|
||||
"deploymentTarget": 14.0
|
||||
}
|
||||
}
|
BIN
examples/common/src/keystore.jks
Normal file
BIN
examples/common/src/keystore.jks
Normal file
Binary file not shown.
6
examples/common/src/make-cxx-fx.json
Normal file
6
examples/common/src/make-cxx-fx.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"make": {
|
||||
"mkincDir": "../../common/src",
|
||||
"extra": "EXAMPLE_TYPE := cxx-fx"
|
||||
}
|
||||
}
|
6
examples/common/src/make-cxx-synth.json
Normal file
6
examples/common/src/make-cxx-synth.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"make": {
|
||||
"mkincDir": "../../common/src",
|
||||
"extra": "EXAMPLE_TYPE := cxx-synth"
|
||||
}
|
||||
}
|
6
examples/common/src/make.json
Normal file
6
examples/common/src/make.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"make": {
|
||||
"mkincDir": "../../common/src",
|
||||
"extra": "EXAMPLE_TYPE := c"
|
||||
}
|
||||
}
|
3
examples/common/src/rules-extra.mk
Normal file
3
examples/common/src/rules-extra.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(TEMPLATE), web)
|
||||
include $(COMMON_DIR)/../web/rules-extra-web-demo.mk
|
||||
endif
|
3
examples/common/src/vars-extra.mk
Normal file
3
examples/common/src/vars-extra.mk
Normal file
@ -0,0 +1,3 @@
|
||||
ifeq ($(TEMPLATE), web)
|
||||
include $(COMMON_DIR)/../web/vars-extra-web-demo.mk
|
||||
endif
|
76
examples/common/src/vars-pre.mk
Normal file
76
examples/common/src/vars-pre.mk
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
@ -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
|
@ -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
|
@ -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);
|
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
5
examples/fx_ap1/src/android.json
Normal file
5
examples/fx_ap1/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_ap1"
|
||||
}
|
||||
}
|
5
examples/fx_ap1/src/daisy-seed.json
Normal file
5
examples/fx_ap1/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15 ]
|
||||
}
|
||||
}
|
5
examples/fx_ap1/src/ios.json
Normal file
5
examples/fx_ap1/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_ap1"
|
||||
}
|
||||
}
|
10
examples/fx_ap1/src/lv2.json
Normal file
10
examples/fx_ap1/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
70
examples/fx_ap1/src/plugin.h
Normal file
70
examples/fx_ap1/src/plugin.h
Normal 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);
|
||||
}
|
37
examples/fx_ap1/src/product.json
Normal file
37
examples/fx_ap1/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_ap1/src/vst3.json
Normal file
11
examples/fx_ap1/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "483913deb69e46f985403d9a0bd0c472"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "ef95c4fcae0c4f2eac45878df032c511"
|
||||
},
|
||||
"subCategory": "Fx|Filter"
|
||||
}
|
||||
}
|
5
examples/fx_ap2/src/android.json
Normal file
5
examples/fx_ap2/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_ap2"
|
||||
}
|
||||
}
|
5
examples/fx_ap2/src/daisy-seed.json
Normal file
5
examples/fx_ap2/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16 ]
|
||||
}
|
||||
}
|
5
examples/fx_ap2/src/ios.json
Normal file
5
examples/fx_ap2/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_ap2"
|
||||
}
|
||||
}
|
10
examples/fx_ap2/src/lv2.json
Normal file
10
examples/fx_ap2/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
76
examples/fx_ap2/src/plugin.h
Normal file
76
examples/fx_ap2/src/plugin.h
Normal 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);
|
||||
}
|
47
examples/fx_ap2/src/product.json
Normal file
47
examples/fx_ap2/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_ap2/src/vst3.json
Normal file
11
examples/fx_ap2/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "89a2e5db96114130a2b45d1ca20b4d92"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "36c5c2701b434536aa35b720b9e9ce47"
|
||||
},
|
||||
"subCategory": "Fx|Filter"
|
||||
}
|
||||
}
|
5
examples/fx_balance/src/android.json
Normal file
5
examples/fx_balance/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_balance"
|
||||
}
|
||||
}
|
5
examples/fx_balance/src/daisy-seed.json
Normal file
5
examples/fx_balance/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 22, 23 ]
|
||||
}
|
||||
}
|
5
examples/fx_balance/src/ios.json
Normal file
5
examples/fx_balance/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_balance"
|
||||
}
|
||||
}
|
10
examples/fx_balance/src/lv2.json
Normal file
10
examples/fx_balance/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
86
examples/fx_balance/src/plugin.h
Normal file
86
examples/fx_balance/src/plugin.h
Normal 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);
|
||||
}
|
59
examples/fx_balance/src/product.json
Normal file
59
examples/fx_balance/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_balance/src/vst3.json
Normal file
11
examples/fx_balance/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "00cbb2d431da48b2bc5dec424d135847"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "4ad012b1b12f4c1b995cac1167dadc90"
|
||||
},
|
||||
"subCategory": "Fx|Spatial"
|
||||
}
|
||||
}
|
5
examples/fx_bitcrush/src/android.json
Normal file
5
examples/fx_bitcrush/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_bitcrush"
|
||||
}
|
||||
}
|
5
examples/fx_bitcrush/src/daisy-seed.json
Normal file
5
examples/fx_bitcrush/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16, 22 ]
|
||||
}
|
||||
}
|
5
examples/fx_bitcrush/src/ios.json
Normal file
5
examples/fx_bitcrush/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_bitcrush"
|
||||
}
|
||||
}
|
10
examples/fx_bitcrush/src/lv2.json
Normal file
10
examples/fx_bitcrush/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
86
examples/fx_bitcrush/src/plugin.h
Normal file
86
examples/fx_bitcrush/src/plugin.h
Normal 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);
|
||||
}
|
59
examples/fx_bitcrush/src/product.json
Normal file
59
examples/fx_bitcrush/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_bitcrush/src/vst3.json
Normal file
11
examples/fx_bitcrush/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "2f4ddf20e28446b7807a61a2a9530316"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "171dc1cfa853455796b6abe2d539e9f9"
|
||||
},
|
||||
"subCategory": "Fx|Distortion"
|
||||
}
|
||||
}
|
5
examples/fx_cab/src/android.json
Normal file
5
examples/fx_cab/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_cab"
|
||||
}
|
||||
}
|
5
examples/fx_cab/src/daisy-seed.json
Normal file
5
examples/fx_cab/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16, 17 ]
|
||||
}
|
||||
}
|
5
examples/fx_cab/src/ios.json
Normal file
5
examples/fx_cab/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_cab"
|
||||
}
|
||||
}
|
10
examples/fx_cab/src/lv2.json
Normal file
10
examples/fx_cab/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
79
examples/fx_cab/src/plugin.h
Normal file
79
examples/fx_cab/src/plugin.h
Normal 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);
|
||||
}
|
59
examples/fx_cab/src/product.json
Normal file
59
examples/fx_cab/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_cab/src/vst3.json
Normal file
11
examples/fx_cab/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "cf0dbf103bd64d69b10cbd1bfddb51dc"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "a54d87f2bddd4e94ad1a69537ee468a0"
|
||||
},
|
||||
"subCategory": "Fx|Filter"
|
||||
}
|
||||
}
|
5
examples/fx_chorus/src/android.json
Normal file
5
examples/fx_chorus/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_chorus"
|
||||
}
|
||||
}
|
5
examples/fx_chorus/src/daisy-seed.json
Normal file
5
examples/fx_chorus/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16, 17 ]
|
||||
}
|
||||
}
|
5
examples/fx_chorus/src/ios.json
Normal file
5
examples/fx_chorus/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_chorus"
|
||||
}
|
||||
}
|
10
examples/fx_chorus/src/lv2.json
Normal file
10
examples/fx_chorus/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
87
examples/fx_chorus/src/plugin.h
Normal file
87
examples/fx_chorus/src/plugin.h
Normal 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);
|
||||
}
|
64
examples/fx_chorus/src/product.json
Normal file
64
examples/fx_chorus/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_chorus/src/vst3.json
Normal file
11
examples/fx_chorus/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "c0beb57ad2494b448e2a84edc9135748"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "9dbe322d2402440a874391a57dab56a8"
|
||||
},
|
||||
"subCategory": "Fx|Modulation"
|
||||
}
|
||||
}
|
5
examples/fx_clip/src/android.json
Normal file
5
examples/fx_clip/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_clip"
|
||||
}
|
||||
}
|
5
examples/fx_clip/src/daisy-seed.json
Normal file
5
examples/fx_clip/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16 ]
|
||||
}
|
||||
}
|
5
examples/fx_clip/src/ios.json
Normal file
5
examples/fx_clip/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_clip"
|
||||
}
|
||||
}
|
10
examples/fx_clip/src/lv2.json
Normal file
10
examples/fx_clip/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
97
examples/fx_clip/src/plugin.h
Normal file
97
examples/fx_clip/src/plugin.h
Normal 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;
|
||||
}
|
||||
}
|
46
examples/fx_clip/src/product.json
Normal file
46
examples/fx_clip/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_clip/src/vst3.json
Normal file
11
examples/fx_clip/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "51612ca35f5744b1baadb76adc81ba96"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "442600725f304e6a9d07783b04446e48"
|
||||
},
|
||||
"subCategory": "Fx|Distortion"
|
||||
}
|
||||
}
|
5
examples/fx_comb/src/android.json
Normal file
5
examples/fx_comb/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_comb"
|
||||
}
|
||||
}
|
5
examples/fx_comb/src/daisy-seed.json
Normal file
5
examples/fx_comb/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16, 17, 18, 19 ]
|
||||
}
|
||||
}
|
5
examples/fx_comb/src/ios.json
Normal file
5
examples/fx_comb/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_comb"
|
||||
}
|
||||
}
|
10
examples/fx_comb/src/lv2.json
Normal file
10
examples/fx_comb/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
83
examples/fx_comb/src/plugin.h
Normal file
83
examples/fx_comb/src/plugin.h
Normal 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);
|
||||
}
|
78
examples/fx_comb/src/product.json
Normal file
78
examples/fx_comb/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_comb/src/vst3.json
Normal file
11
examples/fx_comb/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "3347f70263444985b2010e0e7fd7cd3f"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "572a5d3be47d4315a58354cb4d288e0c"
|
||||
},
|
||||
"subCategory": "Fx|Delay"
|
||||
}
|
||||
}
|
5
examples/fx_comp/src/android.json
Normal file
5
examples/fx_comp/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_comp"
|
||||
}
|
||||
}
|
5
examples/fx_comp/src/daisy-seed.json
Normal file
5
examples/fx_comp/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15, 16, 17, 18, 19, 20 ]
|
||||
}
|
||||
}
|
5
examples/fx_comp/src/ios.json
Normal file
5
examples/fx_comp/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_comp"
|
||||
}
|
||||
}
|
10
examples/fx_comp/src/lv2.json
Normal file
10
examples/fx_comp/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
91
examples/fx_comp/src/plugin.h
Normal file
91
examples/fx_comp/src/plugin.h
Normal 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);
|
||||
}
|
102
examples/fx_comp/src/product.json
Normal file
102
examples/fx_comp/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_comp/src/vst3.json
Normal file
11
examples/fx_comp/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "4fcae287e903438aa1b2105e4627aa7e"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "9d41e55b70a04f31a4e27ce6cc0337d5"
|
||||
},
|
||||
"subCategory": "Fx|Dynamics"
|
||||
}
|
||||
}
|
5
examples/fx_delay/src/android.json
Normal file
5
examples/fx_delay/src/android.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"android": {
|
||||
"javaPackageName": "com.orastron.bw_example_fx_delay"
|
||||
}
|
||||
}
|
5
examples/fx_delay/src/daisy-seed.json
Normal file
5
examples/fx_delay/src/daisy-seed.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"daisy_seed": {
|
||||
"parameterPins": [ 15 ]
|
||||
}
|
||||
}
|
5
examples/fx_delay/src/ios.json
Normal file
5
examples/fx_delay/src/ios.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ios": {
|
||||
"productBundleIdentifier": "com.orastron.bw_example_fx_delay"
|
||||
}
|
||||
}
|
10
examples/fx_delay/src/lv2.json
Normal file
10
examples/fx_delay/src/lv2.json
Normal 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"
|
||||
}
|
||||
}
|
68
examples/fx_delay/src/plugin.h
Normal file
68
examples/fx_delay/src/plugin.h
Normal 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);
|
||||
}
|
37
examples/fx_delay/src/product.json
Normal file
37
examples/fx_delay/src/product.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
11
examples/fx_delay/src/vst3.json
Normal file
11
examples/fx_delay/src/vst3.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"vst3": {
|
||||
"plugin": {
|
||||
"cid": "2656cc61b746463d8ff7dfa41aa4d426"
|
||||
},
|
||||
"controller": {
|
||||
"cid": "64fb08db42e64a6aae3fe30a55363bb6"
|
||||
},
|
||||
"subCategory": "Fx|Delay"
|
||||
}
|
||||
}
|
5
examples/fx_dist/src/android.json
Normal file
5
examples/fx_dist/src/android.json
Normal 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
Loading…
Reference in New Issue
Block a user