0657baff2ac4952e5de6795d4c3f1438d6850cba
1 #include "mdaPianoVoice.h"
3 mdaPianoVoice::mdaPianoVoice(double rate
, Sample
* master_samples
, KGRP
* master_kgrp
) {
8 samples
= master_samples
;
11 default_preset
[p_offset(p_envelope_decay
)] = 0.500f
;
12 default_preset
[p_offset(p_envelope_release
)] = 0.500f
;
13 default_preset
[p_offset(p_hardness_offset
)] = 0.500f
;
14 default_preset
[p_offset(p_velocity_to_hardness
)] = 0.500f
;
15 default_preset
[p_offset(p_muffling_filter
)] = 0.803f
;
16 default_preset
[p_offset(p_velocity_to_muffling
)] = 0.251f
;
17 default_preset
[p_offset(p_velocity_sensitivity
)] = 0.376f
;
18 default_preset
[p_offset(p_stereo_width
)] = 0.500f
;
19 default_preset
[p_offset(p_polyphony
)] = 0.330f
;
20 default_preset
[p_offset(p_fine_tuning
)] = 0.500f
;
21 default_preset
[p_offset(p_random_detuning
)] = 0.246f
;
22 default_preset
[p_offset(p_stretch_tuning
)] = 0.500f
;
29 float mdaPianoVoice::p_helper(unsigned short id
, Param d
) {
31 return default_preset
[p_offset(id
)];
37 void mdaPianoVoice::on(unsigned char key
, unsigned char velocity
) {
38 // store key that turned this voice on (used in 'get_key')
47 k
= (key
- 60) * (key
- 60);
48 l
= fine
+ random
* ((float)(k
% 13) - 6.5f
); //random & fine tune
49 if(key
> 60) l
+= stretch
* (float)k
; //stretch
52 if(velocity
> 40) s
+= (uint32_t)(sizevel
* (float)(velocity
- 40));
55 while(key
> (kgrp
[k
].high
+ s
)) k
++; // find keygroup
56 sample_index
= k
; // store sample index
58 l
+= (float)(key
- kgrp
[k
].root
); // pitch
59 l
= 22050.0f
* iFs
* (float)exp(0.05776226505 * l
);
60 delta
= (uint32_t)(65536.0f
* l
);
63 end
= samples
[sample_index
].size
;
64 loop
= kgrp
[sample_index
].loop
;
66 env
= (0.5f
+ velsens
) * (float)pow(0.0078f
* velocity
, velsens
); //velocity
68 l
= 50.0f
+ *p(p_muffling_filter
) * *p(p_muffling_filter
) * muff
+ muffvel
* (float)(velocity
- 64); //muffle
69 if(l
< (55.0f
+ 0.25f
* (float)key
)) l
= 55.0f
+ 0.25f
* (float)key
;
70 if(l
> 210.0f
) l
= 210.0f
;
75 if(key
< 12) key
= 12;
76 if(key
> 108) key
= 108;
78 outr
= l
+ l
* width
* (float)(key
- 60);
81 if(key
< 44) key
= 44; //limit max decay length
82 l
= 2.0f
* *p(p_envelope_decay
);
83 if(l
< 1.0f
) l
+= 0.25f
- 0.5f
* *p(p_envelope_decay
);
84 dec
= (float)exp(-iFs
* exp(-0.6 + 0.033 * (double)key
- l
));
86 // some keyboards send note off events as 'note on' with velocity 0
92 void mdaPianoVoice::reset() {
99 m_key
= LV2::INVALID_KEY
;
103 void mdaPianoVoice::release(unsigned char velocity
) {
105 //no release on highest notes
106 if(m_key
< 94 || m_key
== SUSTAIN
) {
107 dec
= (float)exp(-iFs
* exp(2.0 + 0.017 * (double)m_key
- 2.0 * *p(p_envelope_release
)));
113 //Mark the voice to be turned off later. It may not be set to
114 //INVALID_KEY yet, because the release sound still needs to be
115 //rendered. m_key is finally set to INVALID_KEY by 'render' when
121 void mdaPianoVoice::render(uint32_t from
, uint32_t to
) {
122 // abort if no key is pressed
123 // initially m_key is INVALID_KEY, so no sound will be rendered
124 if (m_key
== LV2::INVALID_KEY
)
131 for (uint32_t frame
= from
; frame
< to
; ++frame
) {
132 // initialize left and right output
135 frac
+= delta
; // integer-based linear interpolation
138 if(pos
> end
) pos
-= loop
;
140 i
= samples
[sample_index
].buffer
[pos
];
141 i
= (i
<< 7) + (frac
>> 9) * (samples
[sample_index
].buffer
[pos
+ 1] - i
) + 0x40400000;
142 x
= env
* (*(float *)&i
- 3.0f
); //fast int->float
144 env
= env
* dec
; //envelope
145 f0
+= ff
* (x
+ f1
- f0
); //muffle filter
153 x
= cdep
* comb
[cpos
]; //stereo simulator
156 p(p_left
)[frame
] += l
+ x
;
157 p(p_right
)[frame
] += r
- x
;
160 // turn off further processing when the envelope has rendered the voice silent
162 m_key
= LV2::INVALID_KEY
;
167 void mdaPianoVoice::update(Param par
) {
168 size
= (uint32_t)(12.0f
* p_helper(p_hardness_offset
, par
) - 6.0f
);
169 sizevel
= 0.12f
* p_helper(p_velocity_to_hardness
, par
);
170 muffvel
= p_helper(p_velocity_to_muffling
, par
) * p_helper(p_velocity_to_muffling
, par
) * 5.0f
;
172 velsens
= 1.0f
+ p_helper(p_velocity_sensitivity
, par
) + p_helper(p_velocity_sensitivity
, par
);
173 if(p_helper(p_velocity_sensitivity
, par
) < 0.25f
) {
174 velsens
-= 0.75f
- 3.0f
* p_helper(p_velocity_sensitivity
, par
);
177 fine
= p_helper(p_fine_tuning
, par
) - 0.5f
;
178 random
= 0.077f
* p_helper(p_random_detuning
, par
) * p_helper(p_random_detuning
, par
);
179 stretch
= 0.000434f
* (p_helper(p_stretch_tuning
, par
) - 0.5f
);
181 cdep
= p_helper(p_stereo_width
, par
) * p_helper(p_stereo_width
, par
);
182 trim
= 1.50f
- 0.79f
* cdep
;
183 width
= 0.04f
* p_helper(p_stereo_width
, par
); if(width
> 0.03f
) width
= 0.03f
;
185 poly
= 8 + (uint32_t)(24.9f
* p_helper(p_polyphony
, par
));