1//BOSS OC-2 partial emulation.
2//This file uses data from oc_2.include.
3//*.include file was generated using oc_2.py.
4//Also, see schematic description in the .odg file
5
6import("stdfaust.lib");
7
8import("../../../tools/plugins/oc_2/oc_2.lib");
9
10//Filters
11f1 = _:fi.iir((b0_f1,b1_f1,b2_f1,b3_f1),(a1_f1,a2_f1,a3_f1)):_;
12f2 = _:fi.iir((b0_f2,b1_f2,b2_f2,b3_f2),(a1_f2,a2_f2,a3_f2)):_;
13f3 = _:fi.iir((b0_f3,b1_f3,b2_f3,b3_f3),(a1_f3,a2_f3,a3_f3)):_;
14
15//Switch implementation
16switch_impl(x, state) = select2((state >= 1.7),sw_opened(x),sw_closed(x));
17
18//Trigger fi.integrator
19fint=_:fi.iir((b0_fint,b1_fint),(a1_fint)):_;
20
21//Trigger prefilters
22f4_11=_:fi.iir((b0_f41_1,b1_f41_1),(a1_f41_1)):_;
23f4_12=_:fi.iir((b0_f41_2,b1_f41_2),(a1_f41_2)):_;
24
25f4_2=_:fi.iir((b0_f42,b1_f42,b2_f42),(a1_f42,a2_f42)):_;
26
27f4=_<:f4_2,(f4_11:f4_12):_,_;
28
29//Frequency divider
30X = (_,_)<:(!,_,_,!);
31
32comparator(plus,minus)=(0.005 + plus) > minus,-4,4:select2:_;
33cmos = ffunction(float FF_D_4013_2 (float, float), "triggers_logic.h", "");
34div1 = ffunction(float FF_D_4013_1 (float), "triggers_logic.h", "");
35div2 = ffunction(float FF_JK_4027 (float), "triggers_logic.h", "");
36
37//Rectifier
38hist_plus = _<:_>0,0,_:select2:_;
39hist_minus = _<:_<0,0,_:select2:_;
40
41rectifier_plus = hist_plus:fint;
42rectefier_minus = hist_minus:fint;
43
44c0 = _<:rectifier_plus,rectefier_minus:_,_;
45trigger = fi.dcblocker:_<:f4:_,(_<:_,_):_,_,_:X,_:_,(_<:_,_),_:(rectifier_plus,_:comparator),(_,rectefier_minus:comparator);
46
47freq_divider = _:trigger:cmos:div1<:_,_:_,div2;
48
49//Controls
50p_oc1 = hslider("OCTAVE 1", 0.5, 0, 1, 0.05);
51p_oc2 = hslider("OCTAVE 2", 0.5, 0, 1, 0.05);
52p_direct = hslider("DIRECT", 0.5, 0, 1, 0.05);
53
54wet_part = _,_:_,f1:_,(_:freq_divider):(switch_impl),_:((f2<:_,_),_):_,(switch_impl):_,_:_,f3:_,_;
55effect = _:_*(1+10/2.7):_<:_,_,_:(_*p_direct),(wet_part):_,_*p_oc1,_*p_oc2:>_;
56process = effect;
57