2 TiMidity++ -- MIDI to WAVE converter and player
3 Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4 Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #endif /* HAVE_CONFIG_H */
46 #include "int_synth.h"
50 #define MYINI_LIBRARY_DEFIND_VAR
53 #if defined(IA_W32GUI) || defined(IA_W32G_SYN) || defined(KBTIM) || defined(WINVSTI)
54 #pragma comment(lib, "shlwapi.lib")
59 timidity
\82Ì
\93®
\8dì
\82Ì
\82½
\82ßSample
\90Ý
\92è
\82Æ
\89¹
\90F
\90Ý
\92è
\82ð
\83\8d\81[
\83h
60 Sample
\90Ý
\92è
\82Í extract_hoge_file(file, preset_number)
\82Å
\83\8d\81[
\83h
61 \89¹
\90F
\90Ý
\92è
\82Íextract
\82Åini
\82©
\82ç
\83\8d\81[
\83h
62 SCC/MMS
\82Í
\95K
\97v
\82È
\95ª
\82¾
\82¯
\83\8d\81[
\83h SCC_DATA
\82ÍSCC/MMS
\8b¤
\92Ê
\82È
\82Ì
\82Å
\91S
\83\8d\81[
\83h LA_DATA
\82ÍMMS
\82Ìextract
\8f\89\89ñ
\82Å
\83\8d\81[
\83h
65 int32 opt_int_synth_sine = 0;
66 int32 opt_int_synth_rate = 0;
67 int32 opt_int_synth_update = 0;
74 #define POW2(val) exp((float)(M_LN2 * val))
76 #define POW2(val) pow(2.0, val)
80 static IS_RS_DATA_T is_resample_buffer[AUDIO_BUFFER_SIZE + 8]; // + 8 oversampling
83 static int la_pcm_data_load_flg = 0; //
85 #define MT32_PCM_ROM_SIZE (512 * 1024) // rom 512kB
86 #define MT32_PCM_SIZE (MT32_PCM_ROM_SIZE / 2) // rom 512kB 16bit 262144sample
87 static FLOAT_T mt32_pcm_data[MT32_PCM_SIZE + 1];
88 static Info_PCM mt32_pcm_inf[MT32_DATA_MAX];
90 #define CM32L_PCM_ROM_SIZE (1024 * 1024) // rom 1MB
91 #define CM32L_PCM_SIZE (CM32L_PCM_ROM_SIZE / 2) // rom 1MB 16bit 524288sample
92 static FLOAT_T cm32l_pcm_data[CM32L_PCM_SIZE + 1];
93 static Info_PCM cm32l_pcm_inf[CM32L_DATA_MAX];
94 //#define PCM_FILE_OUT // convert signed 32bit PCM RAW out
95 #define LA_CONTROL_ROM_SIZE (64 * 1024) // rom 64kB
98 const char *osc_wave_name[];
102 //////// synth lite mode
104 static int thru_count_mlt = 1;
106 static void init_int_synth_lite(void)
108 if(opt_int_synth_update >= 100){
109 thru_count_mlt = 100;
110 }else if(opt_int_synth_update <= 1){
117 //////// synth sample rate (resample
119 const FLOAT_T is_output_level = (FLOAT_T)M_15BIT;
120 static int32 prev_opt_int_synth_rate = -2;
121 static FLOAT_T is_sample_rate = 0;
122 static FLOAT_T div_is_sample_rate = 0;
123 static FLOAT_T is_sample_rate_ms = 0;
125 const int32 is_fraction = (1L << FRACTION_BITS);
126 const FLOAT_T div_is_fraction = (FLOAT_T)1.0 / (FLOAT_T)(1L << FRACTION_BITS);
127 const int is_rs_buff_offset = 2; // linear
128 const int is_rs_over_sampling = 2; // normal 2~8 // optimize x2
129 static FLOAT_T div_is_rs_over_sampling = 1.0;
130 static int is_rs_mode = 0;
131 static int32 is_rs_increment = (1L << FRACTION_BITS);
133 static void set_sample_rate(void)
135 FLOAT_T resample_ratio = 1.0;
137 div_is_rs_over_sampling = 1.0 / (FLOAT_T)is_rs_over_sampling;
139 if(opt_int_synth_rate == 0 || opt_int_synth_rate == play_mode->rate){
140 is_rs_mode = 0; // no resample
141 is_sample_rate = play_mode->rate;
142 div_is_sample_rate = div_playmode_rate;
143 is_sample_rate_ms = playmode_rate_ms;
144 resample_ratio = 1.0;
145 is_rs_increment = is_fraction;
146 }else if(opt_int_synth_rate == -1){
147 is_rs_mode = 1; // up resample , play_mode->rate / 2
148 is_sample_rate = play_mode->rate / 2;
149 div_is_sample_rate = 1.0 / is_sample_rate;
150 is_sample_rate_ms = is_sample_rate * DIV_1000;
151 resample_ratio = is_sample_rate * div_playmode_rate * div_is_rs_over_sampling;
152 is_rs_increment = resample_ratio * is_fraction;
153 }else if(opt_int_synth_rate < 0){
154 is_rs_mode = 2; // down resample , play_mode->rate * 2
155 is_sample_rate = play_mode->rate * -opt_int_synth_rate;
156 div_is_sample_rate = 1.0 / is_sample_rate;
157 is_sample_rate_ms = is_sample_rate * DIV_1000;
158 resample_ratio = is_sample_rate * div_playmode_rate * div_is_rs_over_sampling;
159 is_rs_increment = resample_ratio * is_fraction;
160 }else if(opt_int_synth_rate < play_mode->rate){
161 is_rs_mode = 1; // up resample
162 is_sample_rate = opt_int_synth_rate;
163 div_is_sample_rate = 1.0 / is_sample_rate;
164 is_sample_rate_ms = is_sample_rate * DIV_1000;
165 resample_ratio = is_sample_rate * div_playmode_rate * div_is_rs_over_sampling;
166 is_rs_increment = resample_ratio * is_fraction;
168 is_rs_mode = 2; // down resample
169 is_sample_rate = opt_int_synth_rate;
170 div_is_sample_rate = 1.0 / is_sample_rate;
171 is_sample_rate_ms = is_sample_rate * DIV_1000;
172 resample_ratio = is_sample_rate * div_playmode_rate * div_is_rs_over_sampling;
173 is_rs_increment = resample_ratio * is_fraction;
176 if((compute_buffer_size * resample_ratio + 1) * is_rs_over_sampling >= AUDIO_BUFFER_SIZE){ // mono is_resample_buffer[] size
177 is_rs_mode = 0; // no resample
178 is_sample_rate = play_mode->rate;
179 div_is_sample_rate = div_playmode_rate;
180 is_sample_rate_ms = playmode_rate_ms;
181 is_rs_increment = is_fraction;
186 static inline void is_resample_init(Info_Resample *rs)
195 static inline void is_resample_pre(Info_Resample *rs, IS_RS_DATA_T *rs_buf, int32 count)
197 rs->rs_count = (rs->offset + is_rs_increment * count * is_rs_over_sampling) >> FRACTION_BITS;
198 rs_buf[0] = rs->data[0];
199 rs_buf[1] = rs->data[1];
202 #if 1 // optimize over sampling x2
204 static inline void is_resample_core(Info_Resample *rs, DATA_T *is_buf, IS_RS_DATA_T *rs_buf, int32 count)
207 int32 rs_ofs = rs->offset;
208 #if !(defined(_MSC_VER) || defined(MSC_VER))
209 int32 *ofsp1, *ofsp2;
212 #if (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_FLOAT) // double
\82à
\8eg
\82¦
\82é
\82¯
\82Ç
\82â
\82â
\92x
\82¢
\82Ì
\82Åfloat
\82Ì
\82Ý
213 { // offset:int32*4, resamp:float*4
214 const int32 is_rs_count_mask = ~(0x1);
215 const int32 count2 = count & is_rs_count_mask;
216 const __m128 vec_divf = _mm_set1_ps(div_is_fraction), vec_divo = _mm_set1_ps(DIV_15BIT), vec_div2 = _mm_set1_ps(DIV_2);
217 const __m128i vinc = _mm_set1_epi32(is_rs_increment * 4), vfmask = _mm_set1_epi32((int32)FRACTION_MASK);
218 const __m128i vinc2 = _mm_set_epi32(0, is_rs_increment, is_rs_increment * 2, is_rs_increment * 3);
219 __m128i vofs = _mm_sub_epi32(_mm_set1_epi32(rs_ofs), vinc2);
220 const __m128 vmout = _mm_set1_ps(is_output_level);
222 #if (USE_X86_EXT_INTRIN >= 8)
223 //
\8dÅ
\93K
\89»
\83\8c\81[
\83g = (
\83\8d\81[
\83h
\83f
\81[
\83^
\90\94 -
\8f\89\8aú
\83I
\83t
\83Z
\83b
\83g
\8f¬
\90\94\95\94\82Ì
\8dÅ
\91å
\92l(1
\96¢
\96\9e) -
\95â
\8aÔ
\83|
\83C
\83\93\83g
\90\94(linear
\82Í1) ) /
\83I
\83t
\83Z
\83b
\83g
\83f
\81[
\83^
\90\94
224 //
\83\8d\81[
\83h
\83f
\81[
\83^
\90\94\82Í_mm_permutevar_ps
\82Ì
\95Ï
\8a·
\8cã
\82Ì(float)
\82Ì4
\83Z
\83b
\83g
\82É
\82È
\82é
225 const int32 opt_inc1 = (1 << FRACTION_BITS) * (4 - 1 - 1) / 4; // (float*4) * 1
\83Z
\83b
\83g
226 const __m128i vvar1 = _mm_set1_epi32(1);
227 if(is_rs_increment < opt_inc1){ // 1
\83Z
\83b
\83g
228 for(; i < count2; i += 2) {
229 __m128 vfp, vv1, vv2, vec_out, tmp1;
230 __m128i vofsi1, vofsi2, vofsf, vofsib, vofsub1, vofsub2;
232 vofs = _mm_add_epi32(vofs, vinc);
233 vofsi1 = _mm_srli_epi32(vofs, FRACTION_BITS);
234 vofsi2 = _mm_add_epi32(vofsi1, vvar1);
235 vofsf = _mm_and_si128(vofs, vfmask);
236 vfp = _mm_mul_ps(_mm_cvtepi32_ps(vofsf), vec_divf); // int32 to float // calc fp
237 ofs0 = _mm_cvtsi128_si32(vofsi1);
238 #if defined(IS_RS_DATA_T_DOUBLE)
239 tmp1 = _mm256_cvtpd_ps(_mm256_loadu_pd(&rs_buf[ofs0])); //
\83\8d\81[
\83h
240 #else // defined(IS_RS_DATA_T_FLOAT)
241 tmp1 = _mm_loadu_ps(&rs_buf[ofs0]); //
\83\8d\81[
\83h
242 #endif // !(defined(_MSC_VER) || defined(MSC_VER))
243 vofsib = _mm_shuffle_epi32(vofsi1, 0x0);
244 vofsub1 = _mm_sub_epi32(vofsi1, vofsib);
245 vofsub2 = _mm_sub_epi32(vofsi2, vofsib);
246 vv1 = _mm_permutevar_ps(tmp1, vofsub1); // v1 ofsi
247 vv2 = _mm_permutevar_ps(tmp1, vofsub2); // v2 ofsi+1
248 vec_out = MM_FMA_PS(_mm_sub_ps(vv2, vv1), vfp, vv1); // out
250 vec_out = _mm_add_ps(_mm_shuffle_ps(vec_out, vec_out, 0xD8), _mm_shuffle_ps(vec_out, vec_out, 0x8D)); // [0+1,2+3,2+0,3+1]=[0,2,1,3]+[1,3,0,2]
251 vec_out = _mm_mul_ps(vec_out , vec_div2);
253 #if defined(DATA_T_DOUBLE)
254 _mm_storeu_pd(&is_buf[i], _mm_cvtps_pd(vec_out));
255 #elif defined(DATA_T_FLOAT)
256 _mm_storel_ps(&is_buf[i], vec_out);
257 #else // DATA_T_INT32
258 vec_out = _mm_mul_ps(vec_out, vmout);
259 _mm_storeu_si128((__m128i *)&is_buf[i], _mm_cvtps_epi32(vec_out)); // only L64bit
260 #endif // DATA_T_INT32
261 rs_ofs = MM_EXTRACT_EPI32(vofs, 0x3);
265 for(; i < count2; i += 2) {
266 __m128 vfp, vv1, vv2, tmp1, tmp2, tmp3, tmp4, vec_out;
267 __m128i vofsi, vofsf;
268 vofs = _mm_add_epi32(vofs, vinc);
269 vofsi = _mm_srli_epi32(vofs, FRACTION_BITS);
270 vofsf = _mm_and_si128(vofs, vfmask);
271 vfp = _mm_mul_ps(_mm_cvtepi32_ps(vofsf), vec_divf); // int32 to float // calc fp
272 #if defined(IS_RS_DATA_T_DOUBLE)
273 tmp1 = _mm_cvtpd_ps(_mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,0)])); // ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
274 tmp2 = _mm_cvtpd_ps(_mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,1)])); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
275 tmp3 = _mm_cvtpd_ps(_mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,2)])); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
276 tmp4 = _mm_cvtpd_ps(_mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,3)])); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
277 tmp1 = _mm_shuffle_ps(tmp1, tmp2, 0x44);
278 tmp3 = _mm_shuffle_ps(tmp3, tmp4, 0x44);
279 #else // defined(IS_RS_DATA_T_FLOAT)
280 tmp1 = _mm_loadl_pi(tmp1, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,0)]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
281 tmp1 = _mm_loadh_pi(tmp1, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,1)]); // H64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
282 tmp3 = _mm_loadl_pi(tmp3, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,2)]); // L64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
283 tmp3 = _mm_loadh_pi(tmp3, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,3)]); // H64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
285 vv1 = _mm_shuffle_ps(tmp1, tmp3, 0x88); // v1[0,1,2,3] // ofsi
\82Ív1
\82É
286 vv2 = _mm_shuffle_ps(tmp1, tmp3, 0xdd); // v2[0,1,2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
287 vec_out = MM_FMA_PS(_mm_sub_ps(vv2, vv1), vfp, vv1);
289 vec_out = _mm_add_ps(_mm_shuffle_ps(vec_out, vec_out, 0xD8), _mm_shuffle_ps(vec_out, vec_out, 0x8D)); // [0+1,2+3,2+0,3+1]=[0,2,1,3]+[1,3,0,2]
290 vec_out = _mm_mul_ps(vec_out , vec_div2);
292 #if defined(DATA_T_DOUBLE)
293 _mm_storeu_pd(&is_buf[i], _mm_cvtps_pd(vec_out));
294 #elif defined(DATA_T_FLOAT)
295 _mm_storel_ps(&is_buf[i], vec_out);
296 #else // DATA_T_INT32
297 vec_out = _mm_mul_ps(vec_out, vmout);
298 _mm_storeu_si128((__m128i *)&is_buf[i], _mm_cvtps_epi32(vec_out)); // only L64bit
299 #endif // DATA_T_INT32
301 rs_ofs = MM_EXTRACT_EPI32(vofs, 0x3);
304 #elif (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_DOUBLE)
305 { // offset:int32*4, resamp:double*2*2
306 const int32 is_rs_count_mask = ~(0x1);
307 const int32 count2 = count & is_rs_count_mask;
308 const __m128d vec_divf = _mm_set1_pd(div_is_fraction), vec_divo = _mm_set1_pd(DIV_15BIT), vec_div2 = _mm_set1_pd(DIV_2);
309 const __m128i vinc = _mm_set1_epi32(is_rs_increment * 4), vfmask = _mm_set1_epi32((int32)FRACTION_MASK);
310 const __m128i vinc2 = _mm_set_epi32(0, is_rs_increment, is_rs_increment * 2, is_rs_increment * 3);
311 __m128i vofs = _mm_sub_epi32(_mm_set1_epi32(rs_ofs), vinc2);
312 const __m128d vmout = _mm_set1_pd(is_output_level);
313 for(; i < count2; i += 2) {
314 __m128d vfp1, vfp2, vv11, vv12, vv21, vv22, tmp1, tmp2, tmp3, tmp4, vec_out1, vec_out2;
315 __m128i vofsi, vofsf;
316 vofs = _mm_add_epi32(vofs, vinc);
317 vofsi = _mm_srli_epi32(vofs, FRACTION_BITS);
318 vofsf = _mm_and_si128(vofs, vfmask);
319 vfp1 = _mm_mul_pd(_mm_cvtepi32_pd(vofsf), vec_divf); // int32 to double // calc fp
320 vfp2 = _mm_mul_pd(_mm_cvtepi32_pd(_mm_shuffle_epi32(vofsf, 0x4E)), vec_divf); // int32 to double // calc fp
321 tmp1 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,0)]); // ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
322 tmp2 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,1)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
323 tmp3 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,2)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
324 tmp4 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,3)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
325 vv11 = _mm_shuffle_pd(tmp1, tmp2, 0x00); // v1[0,1] // ofsi
\82Ív1
\82É
326 vv21 = _mm_shuffle_pd(tmp1, tmp2, 0x03); // v2[0,1] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
327 vv12 = _mm_shuffle_pd(tmp3, tmp4, 0x00); // v1[2,3] // ofsi
\82Ív1
\82É
328 vv22 = _mm_shuffle_pd(tmp3, tmp4, 0x03); // v2[2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
329 vec_out1 = MM_FMA_PD(_mm_sub_pd(vv21, vv11), vfp1, vv11); // out[0,1]
330 vec_out2 = MM_FMA_PD(_mm_sub_pd(vv22, vv12), vfp2, vv12); // out[2,3]
332 vec_out1 = _mm_add_pd(_mm_shuffle_pd(vec_out1, vec_out2, 0x0), _mm_shuffle_pd(vec_out1, vec_out2, 0x3)); // [0+1,2+3]=[0,2]+[1,3]
333 vec_out1 = _mm_mul_pd(vec_out1 , vec_div2);
335 #if defined(DATA_T_DOUBLE)
336 _mm_storeu_pd(&is_buf[i], vec_out1);
337 #elif defined(DATA_T_FLOAT)
338 _mm_storel_pi(&is_buf[i], _mm_shuffle_ps(_mm_cvtpd_ps(vec_out1), _mm_cvtpd_ps(vec_out2), 0x44)); // 2set
339 #else // DATA_T_INT32
340 _mm_storeu_si128((__m128i *)&is_buf[i], _mm_cvtpd_epi32(_mm_mul_pd(vec_out1, vmout))); // L64bit
341 #endif // DATA_T_INT32
343 rs_ofs = MM_EXTRACT_EPI32(vofs, 0x3);
346 #elif (USE_X86_EXT_INTRIN >= 2)
347 { // offset:int32*4, resamp:float*4, output:*2
348 const int32 is_rs_count_mask = ~(0x1);
349 int32 count2 = count & is_rs_count_mask;
350 __m128 vec_divf = _mm_set1_ps((float)div_is_fraction), vec_div2 = _mm_set1_ps(DIV_2);
352 const __m128 vmout = _mm_set1_ps(is_output_level);
353 for(; i < count2; i += 2) {
355 __m128 vec_out, vv1, vv2, vfp;
356 #if defined(IS_RS_DATA_T_DOUBLE)
357 ALIGN float tmp1[4], tmp2[4], tmpfp[4];
358 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
359 tmp1[0] = (float)rs_buf[ofsi], tmp2[0] = (float)rs_buf[++ofsi], tmpfp[0] = (float)(rs_ofs & FRACTION_MASK);
360 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
361 tmp1[1] = (float)rs_buf[ofsi], tmp2[1] = (float)rs_buf[++ofsi], tmpfp[1] = (float)(rs_ofs & FRACTION_MASK);
362 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
363 tmp1[2] = (float)rs_buf[ofsi], tmp2[2] = (float)rs_buf[++ofsi], tmpfp[2] = (float)(rs_ofs & FRACTION_MASK);
364 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
365 tmp1[3] = (float)rs_buf[ofsi], tmp2[3] = (float)rs_buf[++ofsi], tmpfp[3] = (float)(rs_ofs & FRACTION_MASK);
366 vv1 = _mm_load_ps(tmp1);
367 vv2 = _mm_load_ps(tmp2);
368 vfp = _mm_load_ps(tmpfp);
369 #else // defined(IS_RS_DATA_T_FLOAT)
370 ALIGN float tmpfp[4];
371 __m128 tmp1, tmp2, tmp3, tmp4;
372 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
373 tmpfp[0] = (float)(rs_ofs & FRACTION_MASK);
374 tmp1 = _mm_loadu_ps(&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
375 tmp1 = _mm_loadl_pi(tmp1, (__m64 *)&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
376 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
377 tmpfp[1] = (float)(rs_ofs & FRACTION_MASK);
378 tmp1 = _mm_loadh_pi(tmp1, (__m64 *)&rs_buf[ofsi]); // H64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
379 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
380 tmpfp[2] = (float)(rs_ofs & FRACTION_MASK);
381 tmp3 = _mm_loadl_pi(tmp3, (__m64 *)&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
382 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
383 tmpfp[3] = (float)(rs_ofs & FRACTION_MASK);
384 tmp3 = _mm_loadh_pi(tmp3, (__m64 *)&rs_buf[ofsi]); // H64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
385 vv1 = _mm_shuffle_ps(tmp1, tmp3, 0x88); // v1[0,1,2,3] // ofsi
\82Ív1
\82É
386 vv2 = _mm_shuffle_ps(tmp1, tmp3, 0xdd); // v2[0,1,2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
387 vfp = _mm_load_ps(tmpfp);
389 vec_out = MM_FMA_PS(_mm_sub_ps(vv2, vv1), _mm_mul_ps(vfp, vec_divf), vv1);
391 vec_out = _mm_add_ps(_mm_shuffle_ps(vec_out, vec_out, 0xD8), _mm_shuffle_ps(vec_out, vec_out, 0x8D));
392 vec_out = _mm_mul_ps(vec_out , vec_div2);
394 #if defined(DATA_T_DOUBLE)
397 _mm_storeu_ps(out, vec_out);
398 is_buf[i] = (DATA_T)out[0];
399 is_buf[i + 1] = (DATA_T)out[2];
401 #elif defined(DATA_T_FLOAT)
402 _mm_storel_pi(&is_buf[i], vec_out);
404 vec_out = _mm_mul_ps(vec_out, vmout);
405 is_buf[i] = _mm_cvt_ss2si(vec_out);
406 is_buf[i + 1] = _mm_cvt_ss2si(_mm_shuffle_ps(vec_out, vec_out, 0xe5));
407 #endif // DATA_T_INT32
411 #endif // USE_X86_EXT_INTRIN
413 { // offset:int32*2, resamp:FLOAT_T*2, output:*1
415 FLOAT_T v11, v21, v12, v22, fp1, fp2, out1, out2;
418 for (; i < count; i++){
419 rs_ofs += is_rs_increment;
420 ofsi = rs_ofs >> FRACTION_BITS;
421 ofsf = rs_ofs & FRACTION_MASK;
422 rs_ofs += is_rs_increment;
423 ofsi2 = rs_ofs >> FRACTION_BITS;
424 ofsf2 = rs_ofs & FRACTION_MASK;
425 fp1 = (FLOAT_T)ofsf * div_is_fraction;
426 fp2 = (FLOAT_T)ofsf2 * div_is_fraction;
427 v11 = rs_buf[ofsi], v21 = rs_buf[ofsi + 1], fp1 = (FLOAT_T)ofsf * div_is_fraction;
428 v12 = rs_buf[ofsi], v22 = rs_buf[ofsi + 1], fp2 = (FLOAT_T)ofsf * div_is_fraction;
429 out1 = v11 + (v21 - v11) * fp1;
430 out2 = v12 + (v22 - v12) * fp2;
432 out1 = (out1 + out2) * DIV_2;
434 #if defined(DATA_T_DOUBLE) || defined(DATA_T_FLOAT)
436 #else // DATA_T_INT32
437 is_buf[i] = out1 * is_output_level;
438 #endif // DATA_T_INT32
442 ofsi = rs_ofs >> FRACTION_BITS;
443 rs->offset = rs_ofs & FRACTION_MASK;
444 #if (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_DOUBLE)
445 _mm_storeu_pd(rs->data, _mm_loadu_pd(&rs_buf[ofsi]));
446 #elif (USE_X86_EXT_INTRIN >= 2) && defined(IS_RS_DATA_T_FLOAT)
449 _mm_storel_pi(rs->data, _mm_loadl_pi(vtmp, (__m64 *)&rs_buf[ofsi]));
452 rs->data[0] = rs_buf[ofsi];
453 rs->data[1] = rs_buf[ofsi + 1]; // interpolate
458 #else // normal over sampling x2~x8
460 static void is_resample_down_sampling(DATA_T *ptr, int32 count)
464 switch(is_rs_over_sampling){
469 for(i = 0; i < count; i++){
471 FLOAT_T tmp = ptr[ofs] + ptr[ofs + 1];
472 ptr[i] = tmp * DIV_2;
476 #if (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE)
478 const __m128d divn = _mm_set1_pd(DIV_4);
479 for(i = 0; i < count; i += 4){
481 __m128d sum1 = _mm_load_pd(&ptr[ofs + 0]);
482 __m128d sum2 = _mm_load_pd(&ptr[ofs + 2]);
483 __m128d sum3 = _mm_load_pd(&ptr[ofs + 4]);
484 __m128d sum4 = _mm_load_pd(&ptr[ofs + 6]);
485 __m128d sum5 = _mm_load_pd(&ptr[ofs + 8]);
486 __m128d sum6 = _mm_load_pd(&ptr[ofs + 10]);
487 __m128d sum7 = _mm_load_pd(&ptr[ofs + 12]);
488 __m128d sum8 = _mm_load_pd(&ptr[ofs + 14]);
489 // ([1,2] [3,4]) ([5,6] [7,8])
490 sum1 = _mm_add_pd(sum1, sum2);
491 sum3 = _mm_add_pd(sum3, sum4);
492 sum5 = _mm_add_pd(sum5, sum6);
493 sum7 = _mm_add_pd(sum7, sum8);
494 sum2 = _mm_shuffle_pd(sum1, sum1, 0x1); // [v0v1] -> [v1v0]
495 sum4 = _mm_shuffle_pd(sum3, sum3, 0x1); // [v0v1] -> [v1v0]
496 sum6 = _mm_shuffle_pd(sum5, sum5, 0x1); // [v0v1] -> [v1v0]
497 sum8 = _mm_shuffle_pd(sum7, sum7, 0x1); // [v0v1] -> [v1v0]
498 sum1 = _mm_add_pd(sum1, sum2); // v0=v0+v1 v1=v1+v0
499 sum3 = _mm_add_pd(sum3, sum4); // v0=v0+v1 v1=v1+v0
500 sum5 = _mm_add_pd(sum5, sum6); // v0=v0+v1 v1=v1+v0
501 sum7 = _mm_add_pd(sum7, sum8); // v0=v0+v1 v1=v1+v0
502 sum1 = _mm_shuffle_pd(sum1, sum3, 0x0);
503 sum5 = _mm_shuffle_pd(sum5, sum7, 0x0);
504 sum1 = _mm_mul_pd(sum1, divn);
505 sum5 = _mm_mul_pd(sum5, divn);
506 _mm_store_pd(&ptr[i ], sum1);
507 _mm_store_pd(&ptr[i + 2], sum5);
511 for(i = 0; i < count; i++){
513 FLOAT_T tmp = ptr[ofs + 0] + ptr[ofs + 1] + ptr[ofs + 2] + ptr[ofs + 3];
514 ptr[i] = tmp * DIV_4;
519 #if (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE)
521 const __m128d divn = _mm_set1_pd(DIV_8);
522 for(i = 0; i < count; i += 4){
524 __m128d sum1 = _mm_load_pd(&ptr[ofs + 0]);
525 __m128d sum2 = _mm_load_pd(&ptr[ofs + 2]);
526 __m128d sum3 = _mm_load_pd(&ptr[ofs + 4]);
527 __m128d sum4 = _mm_load_pd(&ptr[ofs + 6]);
528 __m128d sum5 = _mm_load_pd(&ptr[ofs + 8]);
529 __m128d sum6 = _mm_load_pd(&ptr[ofs + 10]);
530 __m128d sum7 = _mm_load_pd(&ptr[ofs + 12]);
531 __m128d sum8 = _mm_load_pd(&ptr[ofs + 14]);
532 __m128d sum9 = _mm_load_pd(&ptr[ofs + 16]);
533 __m128d sum10 = _mm_load_pd(&ptr[ofs + 18]);
534 __m128d sum11 = _mm_load_pd(&ptr[ofs + 20]);
535 __m128d sum12 = _mm_load_pd(&ptr[ofs + 22]);
536 __m128d sum13 = _mm_load_pd(&ptr[ofs + 24]);
537 __m128d sum14 = _mm_load_pd(&ptr[ofs + 26]);
538 __m128d sum15 = _mm_load_pd(&ptr[ofs + 28]);
539 __m128d sum16 = _mm_load_pd(&ptr[ofs + 30]);
540 // ([1,2,3,4] [5,6,7,8]) ([9,10,11,12] [13,14,15,16])
541 sum1 = _mm_add_pd(sum1, sum2);
542 sum3 = _mm_add_pd(sum3, sum4);
543 sum5 = _mm_add_pd(sum5, sum6);
544 sum7 = _mm_add_pd(sum7, sum8);
545 sum9 = _mm_add_pd(sum9, sum10);
546 sum11 = _mm_add_pd(sum11, sum12);
547 sum13 = _mm_add_pd(sum13, sum14);
548 sum15 = _mm_add_pd(sum15, sum16);
549 sum1 = _mm_add_pd(sum1, sum3);
550 sum5 = _mm_add_pd(sum5, sum7);
551 sum9 = _mm_add_pd(sum9, sum11);
552 sum13 = _mm_add_pd(sum13, sum15);
553 sum2 = _mm_shuffle_pd(sum1, sum1, 0x1); // [v0v1] -> [v1v0]
554 sum6 = _mm_shuffle_pd(sum5, sum5, 0x1); // [v0v1] -> [v1v0]
555 sum10 = _mm_shuffle_pd(sum9, sum9, 0x1); // [v0v1] -> [v1v0]
556 sum14 = _mm_shuffle_pd(sum13, sum13, 0x1); // [v0v1] -> [v1v0]
557 sum1 = _mm_add_pd(sum1, sum2); // v0=v0+v1 v1=v1+v0
558 sum5 = _mm_add_pd(sum5, sum6); // v0=v0+v1 v1=v1+v0
559 sum9 = _mm_add_pd(sum9, sum10); // v0=v0+v1 v1=v1+v0
560 sum13 = _mm_add_pd(sum13, sum14); // v0=v0+v1 v1=v1+v0
561 sum1 = _mm_shuffle_pd(sum1, sum5, 0x0);
562 sum9 = _mm_shuffle_pd(sum9, sum13, 0x0);
563 sum1 = _mm_mul_pd(sum1, divn);
564 sum9 = _mm_mul_pd(sum9, divn);
565 _mm_store_pd(&ptr[i ], sum1);
566 _mm_store_pd(&ptr[i + 2], sum9);
570 for(i = 0; i < count; i++){
572 FLOAT_T tmp = ptr[ofs + 0] + ptr[ofs + 1] + ptr[ofs + 2] + ptr[ofs + 3]
573 + ptr[ofs + 4] + ptr[ofs + 5] + ptr[ofs + 6] + ptr[ofs + 7];
574 ptr[i] = tmp * DIV_8;
579 #if (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE)
581 const __m128d divn = _mm_set1_pd(DIV_16);
582 for(i = 0; i < count; i += 2){
584 __m128d sum1 = _mm_load_pd(&ptr[ofs + 0]);
585 __m128d sum2 = _mm_load_pd(&ptr[ofs + 2]);
586 __m128d sum3 = _mm_load_pd(&ptr[ofs + 4]);
587 __m128d sum4 = _mm_load_pd(&ptr[ofs + 6]);
588 __m128d sum5 = _mm_load_pd(&ptr[ofs + 8]);
589 __m128d sum6 = _mm_load_pd(&ptr[ofs + 10]);
590 __m128d sum7 = _mm_load_pd(&ptr[ofs + 12]);
591 __m128d sum8 = _mm_load_pd(&ptr[ofs + 14]);
592 __m128d sum9 = _mm_load_pd(&ptr[ofs + 16]);
593 __m128d sum10 = _mm_load_pd(&ptr[ofs + 18]);
594 __m128d sum11 = _mm_load_pd(&ptr[ofs + 20]);
595 __m128d sum12 = _mm_load_pd(&ptr[ofs + 22]);
596 __m128d sum13 = _mm_load_pd(&ptr[ofs + 24]);
597 __m128d sum14 = _mm_load_pd(&ptr[ofs + 26]);
598 __m128d sum15 = _mm_load_pd(&ptr[ofs + 28]);
599 __m128d sum16 = _mm_load_pd(&ptr[ofs + 30]);
600 // ([1,2,3,4,5,6,7,8] [9,10,11,12,13,14,15,16])
601 sum1 = _mm_add_pd(sum1, sum2);
602 sum3 = _mm_add_pd(sum3, sum4);
603 sum5 = _mm_add_pd(sum5, sum6);
604 sum7 = _mm_add_pd(sum7, sum8);
605 sum9 = _mm_add_pd(sum9, sum10);
606 sum11 = _mm_add_pd(sum11, sum12);
607 sum13 = _mm_add_pd(sum13, sum14);
608 sum15 = _mm_add_pd(sum15, sum16);
609 sum1 = _mm_add_pd(sum1, sum3);
610 sum5 = _mm_add_pd(sum5, sum7);
611 sum9 = _mm_add_pd(sum9, sum11);
612 sum13 = _mm_add_pd(sum13, sum15);
613 sum1 = _mm_add_pd(sum1, sum5);
614 sum9 = _mm_add_pd(sum9, sum13);
615 sum2 = _mm_shuffle_pd(sum1, sum1, 0x1); // [v0v1] -> [v1v0]
616 sum10 = _mm_shuffle_pd(sum9, sum9, 0x1); // [v0v1] -> [v1v0]
617 sum1 = _mm_add_pd(sum1, sum2); // v0=v0+v1 v1=v1+v0
618 sum9 = _mm_add_pd(sum9, sum10); // v0=v0+v1 v1=v1+v0
619 sum1 = _mm_shuffle_pd(sum1, sum9, 0x0);
620 sum1 = _mm_mul_pd(sum1, divn);
621 _mm_store_pd(&ptr[i], sum1);
625 for(i = 0; i < count; i++){
627 FLOAT_T tmp = ptr[ofs + 0] + ptr[ofs + 1] + ptr[ofs + 2] + ptr[ofs + 3]
628 + ptr[ofs + 4] + ptr[ofs + 5] + ptr[ofs + 6] + ptr[ofs + 7]
629 + ptr[ofs + 8] + ptr[ofs + 9] + ptr[ofs + 10] + ptr[ofs + 11]
630 + ptr[ofs + 12] + ptr[ofs + 13] + ptr[ofs + 14] + ptr[ofs + 15];
631 ptr[i] = tmp * DIV_16;
637 for(i = 0; i < count; i++){
638 int ofs = i * is_rs_over_sampling;
640 for(j = 0; j < is_rs_over_sampling; j++){
643 ptr[i] = tmp * div_is_rs_over_sampling;
650 static inline void is_resample_core(Info_Resample *rs, DATA_T *is_buf, IS_RS_DATA_T *rs_buf, int32 count)
653 int32 rs_ofs = rs->offset;
654 #if !(defined(_MSC_VER) || defined(MSC_VER))
655 int32 *ofsp1, *ofsp2;
658 #if (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_FLOAT) // SSE2~
659 { // offset:int32*4, resamp:float*4
660 const int32 is_rs_count_mask = ~(0x3);
661 int32 count2 = (count * is_rs_over_sampling) & is_rs_count_mask;
662 const __m128 vec_divf = _mm_set1_ps(div_is_fraction), vec_divo = _mm_set1_pd(DIV_15BIT);
663 const __m128i vinc = _mm_set1_epi32(is_rs_increment * 4), vfmask = _mm_set1_epi32((int32)FRACTION_MASK);
664 const __m128i vinc2 = _mm_set_epi32(0, is_rs_increment, is_rs_increment * 2, is_rs_increment * 3);
665 __m128i vofs = _mm_sub_epi32(_mm_set1_epi32(rs_ofs), vinc);
666 for(; i < count2; i += 4) {
667 __m128 vfp, vv1, vv2, tmp1, tmp2, tmp3, tmp4, vec_out;
668 __m128i vofsi, vosfsf;
669 vofs = _mm_add_epi32(vofs, vinc);
670 vofsi = _mm_srli_epi32(vofs, FRACTION_BITS);
671 vosfsf = _mm_and_si128(vofs, vfmask);
672 vfp = _mm_mul_ps(_mm_cvtepi32_ps(vosfsf), vec_divf); // int32 to float // calc fp
673 tmp1 = _mm_loadl_pi(tmp1, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi.0)]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
674 tmp1 = _mm_loadh_pi(tmp1, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,1)]); // H64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
675 tmp3 = _mm_loadl_pi(tmp3, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,2)]); // L64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
676 tmp3 = _mm_loadh_pi(tmp3, (__m64 *)&rs_buf[MM_EXTRACT_I32(vofsi,3)]); // H64bit
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
677 vv1 = _mm_shuffle_ps(tmp1, tmp3, 0x88); // v1[0,1,2,3] // ofsi
\82Ív1
\82É
678 vv2 = _mm_shuffle_ps(tmp1, tmp3, 0xdd); // v2[0,1,2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
679 vec_out = MM_FMA_PS(_mm_sub_ps(vv2, vv1), vfp, vv1);
680 #if defined(DATA_T_DOUBLE)
681 _mm_storeu_pd(&is_buf[i], _mm_cvtps_pd(vec_out));
682 _mm_storeu_pd(&is_buf[i + 2], _mm_cvtps_pd(_mm_movehl_ps(vec_out, vec_out)));
683 #elif defined(DATA_T_FLOAT)
684 _mm_storeu_ps(&is_buf[i], vec_out);
685 #else // DATA_T_INT32
686 vec_out = _mm_mul_ps(vec_out, _mm_set1_ps(is_output_level));
687 _mm_storeu_si128((__m128i *)&is_buf[i], _mm_cvtps_epi32(vec_out));
688 #endif // DATA_T_INT32
690 rs_ofs = MM_EXTRACT_EPI32(vofs, 0x3);
693 #elif (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_DOUBLE)
694 { // offset:int32*4, resamp:double*2*2
695 const int32 is_rs_count_mask = ~(0x3);
696 const int32 count2 = (count * is_rs_over_sampling) & is_rs_count_mask;
697 const __m128d vec_divf = _mm_set1_pd(div_is_fraction), vec_divo = _mm_set1_pd(DIV_15BIT);
698 const __m128i vinc = _mm_set1_epi32(is_rs_increment * 4), vfmask = _mm_set1_epi32((int32)FRACTION_MASK);
699 const __m128i vinc2 = _mm_set_epi32(0, is_rs_increment, is_rs_increment * 2, is_rs_increment * 3);
700 __m128i vofs = _mm_sub_epi32(_mm_set1_epi32(rs_ofs), vinc2);
701 for(; i < count2; i += 4) {
702 __m128d vfp1, vfp2, vv11, vv12, vv21, vv22, tmp1, tmp2, tmp3, tmp4, vec_out1, vec_out2;
703 __m128i vofsi, vosfsf;
704 vofs = _mm_add_epi32(vofs, vinc);
705 vofsi = _mm_srli_epi32(vofs, FRACTION_BITS);
706 vosfsf = _mm_and_si128(vofs, vfmask);
707 vfp1 = _mm_mul_pd(_mm_cvtepi32_pd(vosfsf), vec_divf); // int32 to double // calc fp
708 vfp2 = _mm_mul_pd(_mm_cvtepi32_pd(_mm_shuffle_epi32(vosfsf, 0x4E)), vec_divf); // int32 to double // calc fp
709 #if !(defined(_MSC_VER) || defined(MSC_VER))
710 ofsp1 = (int32 *)vofsi;
711 tmp1 = _mm_loadu_pd(&rs_buf[ofsp1[0]]); // ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
712 tmp2 = _mm_loadu_pd(&rs_buf[ofsp1[1]]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
713 tmp3 = _mm_loadu_pd(&rs_buf[ofsp1[2]]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
714 tmp4 = _mm_loadu_pd(&rs_buf[ofsp1[3]]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
716 tmp1 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,0)]); // ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
717 tmp2 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,1)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
718 tmp3 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,2)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
\93¯
\82¶
719 tmp4 = _mm_loadu_pd(&rs_buf[MM_EXTRACT_I32(vofsi,3)]); //
\8e\9f\8eü
\83T
\83\93\83v
\83\8b\82à
720 #endif // !(defined(_MSC_VER) || defined(MSC_VER))
721 vv11 = _mm_shuffle_pd(tmp1, tmp2, 0x00); // v1[0,1] // ofsi
\82Ív1
\82É
722 vv21 = _mm_shuffle_pd(tmp1, tmp2, 0x03); // v2[0,1] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
723 vv12 = _mm_shuffle_pd(tmp3, tmp4, 0x00); // v1[2,3] // ofsi
\82Ív1
\82É
724 vv22 = _mm_shuffle_pd(tmp3, tmp4, 0x03); // v2[2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
725 vec_out1 = MM_FMA_PD(_mm_sub_pd(vv21, vv11), vfp1, vv11);
726 vec_out2 = MM_FMA_PD(_mm_sub_pd(vv22, vv12), vfp2, vv12);
727 #if defined(DATA_T_DOUBLE)
728 _mm_storeu_pd(&is_buf[i], vec_out1);
729 _mm_storeu_pd(&is_buf[i + 2], vec_out2);
730 #elif defined(DATA_T_FLOAT)
731 _mm_storeu_ps(&is_buf[i], _mm_shuffle_ps(_mm_cvtpd_ps(vec_out1), _mm_cvtpd_ps(vec_out2), 0x44));
732 #else // DATA_T_INT32
734 __m128d vmout = _mm_set1_pd(is_output_level);
735 __m128i vec_out21 = _mm_cvtpd_epi32(_mm_mul_pd(vec_out1, vmout)); // L64bit
736 __m128i vec_out22 = _mm_shuffle_epi32(_mm_cvtpd_epi32(_mm_mul_pd(vec_out2, vmout)), 0x4e);// H64bit
737 _mm_storeu_si128((__m128i *)&is_buf[i], _mm_or_si128(vec_out21, vec_out22));
739 #endif // DATA_T_INT32
741 rs_ofs = MM_EXTRACT_EPI32(vofs, 0x3);
744 #elif (USE_X86_EXT_INTRIN >= 2)
745 { // offset:int32*4, resamp:float*4
746 const int32 is_rs_count_mask = ~(0x3);
747 int32 count2 = (count * is_rs_over_sampling) & is_rs_count_mask;
748 __m128 vec_divf = _mm_set1_ps((float)div_is_fraction);
749 for(; i < count2; i += 4) {
751 __m128 vec_out, vv1, vv2, vfp;
752 #if defined(IS_RS_DATA_T_DOUBLE)
753 ALIGN float tmp1[4], tmp2[4], tmpfp[4];
754 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
755 tmp1[0] = (float)rs_buf[ofsi], tmp2[0] = (float)rs_buf[++ofsi], tmpfp[0] = (float)(rs_ofs & FRACTION_MASK);
756 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
757 tmp1[1] = (float)rs_buf[ofsi], tmp2[1] = (float)rs_buf[++ofsi], tmpfp[1] = (float)(rs_ofs & FRACTION_MASK);
758 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
759 tmp1[2] = (float)rs_buf[ofsi], tmp2[2] = (float)rs_buf[++ofsi], tmpfp[2] = (float)(rs_ofs & FRACTION_MASK);
760 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
761 tmp1[3] = (float)rs_buf[ofsi], tmp2[3] = (float)rs_buf[++ofsi], tmpfp[3] = (float)(rs_ofs & FRACTION_MASK);
762 vv1 = _mm_load_ps(tmp1);
763 vv2 = _mm_load_ps(tmp2);
764 vfp = _mm_load_ps(tmpfp);
765 #else // defined(IS_RS_DATA_T_FLOAT)
766 ALIGN float tmpfp[4];
767 __m128 tmp1, tmp2, tmp3, tmp4;
768 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
769 tmpfp[0] = (float)(rs_ofs & FRACTION_MASK);
770 tmp1 = _mm_loadu_ps(&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
771 tmp1 = _mm_loadl_pi(tmp1, (__m64 *)&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
772 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
773 tmpfp[1] = (float)(rs_ofs & FRACTION_MASK);
774 tmp1 = _mm_loadh_pi(tmp1, (__m64 *)&rs_buf[ofsi]); // H64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
775 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
776 tmpfp[2] = (float)(rs_ofs & FRACTION_MASK);
777 tmp3 = _mm_loadl_pi(tmp3, (__m64 *)&rs_buf[ofsi]); // L64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
778 ofsi = (rs_ofs += is_rs_increment) >> FRACTION_BITS;
779 tmpfp[3] = (float)(rs_ofs & FRACTION_MASK);
780 tmp3 = _mm_loadh_pi(tmp3, (__m64 *)&rs_buf[ofsi]); // H64bit ofsi
\82Æofsi+1
\82ð
\83\8d\81[
\83h
781 vv1 = _mm_shuffle_ps(tmp1, tmp3, 0x88); // v1[0,1,2,3] // ofsi
\82Ív1
\82É
782 vv2 = _mm_shuffle_ps(tmp1, tmp3, 0xdd); // v2[0,1,2,3] // ofsi+1
\82Ív2
\82É
\88Ú
\93®
783 vfp = _mm_load_ps(tmpfp);
785 #if defined(DATA_T_DOUBLE)
788 _mm_storeu_ps(out, MM_FMA_PS(_mm_sub_ps(vv2, vv1), _mm_mul_ps(vfp, vec_divf), vv1));
789 is_buf[i] = (DATA_T)out[0];
790 is_buf[i + 1] = (DATA_T)out[1];
791 is_buf[i + 2] = (DATA_T)out[2];
792 is_buf[i + 3] = (DATA_T)out[3];
794 #elif defined(DATA_T_FLOAT)
795 _mm_storeu_ps(&is_buf[i], MM_FMA_PS(_mm_sub_ps(vv2, vv1), _mm_mul_ps(vfp, vec_divf), vv1));
798 vec_out = MM_FMA_PS(_mm_sub_ps(vv2, vv1), _mm_mul_ps(vfp, vec_divf), vv1);
799 vec_out = _mm_mul_ps(vec_out, _mm_seti_ps(is_output_level));
800 is_buf[i] = _mm_cvt_ss2si(vec_out);
801 is_buf[i + 1] = _mm_cvt_ss2si(_mm_shuffle_ps(vec_out, vec_out, 0xe5));
802 is_buf[i + 2] = _mm_cvt_ss2si(_mm_shuffle_ps(vec_out, vec_out, 0xea));
803 is_buf[i + 3] = _mm_cvt_ss2si(_mm_shuffle_ps(vec_out, vec_out, 0xff));
805 #endif // DATA_T_INT32
809 #endif // USE_X86_EXT_INTRIN
814 for (; i < (count * is_rs_over_sampling); i++){
815 rs_ofs += is_rs_increment;
816 ofsi = rs_ofs >> FRACTION_BITS;
817 ofsf = rs_ofs & FRACTION_MASK;
818 fp = (FLOAT_T)ofsf * div_is_fraction;
819 v1 = rs_buf[ofsi], v2 = rs_buf[ofsi + 1];
820 #if defined(DATA_T_DOUBLE) || defined(DATA_T_FLOAT)
821 is_buf[i] = v1 + (v2 - v1) * fp;
822 #else // DATA_T_INT32
823 is_buf[i] = (v1 + (v2 - v1) * fp) * is_output_level;
824 #endif // DATA_T_INT32
828 ofsi = rs_ofs >> FRACTION_BITS;
829 rs->offset = rs_ofs & FRACTION_MASK;
830 #if (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_DOUBLE)
831 _mm_storeu_pd(rs->data, _mm_loadu_pd(&rs_buf[ofsi]));
832 #elif (USE_X86_EXT_INTRIN >= 3) && defined(IS_RS_DATA_T_FLOAT)
835 _mm_storel_pi(rs->data, _mm_loadl_pi(vtmp, (__m64 *)&rs_buf[ofsi]));
838 rs->data[0] = rs_buf[ofsi];
839 rs->data[1] = rs_buf[ofsi + 1]; // interpolate
841 is_resample_down_sampling(is_buf, count);
846 #endif // over sampling
854 const FLOAT_T la_base_freq = 442.0 / 440.0 * 261.626; // mt32_master_tuning / timidity_master_tuning * timidity_note60
855 const FLOAT_T la_sample_rate = 32000;
856 const LA_Ctrl_ROM_Map LA_Ctrl_ROM_Maps[7] = {
857 // ID IDc IDbytes PCMmap PCMc tmbrA tmbrAO, tmbrAC tmbrB tmbrBO, tmbrBC tmbrR trC rhythm rhyC rsrv panpot prog rhyMax patMax sysMax timMax
858 {0x4014, 22, "\000 ver1.04 14 July 87 ", 0x3000, 128, 0x8000, 0x0000, 0x00, 0xC000, 0x4000, 0x00, 0x3200, 30, 0x73A6, 85, 0x57C7, 0x57E2, 0x57D0, 0x5252, 0x525E, 0x526E, 0x520A},
859 {0x4014, 22, "\000 ver1.05 06 Aug, 87 ", 0x3000, 128, 0x8000, 0x0000, 0x00, 0xC000, 0x4000, 0x00, 0x3200, 30, 0x7414, 85, 0x57C7, 0x57E2, 0x57D0, 0x5252, 0x525E, 0x526E, 0x520A},
860 {0x4014, 22, "\000 ver1.06 31 Aug, 87 ", 0x3000, 128, 0x8000, 0x0000, 0x00, 0xC000, 0x4000, 0x00, 0x3200, 30, 0x7414, 85, 0x57D9, 0x57F4, 0x57E2, 0x5264, 0x5270, 0x5280, 0x521C},
861 {0x4010, 22, "\000 ver1.07 10 Oct, 87 ", 0x3000, 128, 0x8000, 0x0000, 0x00, 0xC000, 0x4000, 0x00, 0x3200, 30, 0x73fe, 85, 0x57B1, 0x57CC, 0x57BA, 0x523C, 0x5248, 0x5258, 0x51F4}, // MT-32 revision 1
862 {0x4010, 22, "\000verX.XX 30 Sep, 88 ", 0x3000, 128, 0x8000, 0x0000, 0x00, 0xC000, 0x4000, 0x00, 0x3200, 30, 0x741C, 85, 0x57E5, 0x5800, 0x57EE, 0x5270, 0x527C, 0x528C, 0x5228}, // MT-32 Blue Ridge mod
863 {0x2205, 22, "\000CM32/LAPC1.00 890404", 0x8100, 256, 0x8000, 0x8000, 0x00, 0x8080, 0x8000, 0x00, 0x8500, 64, 0x8580, 85, 0x4F65, 0x4F80, 0x4F6E, 0x48A1, 0x48A5, 0x48BE, 0x48D5},
864 {0x2205, 22, "\000CM32/LAPC1.02 891205", 0x8100, 256, 0x8000, 0x8000, 0x01, 0x8080, 0x8000, 0x01, 0x8500, 64, 0x8580, 85, 0x4F93, 0x4FAE, 0x4F9C, 0x48CB, 0x48CF, 0x48E8, 0x48FF} // CM-32L
865 // (Note that all but CM-32L ROM actually have 86 entries for rhythmTemp)
868 const char *la_pcm_data_name[] = {
869 "Acoustic Bass Drum",
870 "Acoustic Snare Drum",
871 "Electric Snare Drum",
873 "Closed Hi-Hat Attack",
875 "Crash Cymbal Attack",
877 "Ride Cymbal Attack",
890 "Ham & Organ Attack",
923 "Loop 01 Acoustic Bass Drum",
924 "Loop 02 Acoustic Snare Drum",
925 "Loop 03 Electric Snare Drum",
926 "Loop 04 Acoustic Tom-Tom",
927 "Loop 05 Closed Hi-Hat Attack",
928 "Loop 06 Crash Cymbal Attack",
929 "Loop 07 Ride Cymbal Attack",
930 "Loop 08 Ride Cymbal Attack short",
933 "Loop 11 Mute Conga",
934 "Loop 12 High Conga",
937 "Loop 15 Tambourine ",
938 "Loop 16 Agogo Bell",
942 "Loop 20 Acoustic Piano",
943 "Loop 21 Ham & Organ Attack",
949 "Loop 27 Shaku-Hachi",
951 "Loop 29 Baritone Sax",
953 "Loop 31 Vibraphone",
956 "Loop 34 Fretless Bass",
957 "Loop 35 Slap Bass Attack",
958 "Loop 36 Acoustic Bass",
959 "Loop 37 Gut Guitar",
960 "Loop 38 Steel Guitar",
961 "Loop 39 Pizzicato Strings",
963 "Loop 41 Contrabass",
966 "Loop 44 Orchestra Hit",
967 "Loop 45 Indian Flute",
1039 "Loop Engine Start",
1127 static void la_ctrl_rom_conv(struct timidity_file *tf, Info_PCM *inf, int rom_size)
1129 uint8 *ctrl_rom = NULL;
1130 LA_Ctrl_ROM_Map *ctrl_map = NULL;
1131 LA_Ctrl_ROM_PCM_Struct *tps = NULL;
1135 ctrl_rom = (uint8 *)safe_malloc(LA_CONTROL_ROM_SIZE);
1138 memset(ctrl_rom, 0, LA_CONTROL_ROM_SIZE);
1139 if(!tf_read(ctrl_rom, 1, LA_CONTROL_ROM_SIZE, tf)){
1140 safe_free(ctrl_rom);
1143 for (i = 0; i < sizeof(LA_Ctrl_ROM_Maps) / sizeof(LA_Ctrl_ROM_Maps[0]); i++) {
1144 if (memcmp(&ctrl_rom[LA_Ctrl_ROM_Maps[i].idPos], LA_Ctrl_ROM_Maps[i].idBytes, LA_Ctrl_ROM_Maps[i].idLen) == 0) {
1145 ctrl_map = (LA_Ctrl_ROM_Map *)&LA_Ctrl_ROM_Maps[i];
1149 memset(inf, 0, sizeof(Info_PCM) * ctrl_map->pcmCount);
1150 tps = (LA_Ctrl_ROM_PCM_Struct *)&ctrl_rom[ctrl_map->pcmTable];
1151 for (i = 0; i < ctrl_map->pcmCount; i++) {
1152 uint32 rAddr = tps[i].pos * 0x800;
1153 uint32 rLen = 0x800 << ((tps[i].len & 0x70) >> 4);
1154 if (rAddr + rLen > rom_size) {
1155 return; // Control ROM error
1157 inf[i].loop = (tps[i].len & 0x80) != 0;
1158 inf[i].ofs_start = rAddr;
1159 inf[i].ofs_end = rAddr + rLen;
1160 inf[i].loop_start = rAddr;
1161 inf[i].loop_end = rAddr + rLen;
1162 inf[i].loop_length = rLen;
1163 pitch = (int32)((((int32)tps[i].pitchMSB) << 8) | (int32)tps[i].pitchLSB) - 20480;
1164 frq = pow(2.0, (FLOAT_T)(-pitch) * DIV_12BIT) * la_base_freq; // c5=20480 , +1oct=-4096 12bit
1165 inf[i].root_freq = frq;
1166 inf[i].div_root_freq = 1.0 / frq; // 1/root_freq
1167 inf[i].sample_rate = la_sample_rate;
1169 safe_free(ctrl_rom);
1172 static void la_pcm_rom_conv(struct timidity_file *tf, FLOAT_T *buf, int rom_size, int pcm_size)
1174 uint8 *pcm_rom = NULL;
1176 // FLOAT_T maxamp = 0;
1178 pcm_rom = (uint8 *)safe_malloc(rom_size);
1181 memset(pcm_rom, 0, rom_size);
1182 if(!tf_read(pcm_rom, 1, rom_size, tf)){
1190 int order[16] = {0, 9, 1 ,2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 8};
1191 FLOAT_T expval, vol;
1195 for(u = 0; u < 15; u++) {
1198 if((order[u] < 8) && (order[u] >= 0)) {
1199 bit = (s >> (7-order[u])) & 0x1;
1202 bit = (c >> (7 - (order[u] - 8))) & 0x1;
1211 expval = -32767 - e;
1214 vol = pow(pow((expval * DIV_15BIT), 32.0), DIV_3);
1217 //expval = fabs(vol);
1218 //if(expval > maxamp)
1220 // test maxamp=0.99934915035888361
1221 //buf[i] = (int)(vol * M_23BIT) * DIV_23BIT; //
1229 buf[pcm_size] = 0; // for interpolation
1233 void load_la_rom(void)
1235 struct timidity_file *tf;
1237 if(la_pcm_data_load_flg)
1239 la_pcm_data_load_flg = 1;
1241 if (tf = open_file("MT32_CONTROL.ROM", 1, OF_NORMAL)){
1242 la_ctrl_rom_conv(tf, mt32_pcm_inf, MT32_PCM_ROM_SIZE);
1246 if (tf = open_file("MT32_PCM.ROM", 1, OF_NORMAL)){
1247 la_pcm_rom_conv(tf, mt32_pcm_data, MT32_PCM_ROM_SIZE, MT32_PCM_SIZE);
1251 if (tf = open_file("CM32L_CONTROL.ROM", 1, OF_NORMAL)){
1252 la_ctrl_rom_conv(tf, cm32l_pcm_inf, CM32L_PCM_ROM_SIZE);
1256 if (tf = open_file("CM32L_PCM.ROM", 1, OF_NORMAL)){
1257 la_pcm_rom_conv(tf, cm32l_pcm_data, CM32L_PCM_ROM_SIZE, CM32L_PCM_SIZE);
1265 //////// load setting (int_synth.ini
1268 static void config_parse_scc_data(const char *cp, Preset_IS *set, int setting)
1276 for (i = 0; i < SCC_DATA_LENGTH; i++){
1277 set->scc_data_int[setting][i] = 0; // init param
1278 set->scc_data[setting][i] = 0; // init param
1280 set->scc_data[setting][SCC_DATA_LENGTH] = 0;
1283 for (i = 0; i < SCC_DATA_LENGTH; i++, p++) {
1291 set->scc_data_int[setting][i] = (int16)tmp;
1292 set->scc_data[setting][i] = (double)tmp * DIV_128;
1293 if (! (p = strchr(p, ':')))
1296 set->scc_data[setting][SCC_DATA_LENGTH] = set->scc_data[setting][0]; // for interpolation
1301 static void config_parse_mt32_data(const char *cp, Preset_IS *set, int setting)
1305 FLOAT_T frq = 261.626; // note60
1306 FLOAT_T div_frq = 1.0 / frq;
1311 // loop 0:off 1:on, ofs_start, ofs_end, loop_start, loop_end, sample_rate [Hz], root_freq [0.001Hz]
1312 mt32_pcm_inf[setting].loop = 0;
1313 mt32_pcm_inf[setting].ofs_start = 0;
1314 mt32_pcm_inf[setting].ofs_end = 0;
1315 mt32_pcm_inf[setting].loop_start = 0;
1316 mt32_pcm_inf[setting].loop_end = 0;
1317 mt32_pcm_inf[setting].sample_rate = 32000;
1318 mt32_pcm_inf[setting].root_freq = frq;
1319 mt32_pcm_inf[setting].div_root_freq = div_frq; // 1/root_freq
1321 for (i = 0; i < 7; i++, p++) {
1329 mt32_pcm_inf[setting].loop = tmp;
1332 mt32_pcm_inf[setting].ofs_start = tmp;
1333 mt32_pcm_inf[setting].loop_start = tmp;
1336 mt32_pcm_inf[setting].ofs_end = tmp;
1337 mt32_pcm_inf[setting].loop_end = tmp;
1343 mt32_pcm_inf[setting].root_freq = tmp;
1344 mt32_pcm_inf[setting].div_root_freq = 1.0 / (double)tmp;
1349 if (! (p = strchr(p, ':')))
1355 static void config_parse_cm32l_data(const char *cp, Preset_IS *set, int setting)
1359 FLOAT_T frq = 261.626; // note60
1360 FLOAT_T div_frq = 1.0 / frq;
1365 // loop 0:off 1:on, ofs_start, ofs_end, loop_start, loop_end, sample_rate [Hz], root_freq [0.001Hz]
1366 cm32l_pcm_inf[setting].loop = 0;
1367 cm32l_pcm_inf[setting].ofs_start = 0;
1368 cm32l_pcm_inf[setting].ofs_end = 0;
1369 cm32l_pcm_inf[setting].loop_start = 0;
1370 cm32l_pcm_inf[setting].loop_end = 0;
1371 cm32l_pcm_inf[setting].sample_rate = 32000;
1372 cm32l_pcm_inf[setting].root_freq = frq;
1373 cm32l_pcm_inf[setting].div_root_freq = div_frq; // 1/root_freq
1375 for (i = 0; i < 7; i++, p++) {
1383 cm32l_pcm_inf[setting].loop = tmp;
1386 cm32l_pcm_inf[setting].ofs_start = tmp;
1389 cm32l_pcm_inf[setting].ofs_end = tmp;
1392 cm32l_pcm_inf[setting].loop_start = tmp;
1395 cm32l_pcm_inf[setting].loop_end = tmp;
1398 cm32l_pcm_inf[setting].sample_rate = tmp;
1404 cm32l_pcm_inf[setting].root_freq = tmp;
1405 cm32l_pcm_inf[setting].div_root_freq = 1.0 / (double)tmp;
1410 if (! (p = strchr(p, ':')))
1417 static void config_parse_scc_mode(const char *cp, Preset_IS *set, int setting)
1425 for (i = 0; i < SCC_MODE_MAX; i++)
1426 set->scc_setting[setting]->mode[i] = 0; // init param
1428 for (i = 0; i < SCC_MODE_MAX; i++, p++) {
1431 set->scc_setting[setting]->mode[i] = atoi(p);
1432 if (! (p = strchr(p, ':')))
1437 static void config_parse_scc_param(const char *cp, Preset_IS *set, int setting)
1445 for (i = 0; i < SCC_PARAM_MAX; i++)
1446 set->scc_setting[setting]->param[i] = 0; // init param
1448 for (i = 0; i < SCC_PARAM_MAX; i++, p++) {
1451 set->scc_setting[setting]->param[i] = atoi(p);
1452 if (! (p = strchr(p, ':')))
1457 static void config_parse_scc_osc(const char *cp, Preset_IS *set, int setting)
1465 for (i = 0; i < SCC_OSC_MAX; i++)
1466 set->scc_setting[setting]->osc[i] = 0; // init param
1468 for (i = 0; i < SCC_OSC_MAX; i++, p++) {
1471 set->scc_setting[setting]->osc[i] = atoi(p);
1472 if (! (p = strchr(p, ':')))
1477 static void config_parse_scc_amp(const char *cp, Preset_IS *set, int setting)
1485 for (i = 0; i < SCC_AMP_MAX; i++)
1486 set->scc_setting[setting]->amp[i] = 0; // init param
1488 for (i = 0; i < SCC_AMP_MAX; i++, p++) {
1491 set->scc_setting[setting]->amp[i] = atoi(p);
1492 if (! (p = strchr(p, ':')))
1497 static void config_parse_scc_pitch(const char *cp, Preset_IS *set, int setting)
1505 for (i = 0; i < SCC_PITCH_MAX; i++)
1506 set->scc_setting[setting]->pitch[i] = 0; // init param
1508 for (i = 0; i < SCC_PITCH_MAX; i++, p++) {
1511 set->scc_setting[setting]->pitch[i] = atoi(p);
1512 if (! (p = strchr(p, ':')))
1517 static void config_parse_scc_ampenv(const char *cp, Preset_IS *set, int setting)
1525 for (i = 0; i < SCC_ENV_PARAM; i++)
1526 set->scc_setting[setting]->ampenv[i] = 0; // init param
1527 set->scc_setting[setting]->ampenv[2] = 100; // init param
1529 for (i = 0; i < SCC_ENV_PARAM; i++, p++) {
1532 set->scc_setting[setting]->ampenv[i] = atoi(p);
1533 if (! (p = strchr(p, ':')))
1538 static void config_parse_scc_pitenv(const char *cp, Preset_IS *set, int setting)
1546 for (i = 0; i < SCC_ENV_PARAM; i++)
1547 set->scc_setting[setting]->pitenv[i] = 0; // init param
1548 set->scc_setting[setting]->pitenv[2] = 100; // init param
1550 for (i = 0; i < SCC_ENV_PARAM; i++, p++) {
1553 set->scc_setting[setting]->pitenv[i] = atoi(p);
1554 if (! (p = strchr(p, ':')))
1559 static void config_parse_scc_lfo1(const char *cp, Preset_IS *set, int setting)
1567 // for (i = 0; i < SCC_LFO_PARAM; i++)
1568 // set->scc_setting[setting]->lfo1[i] = 0; // init param
1569 set->scc_setting[setting]->lfo1[0] = 0; // init param
1570 set->scc_setting[setting]->lfo1[1] = 0; // init param
1571 set->scc_setting[setting]->lfo1[2] = 0; // init param
1572 set->scc_setting[setting]->lfo1[3] = 200; // init param
1574 for (i = 0; i < SCC_LFO_PARAM; i++, p++) {
1577 set->scc_setting[setting]->lfo1[i] = atoi(p);
1578 if (! (p = strchr(p, ':')))
1583 static void config_parse_scc_lfo2(const char *cp, Preset_IS *set, int setting)
1591 // for (i = 0; i < SCC_LFO_PARAM; i++)
1592 // set->scc_setting[setting]->lfo2[i] = 0; // init param
1593 set->scc_setting[setting]->lfo2[0] = 0; // init param
1594 set->scc_setting[setting]->lfo2[1] = 0; // init param
1595 set->scc_setting[setting]->lfo2[2] = 0; // init param
1596 set->scc_setting[setting]->lfo2[3] = 200; // init param
1598 for (i = 0; i < SCC_LFO_PARAM; i++, p++) {
1601 set->scc_setting[setting]->lfo2[i] = atoi(p);
1602 if (! (p = strchr(p, ':')))
1609 static void config_parse_mms_op_param(const char *cp, Preset_IS *set, int setting, int op_num)
1617 for (i = 0; i < MMS_OP_PARAM_MAX; i++)
1618 set->mms_setting[setting]->op_param[op_num][i] = 0; // init param
1620 for (i = 0; i < MMS_OP_PARAM_MAX; i++, p++) {
1623 set->mms_setting[setting]->op_param[op_num][i] = atoi(p);
1624 if (! (p = strchr(p, ':')))
1629 static void config_parse_mms_op_range(const char *cp, Preset_IS *set, int setting, int op_num)
1637 //for (i = 0; i < MMS_OP_RANGE_MAX; i++)
1638 // set->mms_setting[setting]->op_range[op_num][i] = -1; // init param
1639 set->mms_setting[setting]->op_range[op_num][0] = 0;
1640 set->mms_setting[setting]->op_range[op_num][1] = 127;
1641 set->mms_setting[setting]->op_range[op_num][2] = 0;
1642 set->mms_setting[setting]->op_range[op_num][3] = 127;
1644 for (i = 0; i < MMS_OP_RANGE_MAX; i++, p++) {
1647 set->mms_setting[setting]->op_range[op_num][i] = atoi(p);
1648 if (! (p = strchr(p, ':')))
1653 static void config_parse_mms_op_connect(const char *cp, Preset_IS *set, int setting, int op_num)
1661 for (i = 0; i < MMS_OP_CON_MAX; i++)
1662 set->mms_setting[setting]->op_connect[op_num][i] = -1; // init param
1664 for (i = 0; i < MMS_OP_CON_MAX; i++, p++) {
1667 set->mms_setting[setting]->op_connect[op_num][i] = atoi(p);
1668 if (! (p = strchr(p, ':')))
1673 static void config_parse_mms_op_osc(const char *cp, Preset_IS *set, int setting, int op_num)
1681 for (i = 0; i < MMS_OP_OSC_MAX; i++)
1682 set->mms_setting[setting]->op_osc[op_num][i] = 0; // init param
1684 for (i = 0; i < MMS_OP_OSC_MAX; i++, p++) {
1687 set->mms_setting[setting]->op_osc[op_num][i] = atoi(p);
1688 if (! (p = strchr(p, ':')))
1693 static void config_parse_mms_op_wave(const char *cp, Preset_IS *set, int setting, int op_num)
1701 for (i = 0; i < MMS_OP_WAVE_MAX; i++)
1702 set->mms_setting[setting]->op_wave[op_num][i] = 0; // init param
1704 for (i = 0; i < MMS_OP_WAVE_MAX; i++, p++) {
1707 set->mms_setting[setting]->op_wave[op_num][i] = atoi(p);
1708 if (! (p = strchr(p, ':')))
1713 static void config_parse_mms_op_sub(const char *cp, Preset_IS *set, int setting, int op_num)
1721 for (i = 0; i < MMS_OP_SUB_MAX; i++)
1722 set->mms_setting[setting]->op_sub[op_num][i] = 0; // init param
1724 for (i = 0; i < MMS_OP_SUB_MAX; i++, p++) {
1727 set->mms_setting[setting]->op_sub[op_num][i] = atoi(p);
1728 if (! (p = strchr(p, ':')))
1733 static void config_parse_mms_op_amp(const char *cp, Preset_IS *set, int setting, int op_num)
1741 for (i = 0; i < MMS_OP_AMP_MAX; i++)
1742 set->mms_setting[setting]->op_amp[op_num][i] = 0; // init param
1744 for (i = 0; i < MMS_OP_AMP_MAX; i++, p++) {
1747 set->mms_setting[setting]->op_amp[op_num][i] = atoi(p);
1748 if (! (p = strchr(p, ':')))
1753 static void config_parse_mms_op_pitch(const char *cp, Preset_IS *set, int setting, int op_num)
1761 for (i = 0; i < MMS_OP_PITCH_MAX; i++)
1762 set->mms_setting[setting]->op_pitch[op_num][i] = 0; // init param
1764 for (i = 0; i < MMS_OP_PITCH_MAX; i++, p++) {
1767 set->mms_setting[setting]->op_pitch[op_num][i] = atoi(p);
1768 if (! (p = strchr(p, ':')))
1773 static void config_parse_mms_op_width(const char *cp, Preset_IS *set, int setting, int op_num)
1781 for (i = 0; i < MMS_OP_WIDTH_MAX; i++)
1782 set->mms_setting[setting]->op_width[op_num][i] = 0; // init param
1784 for (i = 0; i < MMS_OP_WIDTH_MAX; i++, p++) {
1787 set->mms_setting[setting]->op_width[op_num][i] = atoi(p);
1788 if (! (p = strchr(p, ':')))
1793 static void config_parse_mms_op_ampenv(const char *cp, Preset_IS *set, int setting, int op_num)
1801 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1802 set->mms_setting[setting]->op_ampenv[op_num][i] = 0; // init param
1803 set->mms_setting[setting]->op_ampenv[op_num][2] = 100; // init param
1805 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1808 set->mms_setting[setting]->op_ampenv[op_num][i] = atoi(p);
1809 if (! (p = strchr(p, ':')))
1814 static void config_parse_mms_op_modenv(const char *cp, Preset_IS *set, int setting, int op_num)
1822 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1823 set->mms_setting[setting]->op_modenv[op_num][i] = 0; // init param
1824 set->mms_setting[setting]->op_modenv[op_num][2] = 100; // init param
1826 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1829 set->mms_setting[setting]->op_modenv[op_num][i] = atoi(p);
1830 if (! (p = strchr(p, ':')))
1835 static void config_parse_mms_op_widenv(const char *cp, Preset_IS *set, int setting, int op_num)
1843 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1844 set->mms_setting[setting]->op_widenv[op_num][i] = 0; // init param
1845 set->mms_setting[setting]->op_widenv[op_num][2] = 100; // init param
1847 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1850 set->mms_setting[setting]->op_widenv[op_num][i] = atoi(p);
1851 if (! (p = strchr(p, ':')))
1856 static void config_parse_mms_op_pitenv(const char *cp, Preset_IS *set, int setting, int op_num)
1864 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1865 set->mms_setting[setting]->op_pitenv[op_num][i] = 0; // init param
1866 set->mms_setting[setting]->op_pitenv[op_num][2] = 100; // init param
1868 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1871 set->mms_setting[setting]->op_pitenv[op_num][i] = atoi(p);
1872 if (! (p = strchr(p, ':')))
1877 static void config_parse_mms_op_ampenv_keyf(const char *cp, Preset_IS *set, int setting, int op_num)
1885 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1886 set->mms_setting[setting]->op_ampenv_keyf[op_num][i] = 0; // init param
1888 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1891 set->mms_setting[setting]->op_ampenv_keyf[op_num][i] = atoi(p);
1892 if (! (p = strchr(p, ':')))
1897 static void config_parse_mms_op_modenv_keyf(const char *cp, Preset_IS *set, int setting, int op_num)
1905 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1906 set->mms_setting[setting]->op_modenv_keyf[op_num][i] = 0; // init param
1908 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1911 set->mms_setting[setting]->op_modenv_keyf[op_num][i] = atoi(p);
1912 if (! (p = strchr(p, ':')))
1917 static void config_parse_mms_op_widenv_keyf(const char *cp, Preset_IS *set, int setting, int op_num)
1925 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1926 set->mms_setting[setting]->op_widenv_keyf[op_num][i] = 0; // init param
1928 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1931 set->mms_setting[setting]->op_widenv_keyf[op_num][i] = atoi(p);
1932 if (! (p = strchr(p, ':')))
1937 static void config_parse_mms_op_pitenv_keyf(const char *cp, Preset_IS *set, int setting, int op_num)
1945 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1946 set->mms_setting[setting]->op_pitenv_keyf[op_num][i] = 0; // init param
1948 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1951 set->mms_setting[setting]->op_pitenv_keyf[op_num][i] = atoi(p);
1952 if (! (p = strchr(p, ':')))
1957 static void config_parse_mms_op_ampenv_velf(const char *cp, Preset_IS *set, int setting, int op_num)
1965 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1966 set->mms_setting[setting]->op_ampenv_velf[op_num][i] = 0; // init param
1968 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1971 set->mms_setting[setting]->op_ampenv_velf[op_num][i] = atoi(p);
1972 if (! (p = strchr(p, ':')))
1977 static void config_parse_mms_op_modenv_velf(const char *cp, Preset_IS *set, int setting, int op_num)
1985 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
1986 set->mms_setting[setting]->op_modenv_velf[op_num][i] = 0; // init param
1988 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
1991 set->mms_setting[setting]->op_modenv_velf[op_num][i] = atoi(p);
1992 if (! (p = strchr(p, ':')))
1997 static void config_parse_mms_op_widenv_velf(const char *cp, Preset_IS *set, int setting, int op_num)
2005 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
2006 set->mms_setting[setting]->op_widenv_velf[op_num][i] = 0; // init param
2008 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
2011 set->mms_setting[setting]->op_widenv_velf[op_num][i] = atoi(p);
2012 if (! (p = strchr(p, ':')))
2017 static void config_parse_mms_op_pitenv_velf(const char *cp, Preset_IS *set, int setting, int op_num)
2025 for (i = 0; i < MMS_OP_ENV_PARAM; i++)
2026 set->mms_setting[setting]->op_pitenv_velf[op_num][i] = 0; // init param
2028 for (i = 0; i < MMS_OP_ENV_PARAM; i++, p++) {
2031 set->mms_setting[setting]->op_pitenv_velf[op_num][i] = atoi(p);
2032 if (! (p = strchr(p, ':')))
2037 static void config_parse_mms_op_lfo1(const char *cp, Preset_IS *set, int setting, int op_num)
2045 // for (i = 0; i < MMS_OP_LFO_PARAM; i++)
2046 // set->mms_setting[setting]->op_lfo1[op_num][i] = 0; // init param
2047 set->mms_setting[setting]->op_lfo1[op_num][0] = 0; // init param
2048 set->mms_setting[setting]->op_lfo1[op_num][1] = 0; // init param
2049 set->mms_setting[setting]->op_lfo1[op_num][2] = 0; // init param
2050 set->mms_setting[setting]->op_lfo1[op_num][3] = 200; // init param
2052 for (i = 0; i < MMS_OP_LFO_PARAM; i++, p++) {
2055 set->mms_setting[setting]->op_lfo1[op_num][i] = atoi(p);
2056 if (! (p = strchr(p, ':')))
2061 static void config_parse_mms_op_lfo2(const char *cp, Preset_IS *set, int setting, int op_num)
2069 // for (i = 0; i < MMS_OP_LFO_PARAM; i++)
2070 // set->mms_setting[setting]->op_lfo2[op_num][i] = 0; // init param
2071 set->mms_setting[setting]->op_lfo2[op_num][0] = 0; // init param
2072 set->mms_setting[setting]->op_lfo2[op_num][1] = 0; // init param
2073 set->mms_setting[setting]->op_lfo2[op_num][2] = 0; // init param
2074 set->mms_setting[setting]->op_lfo2[op_num][3] = 200; // init param
2076 for (i = 0; i < MMS_OP_LFO_PARAM; i++, p++) {
2079 set->mms_setting[setting]->op_lfo2[op_num][i] = atoi(p);
2080 if (! (p = strchr(p, ':')))
2085 static void config_parse_mms_op_lfo3(const char *cp, Preset_IS *set, int setting, int op_num)
2093 // for (i = 0; i < MMS_OP_LFO_PARAM; i++)
2094 // set->mms_setting[setting]->op_lfo3[op_num][i] = 0; // init param
2095 set->mms_setting[setting]->op_lfo3[op_num][0] = 0; // init param
2096 set->mms_setting[setting]->op_lfo3[op_num][1] = 0; // init param
2097 set->mms_setting[setting]->op_lfo3[op_num][2] = 0; // init param
2098 set->mms_setting[setting]->op_lfo3[op_num][3] = 200; // init param
2100 for (i = 0; i < MMS_OP_LFO_PARAM; i++, p++) {
2103 set->mms_setting[setting]->op_lfo3[op_num][i] = atoi(p);
2104 if (! (p = strchr(p, ':')))
2109 static void config_parse_mms_op_lfo4(const char *cp, Preset_IS *set, int setting, int op_num)
2117 // for (i = 0; i < MMS_OP_LFO_PARAM; i++)
2118 // set->mms_setting[setting]->op_lfo4[op_num][i] = 0; // init param
2119 set->mms_setting[setting]->op_lfo4[op_num][0] = 0; // init param
2120 set->mms_setting[setting]->op_lfo4[op_num][1] = 0; // init param
2121 set->mms_setting[setting]->op_lfo4[op_num][2] = 0; // init param
2122 set->mms_setting[setting]->op_lfo4[op_num][3] = 200; // init param
2124 for (i = 0; i < MMS_OP_LFO_PARAM; i++, p++) {
2127 set->mms_setting[setting]->op_lfo4[op_num][i] = atoi(p);
2128 if (! (p = strchr(p, ':')))
2133 static void config_parse_mms_op_filter(const char *cp, Preset_IS *set, int setting, int op_num)
2141 for (i = 0; i < MMS_OP_FLT_PARAM; i++)
2142 set->mms_setting[setting]->op_filter[op_num][i] = 0; // init param
2144 for (i = 0; i < MMS_OP_FLT_PARAM; i++, p++) {
2147 set->mms_setting[setting]->op_filter[op_num][i] = atoi(p);
2148 if (! (p = strchr(p, ':')))
2153 static void config_parse_mms_op_cutoff(const char *cp, Preset_IS *set, int setting, int op_num)
2161 for (i = 0; i < MMS_OP_CUT_PARAM; i++)
2162 set->mms_setting[setting]->op_cutoff[op_num][i] = 0; // init param
2164 for (i = 0; i < MMS_OP_CUT_PARAM; i++, p++) {
2167 set->mms_setting[setting]->op_cutoff[op_num][i] = atoi(p);
2168 if (! (p = strchr(p, ':')))
2173 static void config_parse_mms_op_mode(const char *cp, Preset_IS *set, int setting, int op_num)
2181 for (i = 0; i < MMS_OP_MODE_MAX; i++)
2182 set->mms_setting[setting]->op_mode[op_num][i] = 0; // init param
2184 for (i = 0; i < MMS_OP_MODE_MAX; i++, p++) {
2187 set->mms_setting[setting]->op_mode[op_num][i] = atoi(p);
2188 if (! (p = strchr(p, ':')))
2193 static void conv_preset_envelope_param(int max, int32 *env, int16 *velf, int16 *keyf)
2197 for(i = 6; i < max; i++)
2198 if(env[i] != 0) return; // use env_ext param
2200 env[13] = env[4]; // offdelay
2201 env[12] = env[4]; // delay
2202 env[11] = 0; // release3 level
2203 env[10] = 0; // release3 time
2204 env[9] = 0; // release2 level
2205 env[8] = 0; // release2 time
2206 env[7] = 0; // release1 level
2207 env[6] = env[3]; // release1 time
2208 env[5] = env[2]; // decay level
2209 env[4] = env[1]; // decay time
2210 env[3] = 100; // offset hold level
2211 env[2] = 0; // hold time
2212 env[1] = 100; // atk level
2213 env[0] = env[0]; // atk time
2215 if(!velf) return; // scc not define velf/keyf
2218 velf[11] = 0; // release3 level
2219 velf[10] = 0; // release3 time
2220 velf[9] = 0; // release2 level
2221 velf[8] = 0; // release2 time
2222 velf[7] = 0; // release1 level
2223 velf[6] = velf[3]; // release1 time
2224 velf[5] = velf[2]; // decay level (sustain level
2225 velf[4] = velf[1]; // decay time
2226 velf[3] = 0; // hold level
2227 velf[2] = 0; // hold time
2228 velf[1] = 0; // atk level
2229 velf[0] = velf[0]; // atk time
2231 if(!keyf) return; // scc not define velf/keyf
2234 keyf[11] = 0; // release3 level
2235 keyf[10] = 0; // release2 time
2236 keyf[9] = 0; // release2 level
2237 keyf[8] = 0; // release2 time
2238 keyf[7] = 0; // release1 level
2239 keyf[6] = keyf[3]; // release1 time
2240 keyf[5] = keyf[2]; // decay level (sustain level
2242 keyf[3] = 0; // hold level
2243 keyf[2] = 0; // hold time
2244 keyf[1] = 0; // atk level
2245 keyf[0] = keyf[0]; // atk time
2248 static void load_is_scc_data(INIDATA *ini, Preset_IS *set)
2250 LPINISEC sec = NULL;
2251 TCHAR tbf[258] = "";
2254 char name2[30] = "";
2257 sec = MyIni_GetSection(ini, "SCC_DATA", 0);
2258 for(i = 0; i < SCC_DATA_MAX; i++){
2259 snprintf(name, sizeof(name), "data_%03d", i); //
\8c\85\90\94\8ew
\92è
2260 snprintf(name2, sizeof(name2), "name_%03d", i); //
\8c\85\90\94\8ew
\92è
2261 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");
2262 config_parse_scc_data(p, set, i);
2263 p = MyIni_GetString(sec, name2, tbf, 256, "none");
2264 if(set->scc_data_name[i] != NULL)
2265 safe_free(set->scc_data_name[i]);
2266 set->scc_data_name[i] = safe_strdup(p);
2270 static void load_is_scc_preset(INIDATA *ini, Preset_IS *set, int preset, int init)
2272 LPINISEC sec = NULL;
2273 TCHAR tbf[258] = "";
2276 char name2[30] = "";
2279 Preset_SCC *set2 = NULL;
2281 snprintf(name, sizeof(name), "SCC_%03d", i); //
\8c\85\90\94\8ew
\92è
2282 sec = MyIni_GetSection(ini, name, 0);
2283 if(sec == NULL && !init)
2285 mem = safe_malloc(sizeof(Preset_SCC));
2288 memset(mem, 0, sizeof(Preset_SCC));
2289 set->scc_setting[i] = (Preset_SCC *)mem;
2290 set2 = set->scc_setting[i];
2291 p = MyIni_GetString(sec, "name", tbf, 256, "SCC none");
2292 // snprintf(name, sizeof(name), "[SCC] %s", p);
2293 if(set->scc_setting[i]->inst_name != NULL)
2294 safe_free(set->scc_setting[i]->inst_name);
2295 // scc_setting[i].inst_name = safe_strdup(name);
2296 set->scc_setting[i]->inst_name = safe_strdup(p);
2297 p = MyIni_GetString(sec, "mode", tbf, 256, "0:0");
2298 config_parse_scc_mode(p, set, i);
2299 p = MyIni_GetString(sec, "param", tbf, 256, "100:0");
2300 config_parse_scc_param(p, set, i);
2301 p = MyIni_GetString(sec, "osc", tbf, 256, "0:100:0:0:0:0:0:0");
2302 config_parse_scc_osc(p, set, i);
2303 p = MyIni_GetString(sec, "amp", tbf, 256, "0:0:0");
2304 config_parse_scc_amp(p, set, i);
2305 p = MyIni_GetString(sec, "pitch", tbf, 256, "0:0:0");
2306 config_parse_scc_pitch(p, set, i);
2307 #define IS_SCC_ENV_DEFAULT "0:0:100:0:0:0:0:0:0:0:0:0:0:0"
2308 p = MyIni_GetString(sec, "ampenv", tbf, 256, IS_SCC_ENV_DEFAULT);
2309 config_parse_scc_ampenv(p, set, i);
2310 p = MyIni_GetString(sec, "pitenv", tbf, 256, IS_SCC_ENV_DEFAULT);
2311 config_parse_scc_pitenv(p, set, i);
2312 #define IS_SCC_LFO_DEFAULT "0:0:0:0"
2313 p = MyIni_GetString(sec, "lfo1", tbf, 256, IS_SCC_LFO_DEFAULT);
2314 config_parse_scc_lfo1(p, set, i);
2315 p = MyIni_GetString(sec, "lfo2", tbf, 256, IS_SCC_LFO_DEFAULT);
2316 config_parse_scc_lfo2(p, set, i);
2317 // conv_preset_envelope
2318 conv_preset_envelope_param(SCC_ENV_PARAM, set2->ampenv, NULL, NULL);
2319 conv_preset_envelope_param(SCC_ENV_PARAM, set2->pitenv, NULL, NULL);
2322 static void load_is_mms_preset(INIDATA *ini, Preset_IS *set, int preset, int init)
2324 LPINISEC sec = NULL;
2325 TCHAR tbf[258] = "";
2328 char name2[30] = "";
2330 int i = preset, j, k, param;
2331 Preset_MMS *set2 = NULL;
2333 snprintf(name, sizeof(name), "MMS_%03d", i); //
\8c\85\90\94\8ew
\92è
2334 sec = MyIni_GetSection(ini, name, 0);
2335 if(sec == NULL && !init)
2337 mem = safe_malloc(sizeof(Preset_MMS));
2340 memset(mem, 0, sizeof(Preset_MMS));
2341 set->mms_setting[i] = (Preset_MMS *)mem;
2342 set2 = set->mms_setting[i];
2343 p = MyIni_GetString(sec, "name", tbf, 256, "MMS none");
2344 // snprintf(name, sizeof(name), "[MMS] %s", p);
2345 if(set->mms_setting[i]->inst_name != NULL)
2346 safe_free(set->mms_setting[i]->inst_name);
2347 // set->mms_setting[i].inst_name = safe_strdup(name);
2348 set->mms_setting[i]->inst_name = safe_strdup(p);
2349 set->mms_setting[i]->op_max = MyIni_GetInt32(sec, "op_max", 1);
2350 for(j = 0; j < MMS_OP_MAX; j++){
2351 snprintf(name, sizeof(name), "op_%d_mode", j);
2352 p = MyIni_GetString(sec, name, tbf, 256, "0:0");
2353 config_parse_mms_op_mode(p, set, i, j);
2354 snprintf(name, sizeof(name), "op_%d_range", j);
2355 p = MyIni_GetString(sec, name, tbf, 256, "0:127:0:127");
2356 config_parse_mms_op_range(p, set, i, j);
2357 snprintf(name, sizeof(name), "op_%d_param", j);
2358 p = MyIni_GetString(sec, name, tbf, 256, "0:100:100");
2359 config_parse_mms_op_param(p, set, i, j);
2360 snprintf(name, sizeof(name), "op_%d_connect", j);
2361 p = MyIni_GetString(sec, name, tbf, 256, "-1");
2362 config_parse_mms_op_connect(p, set, i, j);
2363 snprintf(name, sizeof(name), "op_%d_osc", j);
2364 p = MyIni_GetString(sec, name, tbf, 256, "0:100:0:0");
2365 config_parse_mms_op_osc(p, set, i, j);
2366 snprintf(name, sizeof(name), "op_%d_wave", j);
2367 p = MyIni_GetString(sec, name, tbf, 256, "0:0:100:0:0:0");
2368 config_parse_mms_op_wave(p, set, i, j);
2369 snprintf(name, sizeof(name), "op_%d_sub", j);
2370 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2371 config_parse_mms_op_sub(p, set, i, j);
2372 snprintf(name, sizeof(name), "op_%d_amp", j);
2373 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2374 config_parse_mms_op_amp(p, set, i, j);
2375 snprintf(name, sizeof(name), "op_%d_pitch", j);
2376 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2377 config_parse_mms_op_pitch(p, set, i, j);
2378 snprintf(name, sizeof(name), "op_%d_width", j);
2379 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2380 config_parse_mms_op_width(p, set, i, j);
2381 snprintf(name, sizeof(name), "op_%d_filter", j);
2382 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2383 config_parse_mms_op_filter(p, set, i, j);
2384 snprintf(name, sizeof(name), "op_%d_cutoff", j);
2385 p = MyIni_GetString(sec, name, tbf, 256, "0:0:0:0");
2386 config_parse_mms_op_cutoff(p, set, i, j);
2387 #define IS_MMS_ENV_DEFAULT "0:0:100:0:0:0:0:0:0:0:0:0:0:0"
2388 snprintf(name, sizeof(name), "op_%d_ampenv", j);
2389 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENV_DEFAULT);
2390 config_parse_mms_op_ampenv(p, set, i, j);
2391 snprintf(name, sizeof(name), "op_%d_modenv", j);
2392 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENV_DEFAULT);
2393 config_parse_mms_op_modenv(p, set, i, j);
2394 snprintf(name, sizeof(name), "op_%d_widenv", j);
2395 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENV_DEFAULT);
2396 config_parse_mms_op_widenv(p, set, i, j);
2397 snprintf(name, sizeof(name), "op_%d_pitenv", j);
2398 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENV_DEFAULT);
2399 config_parse_mms_op_pitenv(p, set, i, j);
2400 #define IS_MMS_ENVF_DEFAULT "0:0:0:0:0:0:0:0:0:0:0:0:0:0"
2401 snprintf(name, sizeof(name), "op_%d_ampenv_keyf", j);
2402 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2403 config_parse_mms_op_ampenv_keyf(p, set, i, j);
2404 snprintf(name, sizeof(name), "op_%d_modenv_keyf", j);
2405 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2406 config_parse_mms_op_modenv_keyf(p, set, i, j);
2407 snprintf(name, sizeof(name), "op_%d_widenv_keyf", j);
2408 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2409 config_parse_mms_op_widenv_keyf(p, set, i, j);
2410 snprintf(name, sizeof(name), "op_%d_pitenv_keyf", j);
2411 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2412 config_parse_mms_op_pitenv_keyf(p, set, i, j);
2413 snprintf(name, sizeof(name), "op_%d_ampenv_velf", j);
2414 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2415 config_parse_mms_op_ampenv_velf(p, set, i, j);
2416 snprintf(name, sizeof(name), "op_%d_modenv_velf", j);
2417 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2418 config_parse_mms_op_modenv_velf(p, set, i, j);
2419 snprintf(name, sizeof(name), "op_%d_widenv_velf", j);
2420 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2421 config_parse_mms_op_widenv_velf(p, set, i, j);
2422 snprintf(name, sizeof(name), "op_%d_pitenv_velf", j);
2423 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_ENVF_DEFAULT);
2424 config_parse_mms_op_pitenv_velf(p, set, i, j);
2425 #define IS_MMS_LFO_DEFAULT "0:0:0:0"
2426 snprintf(name, sizeof(name), "op_%d_lfo1", j);
2427 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_LFO_DEFAULT);
2428 config_parse_mms_op_lfo1(p, set, i, j);
2429 snprintf(name, sizeof(name), "op_%d_lfo2", j);
2430 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_LFO_DEFAULT);
2431 config_parse_mms_op_lfo2(p, set, i, j);
2432 snprintf(name, sizeof(name), "op_%d_lfo3", j);
2433 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_LFO_DEFAULT);
2434 config_parse_mms_op_lfo3(p, set, i, j);
2435 snprintf(name, sizeof(name), "op_%d_lfo4", j);
2436 p = MyIni_GetString(sec, name, tbf, 256, IS_MMS_LFO_DEFAULT);
2437 config_parse_mms_op_lfo4(p, set, i, j);
2438 // conv_preset_envelop
2439 conv_preset_envelope_param(MMS_OP_ENV_PARAM, set2->op_ampenv[j], set2->op_ampenv_velf[j], set2->op_ampenv_keyf[j]);
2440 conv_preset_envelope_param(MMS_OP_ENV_PARAM, set2->op_modenv[j], set2->op_modenv_velf[j], set2->op_modenv_keyf[j]);
2441 conv_preset_envelope_param(MMS_OP_ENV_PARAM, set2->op_widenv[j], set2->op_widenv_velf[j], set2->op_widenv_keyf[j]);
2442 conv_preset_envelope_param(MMS_OP_ENV_PARAM, set2->op_pitenv[j], set2->op_pitenv_velf[j], set2->op_pitenv_keyf[j]);
2446 // type -1:scc/mms 0:scc 1:mms , preset -1:all 0~:num
2447 static void load_int_synth_preset(const char *inifile, Preset_IS *set, int type, int32 preset, int init)
2452 MyIni_Load_timidity(&ini, inifile, 1, OF_VERBOSE);
2453 if(!set->scc_data_load){
2454 set->scc_data_load = 1;
2455 load_is_scc_data(&ini, set);
2457 if(type == IS_INI_TYPE_ALL || type == IS_INI_TYPE_SCC){
2458 if(preset == IS_INI_PRESET_ALL){
2459 for(i = 0; i < SCC_SETTING_MAX; i++){
2460 if(set->scc_setting[i])
2462 load_is_scc_preset(&ini, set, i, init);
2464 }else if(preset < SCC_SETTING_MAX){
2465 if(!set->scc_setting[preset])
2466 load_is_scc_preset(&ini, set, preset, init);
2468 #ifdef IS_INI_LOAD_BLOCK
2469 else if(preset > 0){
2470 int32 block = (preset >> 10) - 1; // 10bit>SETTING_MAX
2471 int32 min = block * IS_INI_LOAD_BLOCK; // 1block=64or128preset
2472 int32 max = min + IS_INI_LOAD_BLOCK; // 1block=64or128preset
2473 if(max > SCC_SETTING_MAX)
2474 max = SCC_SETTING_MAX;
2475 for(i = min; i < max; i++){
2476 if(set->scc_setting[i])
2478 load_is_scc_preset(&ini, set, i, init);
2483 if(type == IS_INI_TYPE_ALL || type == IS_INI_TYPE_MMS){
2484 if(preset == IS_INI_PRESET_ALL){
2485 for(i = 0; i < MMS_SETTING_MAX; i++){
2486 if(set->mms_setting[i])
2488 load_is_mms_preset(&ini, set, i, init);
2490 }else if(preset < MMS_SETTING_MAX){
2491 if(!set->mms_setting[preset])
2492 load_is_mms_preset(&ini, set, preset, init);
2494 #ifdef IS_INI_LOAD_BLOCK
2495 else if(preset > 0){
2496 int32 block = (preset >> 10) - 1; // 10bit>SETTING_MAX
2497 int32 min = block * IS_INI_LOAD_BLOCK; // 1block=64or128preset
2498 int32 max = min + IS_INI_LOAD_BLOCK; // 1block=64or128preset
2499 if(max > MMS_SETTING_MAX)
2500 max = MMS_SETTING_MAX;
2501 for(i = min; i < max; i++){
2502 if(set->mms_setting[i])
2504 load_is_mms_preset(&ini, set, i, init);
2509 MyIni_SectionAllClear(&ini);
2516 Preset_IS is_editor_preset;
2517 int scc_data_editor_override = 0;
2518 static int16 scc_data_int_edit[2][SCC_DATA_LENGTH]; // 0:working 1:temp
2519 static FLOAT_T scc_data_edit[2][SCC_DATA_LENGTH + 1]; // 0:working 1:temp
2520 int scc_editor_override = 0;
2521 static Preset_SCC scc_setting_edit[2]; // 0:working 1:temp
2522 int mms_editor_override = 0;
2523 static Preset_MMS mms_setting_edit[2]; // 0:working 1:temp
2525 char is_editor_inifile[FILEPATH_MAX] = "";
2526 static char data_name_empty[] = "error\0";
2529 const char *scc_data_editor_load_name(int num)
2531 if(num < 0 || num >= SCC_DATA_MAX)
2532 return data_name_empty;
2534 return is_editor_preset.scc_data_name[num];
2537 void scc_data_editor_store_name(int num, const char *name)
2539 if(num < 0 || num >= SCC_DATA_MAX)
2541 if(is_editor_preset.scc_data_name[num] != NULL)
2542 safe_free(is_editor_preset.scc_data_name[num]);
2543 is_editor_preset.scc_data_name[num] = safe_strdup(name);
2546 void scc_data_editor_clear_param(void)
2548 memset(scc_data_int_edit[0], 0, sizeof(scc_data_int_edit[0]));
2549 memset(scc_data_edit[0], 0, sizeof(scc_data_edit[0]));
2552 int scc_data_editor_get_param(int num)
2554 if(num < 0 || num >= SCC_DATA_LENGTH)
2556 return scc_data_int_edit[0][num];
2559 void scc_data_editor_set_param(int num, int val)
2561 if(num < 0 || num >= SCC_DATA_LENGTH)
2567 scc_data_int_edit[0][num] = val;
2568 scc_data_edit[0][num] = (double)val * DIV_128;
2570 scc_data_edit[0][SCC_DATA_LENGTH] = scc_data_edit[0][0]; // for interpolation
2573 static void scc_data_editor_save_ini(int num)
2576 TCHAR data[258] = "";
2581 MyIni_Load(&ini, is_editor_inifile);
2582 snprintf(key1, sizeof(key1), "data_%03d", num); //
\8c\85\90\94\8ew
\92è
2583 snprintf(key2, sizeof(key2), "name_%03d", num); //
\8c\85\90\94\8ew
\92è
2584 for(i = 0; i < SCC_DATA_LENGTH; i++){
2585 snprintf(data, sizeof(data), "%s%d:", data, is_editor_preset.scc_data_int[num][i]);
2587 MyIni_SetString2(&ini, "SCC_DATA", key2, is_editor_preset.scc_data_name[num]);
2588 MyIni_SetString2(&ini, "SCC_DATA", key1, data);
2589 MyIni_Save(&ini, is_editor_inifile);
2590 MyIni_SectionAllClear(&ini);
2593 void scc_data_editor_load_preset(int num)
2598 memcpy(&scc_data_int_edit[0], &scc_data_int_edit[1], sizeof(int16) * (SCC_DATA_LENGTH));
2599 memcpy(&scc_data_edit[0], &scc_data_edit[1], sizeof(FLOAT_T) * (SCC_DATA_LENGTH + 1));
2601 if(num > (SCC_DATA_MAX - 1))
2603 memcpy(&scc_data_int_edit[0], &is_editor_preset.scc_data_int[num], sizeof(int16) * (SCC_DATA_LENGTH));
2604 memcpy(&scc_data_edit[0], &is_editor_preset.scc_data[num], sizeof(FLOAT_T) * (SCC_DATA_LENGTH + 1));
2608 void scc_data_editor_store_preset(int num)
2613 memcpy(&scc_data_int_edit[1], &scc_data_int_edit[0], sizeof(int16) * (SCC_DATA_LENGTH));
2614 memcpy(&scc_data_edit[1], &scc_data_edit[0], sizeof(FLOAT_T) * (SCC_DATA_LENGTH + 1));
2617 if(num > (SCC_DATA_MAX - 1))
2619 memcpy(&is_editor_preset.scc_data_int[num], &scc_data_int_edit[0], sizeof(int16) * (SCC_DATA_LENGTH));
2620 memcpy(&is_editor_preset.scc_data[num], &scc_data_edit[0], sizeof(FLOAT_T) * (SCC_DATA_LENGTH + 1));
2621 scc_data_editor_save_ini(num);
2625 const char *scc_editor_load_name(int num)
2627 if(num < 0 || num >= SCC_SETTING_MAX)
2628 return data_name_empty;
2629 else if(!is_editor_preset.scc_setting[num])
2630 return data_name_empty;
2632 return is_editor_preset.scc_setting[num]->inst_name;
2635 void scc_editor_store_name(int num, const char *name)
2637 if(num < 0 || num >= SCC_SETTING_MAX)
2639 else if(!is_editor_preset.scc_setting[num])
2641 if(is_editor_preset.scc_setting[num]->inst_name != NULL)
2642 safe_free(is_editor_preset.scc_setting[num]->inst_name);
2643 is_editor_preset.scc_setting[num]->inst_name = safe_strdup(name);
2646 const char *scc_editor_load_wave_name(int fnc)
2648 int type; // osc_type
2649 int num; // wave_type
2651 switch(fnc){ // osc/lfo1/lfo2
2654 num = scc_setting_edit[0].osc[3]; // scc data
2656 type = 0; // osc_type
2657 num = OSC_NOISE_LOWBIT;
2659 type = 1; // osc_type
2663 num = scc_setting_edit[0].osc[5]; // scc data2
2665 type = 0; // osc_type
2666 num = OSC_NOISE_LOWBIT;
2668 type = 1; // osc_type
2672 num = scc_setting_edit[0].osc[7]; // scc data3
2674 type = 0; // osc_type
2675 num = OSC_NOISE_LOWBIT;
2677 type = 1; // osc_type
2681 type = 0; // osc_type
2682 num = scc_setting_edit[0].lfo1[2]; // wave_type
2685 type = 0; // osc_type
2686 num = scc_setting_edit[0].lfo2[2]; // wave_type
2691 if(num < 0 || num > OSC_NOISE_LOWBIT)
2692 return data_name_empty;
2694 return osc_wave_name[num];
2696 if(num < 0 || num >= SCC_DATA_MAX)
2697 return data_name_empty;
2699 return is_editor_preset.scc_data_name[num];
2701 return data_name_empty;
2705 void scc_editor_set_default_param(int set_num)
2708 Preset_SCC *set = NULL;
2711 set = &scc_setting_edit[0];
2712 else if(set_num >= SCC_SETTING_MAX)
2714 else if(!is_editor_preset.scc_setting[set_num])
2717 set = is_editor_preset.scc_setting[set_num];
2719 for(i = 0; i < SCC_MODE_MAX; i++){
2727 for(i = 0; i < SCC_PARAM_MAX; i++){
2736 set->param[i] = num;
2738 for(i = 0; i < SCC_OSC_MAX; i++){
2749 for(i = 0; i < SCC_AMP_MAX; i++)
2751 for(i = 0; i < SCC_PITCH_MAX; i++)
2753 for(i = 0; i < SCC_ENV_PARAM; i++){
2767 set->ampenv[i] = num;
2768 set->pitenv[i] = num;
2770 for(i = 0; i < SCC_LFO_PARAM; i++){
2776 int scc_editor_get_param(int type, int num)
2779 case 0: return scc_setting_edit[0].param[num];
2780 case 1: return scc_setting_edit[0].osc[num];
2781 case 2: return scc_setting_edit[0].amp[num];
2782 case 3: return scc_setting_edit[0].pitch[num];
2783 case 4: return scc_setting_edit[0].ampenv[num];
2784 case 5: return scc_setting_edit[0].pitenv[num];
2785 case 6: return scc_setting_edit[0].lfo1[num];
2786 case 7: return scc_setting_edit[0].lfo2[num];
2787 case 8: return scc_setting_edit[0].mode[num];
2792 void scc_editor_set_param(int type, int num, int val)
2796 scc_setting_edit[0].param[num] = val;
2799 scc_setting_edit[0].osc[num] = val;
2802 scc_setting_edit[0].amp[num] = val;
2805 scc_setting_edit[0].pitch[num] = val;
2808 scc_setting_edit[0].ampenv[num] = val;
2811 scc_setting_edit[0].pitenv[num] = val;
2814 scc_setting_edit[0].lfo1[num] = val;
2817 scc_setting_edit[0].lfo2[num] = val;
2820 scc_setting_edit[0].mode[num] = val;
2825 static void scc_editor_delete_ini(int num)
2830 MyIni_Load(&ini, is_editor_inifile);
2831 snprintf(sec, sizeof(sec), "SCC_%03d", num); //
\8c\85\90\94\8ew
\92è
2832 MyIni_DeleteSection(&ini, sec);
2833 MyIni_Save(&ini, is_editor_inifile);
2834 MyIni_SectionAllClear(&ini);
2837 static void scc_editor_save_ini(int num)
2839 Preset_SCC *setting = NULL;
2841 LPINISEC inisec = NULL;
2842 TCHAR data[258] = "";
2846 if(!is_editor_preset.scc_setting[num])
2848 setting = is_editor_preset.scc_setting[num];
2849 MyIni_Load(&ini, is_editor_inifile);
2850 snprintf(sec, sizeof(sec), "SCC_%03d", num); //
\8c\85\90\94\8ew
\92è
2851 inisec = MyIni_GetSection(&ini, sec, 1);
2852 MyIni_SetString(inisec, "name", setting->inst_name);
2854 for(i = 0; i < SCC_MODE_MAX; i++){
2855 snprintf(data, sizeof(data), "%s%d:", data, setting->mode[i]);
2857 MyIni_SetString(inisec, "mode", data);
2859 for(i = 0; i < SCC_PARAM_MAX; i++){
2860 snprintf(data, sizeof(data), "%s%d:", data, setting->param[i]);
2862 MyIni_SetString(inisec, "param", data);
2864 memset(data, 0, sizeof(data));
2865 for(i = 0; i < SCC_OSC_MAX; i++){
2866 snprintf(data, sizeof(data), "%s%d:", data, setting->osc[i]);
2868 MyIni_SetString(inisec, "osc", data);
2870 memset(data, 0, sizeof(data));
2872 for(i = 0; i < SCC_AMP_MAX; i++){
2873 if(setting->amp[i]) flg++;
2874 snprintf(data, sizeof(data), "%s%d:", data, setting->amp[i]);
2877 MyIni_SetString(inisec, "amp", data);
2879 MyIni_DeleteKey(&ini, sec, "amp");
2881 memset(data, 0, sizeof(data));
2883 for(i = 0; i < SCC_PITCH_MAX; i++){
2884 if(setting->pitch[i]) flg++;
2885 snprintf(data, sizeof(data), "%s%d:", data, setting->pitch[i]);
2888 MyIni_SetString(inisec, "pitch", data);
2890 MyIni_DeleteKey(&ini, sec, "pitch");
2892 if(setting->ampenv[6] < 1) setting->ampenv[6] = 1;
2893 if(setting->ampenv[0] != 0
2894 || setting->ampenv[1] != 100
2895 || setting->ampenv[2] != 0
2896 || setting->ampenv[3] != 100
2897 || setting->ampenv[4] != 0
2898 || setting->ampenv[5] != 100
2899 || setting->ampenv[6] != 1
2900 || setting->ampenv[7] != 0
2901 || setting->ampenv[8] != 0
2902 || setting->ampenv[9] != 0
2903 || setting->ampenv[10] != 0
2904 || setting->ampenv[11] != 0
2905 || setting->ampenv[12] != 0
2906 || setting->ampenv[13] != 0
2908 memset(data, 0, sizeof(data));
2909 for(i = 0; i < SCC_ENV_PARAM; i++){
2910 snprintf(data, sizeof(data), "%s%d:", data, setting->ampenv[i]);
2912 MyIni_SetString(inisec, "ampenv", data);
2914 MyIni_DeleteKey(&ini, sec, "ampenv");
2916 if(setting->pitenv[6] < 1) setting->pitenv[6] = 1;
2917 if(setting->pitenv[0] != 0
2918 || setting->pitenv[1] != 100
2919 || setting->pitenv[2] != 0
2920 || setting->pitenv[3] != 100
2921 || setting->pitenv[4] != 0
2922 || setting->pitenv[5] != 100
2923 || setting->pitenv[6] != 1
2924 || setting->pitenv[7] != 0
2925 || setting->pitenv[8] != 0
2926 || setting->pitenv[9] != 0
2927 || setting->pitenv[10] != 0
2928 || setting->pitenv[11] != 0
2929 || setting->pitenv[12] != 0
2930 || setting->pitenv[13] != 0
2932 memset(data, 0, sizeof(data));
2933 for(i = 0; i < SCC_ENV_PARAM; i++){
2934 snprintf(data, sizeof(data), "%s%d:", data, setting->pitenv[i]);
2936 MyIni_SetString(inisec, "pitenv", data);
2938 MyIni_DeleteKey(&ini, sec, "pitenv");
2940 if(setting->lfo1[0]){
2941 memset(data, 0, sizeof(data));
2942 for(i = 0; i < SCC_LFO_PARAM; i++){
2943 snprintf(data, sizeof(data), "%s%d:", data, setting->lfo1[i]);
2945 MyIni_SetString(inisec, "lfo1", data);
2947 MyIni_DeleteKey(&ini, sec, "lfo1");
2949 if(setting->lfo2[0]){
2950 memset(data, 0, sizeof(data));
2951 for(i = 0; i < SCC_LFO_PARAM; i++){
2952 snprintf(data, sizeof(data), "%s%d:", data, setting->lfo2[i]);
2954 MyIni_SetString(inisec, "lfo2", data);
2956 MyIni_DeleteKey(&ini, sec, "lfo2");
2957 MyIni_Save(&ini, is_editor_inifile);
2958 MyIni_SectionAllClear(&ini);
2961 void scc_editor_delete_preset(int num)
2963 if(num < 0 || num > (SCC_SETTING_MAX - 1))
2965 if(!is_editor_preset.scc_setting[num])
2967 safe_free(is_editor_preset.scc_setting[num]->inst_name);
2968 memset(&is_editor_preset.scc_setting[num], 0, sizeof(Preset_SCC));
2969 scc_editor_delete_ini(num);
2972 void scc_editor_load_preset(int num)
2975 memcpy(&scc_setting_edit[0], &scc_setting_edit[1], sizeof(Preset_SCC));
2977 if(num > (SCC_SETTING_MAX - 1))
2979 if(!is_editor_preset.scc_setting[num])
2981 memcpy(&scc_setting_edit[0], is_editor_preset.scc_setting[num], sizeof(Preset_SCC));
2985 void scc_editor_store_preset(int num)
2990 memcpy(&scc_setting_edit[1], &scc_setting_edit[0], sizeof(Preset_SCC));
2992 if(num > (SCC_SETTING_MAX - 1))
2994 if(!is_editor_preset.scc_setting[num])
2996 tmp = is_editor_preset.scc_setting[num]->inst_name;
2997 memcpy(is_editor_preset.scc_setting[num], &scc_setting_edit[0], sizeof(Preset_SCC));
2998 is_editor_preset.scc_setting[num]->inst_name = tmp;
2999 scc_editor_save_ini(num);
3003 int calc_random_param(int min, int max)
3005 int i, var, mod, center;
3008 center = mod = max > min ? max : min;
3009 mod = center * 2 + 1;
3010 for(i = 0; i < 10000; i++){
3011 var = rand() % (mod) - center;
3012 if(var >= min && var <= max)
3017 for(i = 0; i < 10000; i++){
3018 var = rand() % (mod);
3026 const char *mms_editor_load_name(int num)
3028 if(num < 0 || num >= MMS_SETTING_MAX)
3029 return data_name_empty;
3030 else if(!is_editor_preset.mms_setting[num])
3031 return data_name_empty;
3033 return is_editor_preset.mms_setting[num]->inst_name;
3036 void mms_editor_store_name(int num, const char *name)
3038 if(num < 0 || num >= MMS_SETTING_MAX)
3040 if(!is_editor_preset.mms_setting[num])
3042 if(is_editor_preset.mms_setting[num]->inst_name != NULL)
3043 safe_free(is_editor_preset.mms_setting[num]->inst_name);
3044 is_editor_preset.mms_setting[num]->inst_name = safe_strdup(name);
3047 const char *mms_editor_load_wave_name(int op, int fnc)
3049 int type; // osc_type
3050 int num; // wave_type
3053 type = mms_setting_edit[0].op_wave[op][0]; // osc_type
3054 num = mms_setting_edit[0].op_wave[op][1]; // wave_type
3055 }else switch(fnc){ // lfo1~lfo4
3058 type = 0; // osc_type
3059 num = mms_setting_edit[0].op_lfo1[op][2]; // wave_type
3062 type = 0; // osc_type
3063 num = mms_setting_edit[0].op_lfo2[op][2]; // wave_type
3066 type = 0; // osc_type
3067 num = mms_setting_edit[0].op_lfo3[op][2]; // wave_type
3070 type = 0; // osc_type
3071 num = mms_setting_edit[0].op_lfo4[op][2]; // wave_type
3076 if(num < 0 || num > OSC_NOISE_LOWBIT)
3077 return data_name_empty;
3079 return osc_wave_name[num];
3081 if(num < 0 || num >= SCC_DATA_MAX)
3082 return data_name_empty;
3084 return is_editor_preset.scc_data_name[num];
3086 if(num < 0 || num >= MT32_DATA_MAX)
3087 return data_name_empty;
3089 return la_pcm_data_name[num];
3091 if(num < 0 || num >= CM32L_DATA_MAX)
3092 return data_name_empty;
3094 return la_pcm_data_name[num];
3096 return data_name_empty;
3100 const char *mms_editor_load_filter_name(int op)
3104 num = mms_setting_edit[0].op_filter[op][0]; // filter_type
3105 if(num < 0 || num > FILTER_HBF_L12L6)
3106 return data_name_empty;
3108 return filter_name[num];
3111 static void mms_editor_set_default_param_op(Preset_MMS *set, int op_num)
3115 for(i = 0; i < MMS_OP_PARAM_MAX; i++){
3125 set->op_param[op_num][i] = num;
3127 for(i = 0; i < MMS_OP_CON_MAX; i++)
3128 set->op_connect[op_num][i] = -1;
3129 for(i = 0; i < MMS_OP_RANGE_MAX; i++){
3139 set->op_range[op_num][i] = num;
3141 for(i = 0; i < MMS_OP_OSC_MAX; i++){
3150 set->op_osc[op_num][i] = num;
3152 for(i = 0; i < MMS_OP_WAVE_MAX; i++){
3161 set->op_wave[op_num][i] = num;
3163 for(i = 0; i < MMS_OP_SUB_MAX; i++)
3164 set->op_sub[op_num][i] = 0;
3165 for(i = 0; i < MMS_OP_AMP_MAX; i++)
3166 set->op_amp[op_num][i] = 0;
3167 for(i = 0; i < MMS_OP_PITCH_MAX; i++)
3168 set->op_pitch[op_num][i] = 0;
3169 for(i = 0; i < MMS_OP_WIDTH_MAX; i++)
3170 set->op_width[op_num][i] = 0;
3171 for(i = 0; i < MMS_OP_FLT_PARAM; i++)
3172 set->op_filter[op_num][i] = 0;
3173 for(i = 0; i < MMS_OP_CUT_PARAM; i++)
3174 set->op_cutoff[op_num][i] = 0;
3175 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3189 set->op_ampenv[op_num][i] = num;
3190 set->op_modenv[op_num][i] = num;
3191 set->op_widenv[op_num][i] = num;
3192 set->op_pitenv[op_num][i] = num;
3193 set->op_ampenv_keyf[op_num][i] = 0;
3194 set->op_modenv_keyf[op_num][i] = 0;
3195 set->op_widenv_keyf[op_num][i] = 0;
3196 set->op_pitenv_keyf[op_num][i] = 0;
3197 set->op_ampenv_velf[op_num][i] = 0;
3198 set->op_modenv_velf[op_num][i] = 0;
3199 set->op_widenv_velf[op_num][i] = 0;
3200 set->op_pitenv_velf[op_num][i] = 0;
3202 for(i = 0; i < MMS_OP_LFO_PARAM; i++){
3203 set->op_lfo1[op_num][i] = 0;
3204 set->op_lfo2[op_num][i] = 0;
3205 set->op_lfo3[op_num][i] = 0;
3206 set->op_lfo4[op_num][i] = 0;
3208 for(i = 0; i < MMS_OP_MODE_MAX; i++){
3214 set->op_mode[op_num][i] = num;
3218 void mms_editor_set_default_param(int set_num, int op_num)
3222 Preset_MMS *set = NULL;
3225 set = &mms_setting_edit[0];
3226 else if(set_num >= MMS_SETTING_MAX)
3228 else if(!is_editor_preset.mms_setting[set_num])
3231 set = is_editor_preset.mms_setting[set_num];
3234 for(i = 0; i < MMS_OP_MAX; i++)
3235 mms_editor_set_default_param_op(set, i);
3236 }else if(op_num >= MMS_OP_MAX)
3239 mms_editor_set_default_param_op(set, op_num);
3242 void mms_editor_set_magic_param(void)
3244 Preset_MMS *set = &mms_setting_edit[0];
3245 int i, val = 0, tmp, op_max, osc_mode;
3247 mms_editor_set_default_param(-1, -1);
3248 mms_setting_edit[0].op_max = op_max = calc_random_param(2, 6); // for 2~4op
3253 osc_mode = calc_random_param(0, 1);
3254 set->op_connect[1][1] = !calc_random_param(0, 4) ? 0 : -1; // feedback op1 to op0 10%
3271 for(i = 0; i < op_max; i++){
3272 set->op_param[i][0] = 3; // pm
3273 if(i == (op_max - 1)){
3274 set->op_connect[i][0] = -2;
3275 set->op_param[i][2] = 70; // lev output
3276 set->op_sub[i][0] = calc_random_param(20, 60); // velmod
3277 }else if(!calc_random_param(0, 3)){
3278 set->op_connect[i][0] = op_max - 1;
3279 set->op_param[i][2] = 50; // oplv
3280 set->op_sub[i][0] = calc_random_param(50, 100); // velmod
3282 set->op_connect[i][0] = i + 1;
3283 set->op_param[i][2] = 100; // oplv
3284 set->op_sub[i][0] = calc_random_param(50, 100); // velmod
3286 set->op_param[i][1] = calc_random_param(10, tmp); // modlv
3290 for(i = 0; i < op_max; i++){
3291 set->op_wave[i][0] = 1;
3292 set->op_wave[i][1] = calc_random_param(0, 36); // scc
3293 set->op_osc[i][1] = 100;
3296 for(i = 0; i < (op_max - 1); i++){
3297 set->op_wave[i][0] = 0;
3298 set->op_wave[i][1] = calc_random_param(0, 1); // sin / tri
3300 switch(calc_random_param(0, 5)){
3302 case 0: // 1x2x3x4x5x6x7x...
3303 for(i = 0; i < (op_max - 1); i++){
3304 set->op_osc[i][1] = (calc_random_param(1, 8) * 100); // % (only %mode
3307 case 1: // 2x4x6x8x...
3308 for(i = 0; i < (op_max - 1); i++){
3309 set->op_osc[i][1] = calc_random_param(1, 4) * 200; // % (only %mode
3313 for(i = 0; i < (op_max - 1); i++){
3314 set->op_osc[i][1] = calc_random_param(1, 4) * 200 - 100; // % (only %mode
3318 for(i = 0; i < (op_max - 1); i++){
3319 set->op_osc[i][1] = calc_random_param(3, 8 * 4) * 25; // % (only %mode
3323 set->op_osc[(op_max - 1)][1] = 100;
3327 int atk_min, atk_max, dcy_min, dcy_max;
3328 switch(calc_random_param(0, 3)){
3330 case 0: // fast atk sustain
3333 for(i = 0; i < (op_max - 1); i++){
3334 set->op_ampenv[i][0] = atk_max = calc_random_param(atk_min, atk_max);
3336 set->op_ampenv[i][1] = 100;
3337 set->op_ampenv[i][2] = 0;
3338 set->op_ampenv[i][3] = 100;
3339 set->op_ampenv[i][4] = 10000;
3340 set->op_ampenv[i][5] = 100;
3341 set->op_ampenv[i][6] = 10000;
3342 set->op_ampenv[i][7] = 0;
3345 case 1: // fast atk decay
3350 for(i = 0; i < (op_max - 1); i++){
3351 set->op_ampenv[i][0] = atk_max = calc_random_param(atk_min, atk_max);
3353 set->op_ampenv[i][1] = 100;
3354 set->op_ampenv[i][2] = 0;
3355 set->op_ampenv[i][3] = 100;
3356 set->op_ampenv[i][4] = val = dcy_min = calc_random_param(dcy_min, dcy_max);
3358 set->op_ampenv[i][5] = calc_random_param(0, 50);
3359 set->op_ampenv[i][6] = val;
3360 set->op_ampenv[i][7] = 0;
3363 case 2: // slow atk sustain
3366 for(i = 0; i < (op_max - 1); i++){
3367 set->op_ampenv[i][0] = atk_max = calc_random_param(atk_min, atk_max);
3369 set->op_ampenv[i][1] = 100;
3370 set->op_ampenv[i][2] = 0;
3371 set->op_ampenv[i][3] = 100;
3372 set->op_ampenv[i][4] = 10000;
3373 set->op_ampenv[i][5] = 100;
3374 set->op_ampenv[i][6] = 10000;
3375 set->op_ampenv[i][7] = 0;
3379 set->op_ampenv[(op_max - 1)][0] = calc_random_param(10, 50);
3380 set->op_ampenv[(op_max - 1)][1] = 100;
3381 set->op_ampenv[(op_max - 1)][2] = 0;
3382 set->op_ampenv[(op_max - 1)][3] = 100;
3383 set->op_ampenv[(op_max - 1)][4] = 10000;
3384 set->op_ampenv[(op_max - 1)][5] = 100;
3385 set->op_ampenv[(op_max - 1)][6] = 10000;
3386 set->op_ampenv[(op_max - 1)][7] = 0;
3389 if(osc_mode == 0 && !calc_random_param(0, 4)){
3390 set->op_width[0][1] = calc_random_param(50, 99);
3391 switch(calc_random_param(0, 1)){
3393 case 0: // fast down
3394 set->op_widenv[0][0] = 0;
3395 set->op_widenv[0][1] = 100;
3396 set->op_widenv[0][2] = 0;
3397 set->op_widenv[0][3] = 100;
3398 set->op_widenv[0][4] = val = calc_random_param(200, 1000);
3399 set->op_widenv[0][5] = 0;
3400 set->op_widenv[0][6] = val;
3401 set->op_widenv[0][7] = 0;
3403 case 1: // fast up down
3404 set->op_widenv[0][0] = val = calc_random_param(200, 400);
3405 set->op_widenv[0][1] = 100;
3406 set->op_widenv[0][2] = 0;
3407 set->op_widenv[0][3] = 100;
3408 set->op_widenv[0][4] = val = calc_random_param(400, 1000);
3409 set->op_widenv[0][5] = 0;
3410 set->op_widenv[0][6] = val;
3411 set->op_widenv[0][7] = 0;
3417 int mms_editor_get_param(int type, int op, int num)
3420 case 0: return mms_setting_edit[0].op_max;
3421 case 1: return mms_setting_edit[0].op_range[op][num];
3422 case 2: return mms_setting_edit[0].op_param[op][num];
3423 case 3: return mms_setting_edit[0].op_connect[op][num];
3424 case 4: return mms_setting_edit[0].op_osc[op][num];
3425 case 5: return mms_setting_edit[0].op_wave[op][num];
3426 case 6: return mms_setting_edit[0].op_sub[op][num];
3427 case 7: return mms_setting_edit[0].op_amp[op][num];
3428 case 8: return mms_setting_edit[0].op_pitch[op][num];
3429 case 9: return mms_setting_edit[0].op_width[op][num];
3430 case 10: return mms_setting_edit[0].op_filter[op][num];
3431 case 11: return mms_setting_edit[0].op_cutoff[op][num];
3432 case 12: return mms_setting_edit[0].op_ampenv[op][num];
3433 case 13: return mms_setting_edit[0].op_pitenv[op][num];
3434 case 14: return mms_setting_edit[0].op_widenv[op][num];
3435 case 15: return mms_setting_edit[0].op_modenv[op][num];
3436 case 16: return mms_setting_edit[0].op_ampenv_keyf[op][num];
3437 case 17: return mms_setting_edit[0].op_pitenv_keyf[op][num];
3438 case 18: return mms_setting_edit[0].op_widenv_keyf[op][num];
3439 case 19: return mms_setting_edit[0].op_modenv_keyf[op][num];
3440 case 20: return mms_setting_edit[0].op_ampenv_velf[op][num];
3441 case 21: return mms_setting_edit[0].op_pitenv_velf[op][num];
3442 case 22: return mms_setting_edit[0].op_widenv_velf[op][num];
3443 case 23: return mms_setting_edit[0].op_modenv_velf[op][num];
3444 case 24: return mms_setting_edit[0].op_lfo1[op][num];
3445 case 25: return mms_setting_edit[0].op_lfo2[op][num];
3446 case 26: return mms_setting_edit[0].op_lfo3[op][num];
3447 case 27: return mms_setting_edit[0].op_lfo4[op][num];
3448 case 28: return mms_setting_edit[0].op_mode[op][num];
3453 void mms_editor_set_param(int type, int op, int num, int val)
3456 case 0: mms_setting_edit[0].op_max = val > MMS_OP_MAX ? MMS_OP_MAX : val;
3458 case 1: mms_setting_edit[0].op_range[op][num] = val;
3460 case 2: mms_setting_edit[0].op_param[op][num] = val;
3462 case 3: mms_setting_edit[0].op_connect[op][num] = val;
3464 case 4: mms_setting_edit[0].op_osc[op][num] = val;
3466 case 5: mms_setting_edit[0].op_wave[op][num] = val;
3468 case 6: mms_setting_edit[0].op_sub[op][num] = val;
3470 case 7: mms_setting_edit[0].op_amp[op][num] = val;
3472 case 8: mms_setting_edit[0].op_pitch[op][num] = val;
3474 case 9: mms_setting_edit[0].op_width[op][num] = val;
3476 case 10: mms_setting_edit[0].op_filter[op][num] = val;
3478 case 11: mms_setting_edit[0].op_cutoff[op][num] = val;
3480 case 12: mms_setting_edit[0].op_ampenv[op][num] = val;
3482 case 13: mms_setting_edit[0].op_pitenv[op][num] = val;
3484 case 14: mms_setting_edit[0].op_widenv[op][num] = val;
3486 case 15: mms_setting_edit[0].op_modenv[op][num] = val;
3488 case 16: mms_setting_edit[0].op_ampenv_keyf[op][num] = val;
3490 case 17: mms_setting_edit[0].op_pitenv_keyf[op][num] = val;
3492 case 18: mms_setting_edit[0].op_widenv_keyf[op][num] = val;
3494 case 19: mms_setting_edit[0].op_modenv_keyf[op][num] = val;
3496 case 20: mms_setting_edit[0].op_ampenv_velf[op][num] = val;
3498 case 21: mms_setting_edit[0].op_pitenv_velf[op][num] = val;
3500 case 22: mms_setting_edit[0].op_widenv_velf[op][num] = val;
3502 case 23: mms_setting_edit[0].op_modenv_velf[op][num] = val;
3504 case 24: mms_setting_edit[0].op_lfo1[op][num] = val;
3506 case 25: mms_setting_edit[0].op_lfo2[op][num] = val;
3508 case 26: mms_setting_edit[0].op_lfo3[op][num] = val;
3510 case 27: mms_setting_edit[0].op_lfo4[op][num] = val;
3512 case 28: mms_setting_edit[0].op_mode[op][num] = val;
3517 static void mms_editor_delete_ini(int num)
3522 MyIni_Load(&ini, is_editor_inifile);
3523 snprintf(sec, sizeof(sec), "MMS_%03d", num); //
\8c\85\90\94\8ew
\92è
3524 MyIni_DeleteSection(&ini, sec);
3525 MyIni_Save(&ini, is_editor_inifile);
3526 MyIni_SectionAllClear(&ini);
3529 static void mms_editor_save_ini(int num)
3531 Preset_MMS *setting = NULL;
3533 LPINISEC inisec = NULL;
3534 TCHAR data[258] = "";
3539 if(!is_editor_preset.mms_setting[num])
3541 setting = is_editor_preset.mms_setting[num];
3542 MyIni_Load(&ini, is_editor_inifile);
3543 snprintf(sec, sizeof(sec), "MMS_%03d", num); //
\8c\85\90\94\8ew
\92è
3544 inisec = MyIni_GetSection(&ini, sec, 1);
3545 MyIni_SetString(inisec, "name", setting->inst_name);
3546 MyIni_SetInt32(inisec, "op_max", setting->op_max);
3547 for(j = 0; j < MMS_OP_MAX; j++){
3548 if(j >= setting->op_max){
3549 //
\8eg
\97p
\82µ
\82È
\82¢OP
\82Ì
\83L
\81[
\8dí
\8f\9c
3550 snprintf(key, sizeof(key), "op_%d_mode", j);
3551 MyIni_DeleteKey(&ini, sec, key);
3552 snprintf(key, sizeof(key), "op_%d_range", j);
3553 MyIni_DeleteKey(&ini, sec, key);
3554 snprintf(key, sizeof(key), "op_%d_param", j);
3555 MyIni_DeleteKey(&ini, sec, key);
3556 snprintf(key, sizeof(key), "op_%d_connect", j);
3557 MyIni_DeleteKey(&ini, sec, key);
3558 snprintf(key, sizeof(key), "op_%d_osc", j);
3559 MyIni_DeleteKey(&ini, sec, key);
3560 snprintf(key, sizeof(key), "op_%d_wave", j);
3561 MyIni_DeleteKey(&ini, sec, key);
3562 snprintf(key, sizeof(key), "op_%d_sub", j);
3563 MyIni_DeleteKey(&ini, sec, key);
3564 snprintf(key, sizeof(key), "op_%d_amp", j);
3565 MyIni_DeleteKey(&ini, sec, key);
3566 snprintf(key, sizeof(key), "op_%d_pitch", j);
3567 MyIni_DeleteKey(&ini, sec, key);
3568 snprintf(key, sizeof(key), "op_%d_width", j);
3569 MyIni_DeleteKey(&ini, sec, key);
3570 snprintf(key, sizeof(key), "op_%d_filter", j);
3571 MyIni_DeleteKey(&ini, sec, key);
3572 snprintf(key, sizeof(key), "op_%d_cutoff", j);
3573 MyIni_DeleteKey(&ini, sec, key);
3574 snprintf(key, sizeof(key), "op_%d_ampenv", j);
3575 MyIni_DeleteKey(&ini, sec, key);
3576 snprintf(key, sizeof(key), "op_%d_pitenv", j);
3577 MyIni_DeleteKey(&ini, sec, key);
3578 snprintf(key, sizeof(key), "op_%d_widenv", j);
3579 MyIni_DeleteKey(&ini, sec, key);
3580 snprintf(key, sizeof(key), "op_%d_modenv", j);
3581 MyIni_DeleteKey(&ini, sec, key);
3582 snprintf(key, sizeof(key), "op_%d_ampenv_keyf", j);
3583 MyIni_DeleteKey(&ini, sec, key);
3584 snprintf(key, sizeof(key), "op_%d_pitenv_keyf", j);
3585 MyIni_DeleteKey(&ini, sec, key);
3586 snprintf(key, sizeof(key), "op_%d_widenv_keyf", j);
3587 MyIni_DeleteKey(&ini, sec, key);
3588 snprintf(key, sizeof(key), "op_%d_modenv_keyf", j);
3589 MyIni_DeleteKey(&ini, sec, key);
3590 snprintf(key, sizeof(key), "op_%d_ampenv_velf", j);
3591 MyIni_DeleteKey(&ini, sec, key);
3592 snprintf(key, sizeof(key), "op_%d_pitenv_velf", j);
3593 MyIni_DeleteKey(&ini, sec, key);
3594 snprintf(key, sizeof(key), "op_%d_widenv_velf", j);
3595 MyIni_DeleteKey(&ini, sec, key);
3596 snprintf(key, sizeof(key), "op_%d_modenv_velf", j);
3597 MyIni_DeleteKey(&ini, sec, key);
3598 snprintf(key, sizeof(key), "op_%d_lfo1", j);
3599 MyIni_DeleteKey(&ini, sec, key);
3600 snprintf(key, sizeof(key), "op_%d_lfo2", j);
3601 MyIni_DeleteKey(&ini, sec, key);
3602 snprintf(key, sizeof(key), "op_%d_lfo3", j);
3603 MyIni_DeleteKey(&ini, sec, key);
3604 snprintf(key, sizeof(key), "op_%d_lfo4", j);
3605 MyIni_DeleteKey(&ini, sec, key);
3609 snprintf(key, sizeof(key), "op_%d_mode", j);
3611 if(setting->op_mode[j][0] > 0){
3612 memset(data, 0, sizeof(data));
3613 for(i = 0; i < MMS_OP_MODE_MAX; i++){
3614 if(setting->op_mode[j][i]) flg++;
3615 snprintf(data, sizeof(data), "%s%d:", data, setting->op_mode[j][i]);
3617 MyIni_SetString(inisec, key, data);
3619 MyIni_DeleteKey(&ini, sec, key);
3621 snprintf(key, sizeof(key), "op_%d_range", j);
3622 memset(data, 0, sizeof(data));
3623 for(i = 0; i < MMS_OP_RANGE_MAX; i++){
3624 snprintf(data, sizeof(data), "%s%d:", data, setting->op_range[j][i]);
3626 if(setting->op_range[j][0] != 0
3627 || setting->op_range[j][1] != 127
3628 || setting->op_range[j][2] != 0
3629 || setting->op_range[j][3] != 127)
3630 MyIni_SetString(inisec, key, data);
3632 MyIni_DeleteKey(&ini, sec, key);
3634 snprintf(key, sizeof(key), "op_%d_param", j);
3635 memset(data, 0, sizeof(data));
3636 for(i = 0; i < MMS_OP_PARAM_MAX; i++){
3637 snprintf(data, sizeof(data), "%s%d:", data, setting->op_param[j][i]);
3639 MyIni_SetString(inisec, key, data);
3641 snprintf(key, sizeof(key), "op_%d_connect", j);
3642 memset(data, 0, sizeof(data));
3644 for(i = 0; i < MMS_OP_CON_MAX; i++){
3645 if(setting->op_connect[j][i] != -1) flg++;
3646 snprintf(data, sizeof(data), "%s%d:", data, setting->op_connect[j][i]);
3649 MyIni_SetString(inisec, key, data);
3651 MyIni_DeleteKey(&ini, sec, key);
3653 snprintf(key, sizeof(key), "op_%d_osc", j);
3654 memset(data, 0, sizeof(data));
3656 for(i = 0; i < MMS_OP_OSC_MAX; i++){
3658 if(setting->op_osc[j][i] != 100) flg++;
3660 if(setting->op_osc[j][i]) flg++;
3661 snprintf(data, sizeof(data), "%s%d:", data, setting->op_osc[j][i]);
3664 MyIni_SetString(inisec, key, data);
3666 MyIni_DeleteKey(&ini, sec, key);
3668 snprintf(key, sizeof(key), "op_%d_wave", j);
3669 memset(data, 0, sizeof(data));
3671 for(i = 0; i < MMS_OP_WAVE_MAX; i++){
3673 if(setting->op_wave[j][i] != 100) flg++;
3675 if(setting->op_wave[j][i]) flg++;
3676 snprintf(data, sizeof(data), "%s%d:", data, setting->op_wave[j][i]);
3679 MyIni_SetString(inisec, key, data);
3681 MyIni_DeleteKey(&ini, sec, key);
3683 snprintf(key, sizeof(key), "op_%d_sub", j);
3684 memset(data, 0, sizeof(data));
3686 for(i = 0; i < MMS_OP_SUB_MAX; i++){
3687 if(setting->op_sub[j][i]) flg++;
3688 snprintf(data, sizeof(data), "%s%d:", data, setting->op_sub[j][i]);
3691 MyIni_SetString(inisec, key, data);
3693 MyIni_DeleteKey(&ini, sec, key);
3695 snprintf(key, sizeof(key), "op_%d_amp", j);
3696 memset(data, 0, sizeof(data));
3698 for(i = 0; i < MMS_OP_AMP_MAX; i++){
3699 if(setting->op_amp[j][i]) flg++;
3700 snprintf(data, sizeof(data), "%s%d:", data, setting->op_amp[j][i]);
3703 MyIni_SetString(inisec, key, data);
3705 MyIni_DeleteKey(&ini, sec, key);
3707 snprintf(key, sizeof(key), "op_%d_pitch", j);
3708 memset(data, 0, sizeof(data));
3710 for(i = 0; i < MMS_OP_PITCH_MAX; i++){
3711 if(setting->op_pitch[j][i]) flg++;
3712 snprintf(data, sizeof(data), "%s%d:", data, setting->op_pitch[j][i]);
3715 MyIni_SetString(inisec, key, data);
3717 MyIni_DeleteKey(&ini, sec, key);
3719 snprintf(key, sizeof(key), "op_%d_width", j);
3720 memset(data, 0, sizeof(data));
3722 for(i = 0; i < MMS_OP_WIDTH_MAX; i++){
3723 if(setting->op_width[j][i]) flg++;
3724 snprintf(data, sizeof(data), "%s%d:", data, setting->op_width[j][i]);
3727 MyIni_SetString(inisec, key, data);
3729 MyIni_DeleteKey(&ini, sec, key);
3731 snprintf(key, sizeof(key), "op_%d_filter", j);
3732 memset(data, 0, sizeof(data));
3734 for(i = 0; i < MMS_OP_FLT_PARAM; i++){
3735 if(setting->op_filter[j][i]) flg++;
3736 snprintf(data, sizeof(data), "%s%d:", data, setting->op_filter[j][i]);
3739 MyIni_SetString(inisec, key, data);
3741 MyIni_DeleteKey(&ini, sec, key);
3743 snprintf(key, sizeof(key), "op_%d_cutoff", j);
3744 memset(data, 0, sizeof(data));
3746 for(i = 0; i < MMS_OP_CUT_PARAM; i++){
3747 if(setting->op_cutoff[j][i]) flg++;
3748 snprintf(data, sizeof(data), "%s%d:", data, setting->op_cutoff[j][i]);
3751 MyIni_SetString(inisec, key, data);
3753 MyIni_DeleteKey(&ini, sec, key);
3755 snprintf(key, sizeof(key), "op_%d_ampenv", j);
3756 if(setting->op_ampenv[j][6] < 1) setting->op_ampenv[j][6] = 1;
3757 if(setting->op_ampenv[j][0] != 0
3758 || setting->op_ampenv[j][1] != 100
3759 || setting->op_ampenv[j][2] != 0
3760 || setting->op_ampenv[j][3] != 100
3761 || setting->op_ampenv[j][4] != 0
3762 || setting->op_ampenv[j][5] != 100
3763 || setting->op_ampenv[j][6] != 1
3764 || setting->op_ampenv[j][7] != 0
3765 || setting->op_ampenv[j][8] != 0
3766 || setting->op_ampenv[j][9] != 0
3767 || setting->op_ampenv[j][10] != 0
3768 || setting->op_ampenv[j][11] != 0
3769 || setting->op_ampenv[j][12] != 0
3770 || setting->op_ampenv[j][13] != 0
3772 memset(data, 0, sizeof(data));
3773 if(setting->op_ampenv[j][6] < 1)
3774 setting->op_ampenv[j][6] = 1;
3775 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3776 snprintf(data, sizeof(data), "%s%d:", data, setting->op_ampenv[j][i]);
3778 MyIni_SetString(inisec, key, data);
3780 MyIni_DeleteKey(&ini, sec, key);
3782 snprintf(key, sizeof(key), "op_%d_pitenv", j);
3783 if(setting->op_pitenv[j][6] < 1) setting->op_pitenv[j][6] = 1;
3784 if(setting->op_pitenv[j][0] != 0
3785 || setting->op_pitenv[j][1] != 100
3786 || setting->op_pitenv[j][2] != 0
3787 || setting->op_pitenv[j][3] != 100
3788 || setting->op_pitenv[j][4] != 0
3789 || setting->op_pitenv[j][5] != 100
3790 || setting->op_pitenv[j][6] != 1
3791 || setting->op_pitenv[j][7] != 0
3792 || setting->op_pitenv[j][8] != 0
3793 || setting->op_pitenv[j][9] != 0
3794 || setting->op_pitenv[j][10] != 0
3795 || setting->op_pitenv[j][11] != 0
3796 || setting->op_pitenv[j][12] != 0
3797 || setting->op_pitenv[j][13] != 0
3799 memset(data, 0, sizeof(data));
3800 if(setting->op_pitenv[j][6] < 1) setting->op_pitenv[j][6] = 1;
3801 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3802 snprintf(data, sizeof(data), "%s%d:", data, setting->op_pitenv[j][i]);
3804 MyIni_SetString(inisec, key, data);
3806 MyIni_DeleteKey(&ini, sec, key);
3808 snprintf(key, sizeof(key), "op_%d_widenv", j);
3809 if(setting->op_widenv[j][6] < 1) setting->op_widenv[j][6] = 1;
3810 if(setting->op_widenv[j][0] != 0
3811 || setting->op_widenv[j][1] != 100
3812 || setting->op_widenv[j][2] != 0
3813 || setting->op_widenv[j][3] != 100
3814 || setting->op_widenv[j][4] != 0
3815 || setting->op_widenv[j][5] != 100
3816 || setting->op_widenv[j][6] != 1
3817 || setting->op_widenv[j][7] != 0
3818 || setting->op_widenv[j][8] != 0
3819 || setting->op_widenv[j][9] != 0
3820 || setting->op_widenv[j][10] != 0
3821 || setting->op_widenv[j][11] != 0
3822 || setting->op_widenv[j][12] != 0
3823 || setting->op_widenv[j][13] != 0
3825 memset(data, 0, sizeof(data));
3826 if(setting->op_widenv[j][6] < 1) setting->op_widenv[j][6] = 1;
3827 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3828 snprintf(data, sizeof(data), "%s%d:", data, setting->op_widenv[j][i]);
3830 MyIni_SetString(inisec, key, data);
3832 MyIni_DeleteKey(&ini, sec, key);
3834 snprintf(key, sizeof(key), "op_%d_modenv", j);
3835 if(setting->op_modenv[j][6] < 1) setting->op_modenv[j][6] = 1;
3836 if(setting->op_modenv[j][0] != 0
3837 || setting->op_modenv[j][1] != 100
3838 || setting->op_modenv[j][2] != 0
3839 || setting->op_modenv[j][3] != 100
3840 || setting->op_modenv[j][4] != 0
3841 || setting->op_modenv[j][5] != 100
3842 || setting->op_modenv[j][6] != 1
3843 || setting->op_modenv[j][7] != 0
3844 || setting->op_modenv[j][8] != 0
3845 || setting->op_modenv[j][9] != 0
3846 || setting->op_modenv[j][10] != 0
3847 || setting->op_modenv[j][11] != 0
3848 || setting->op_modenv[j][12] != 0
3849 || setting->op_modenv[j][13] != 0
3851 memset(data, 0, sizeof(data));
3852 if(setting->op_modenv[j][6] < 1) setting->op_modenv[j][6] = 1;
3853 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3854 snprintf(data, sizeof(data), "%s%d:", data, setting->op_modenv[j][i]);
3856 MyIni_SetString(inisec, key, data);
3858 MyIni_DeleteKey(&ini, sec, key);
3860 snprintf(key, sizeof(key), "op_%d_ampenv_keyf", j);
3861 memset(data, 0, sizeof(data));
3863 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3864 if(setting->op_ampenv_keyf[j][i]) flg++;
3865 snprintf(data, sizeof(data), "%s%d:", data, setting->op_ampenv_keyf[j][i]);
3868 MyIni_SetString(inisec, key, data);
3870 MyIni_DeleteKey(&ini, sec, key);
3872 snprintf(key, sizeof(key), "op_%d_pitenv_keyf", j);
3873 memset(data, 0, sizeof(data));
3875 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3876 if(setting->op_pitenv_keyf[j][i]) flg++;
3877 snprintf(data, sizeof(data), "%s%d:", data, setting->op_pitenv_keyf[j][i]);
3880 MyIni_SetString(inisec, key, data);
3882 MyIni_DeleteKey(&ini, sec, key);
3884 snprintf(key, sizeof(key), "op_%d_widenv_keyf", j);
3885 memset(data, 0, sizeof(data));
3887 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3888 if(setting->op_widenv_keyf[j][i]) flg++;
3889 snprintf(data, sizeof(data), "%s%d:", data, setting->op_widenv_keyf[j][i]);
3892 MyIni_SetString(inisec, key, data);
3894 MyIni_DeleteKey(&ini, sec, key);
3896 snprintf(key, sizeof(key), "op_%d_modenv_keyf", j);
3897 memset(data, 0, sizeof(data));
3899 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3900 if(setting->op_modenv_keyf[j][i]) flg++;
3901 snprintf(data, sizeof(data), "%s%d:", data, setting->op_modenv_keyf[j][i]);
3904 MyIni_SetString(inisec, key, data);
3906 MyIni_DeleteKey(&ini, sec, key);
3908 snprintf(key, sizeof(key), "op_%d_ampenv_velf", j);
3909 memset(data, 0, sizeof(data));
3911 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3912 if(setting->op_ampenv_velf[j][i]) flg++;
3913 snprintf(data, sizeof(data), "%s%d:", data, setting->op_ampenv_velf[j][i]);
3916 MyIni_SetString(inisec, key, data);
3918 MyIni_DeleteKey(&ini, sec, key);
3920 snprintf(key, sizeof(key), "op_%d_pitenv_velf", j);
3921 memset(data, 0, sizeof(data));
3923 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3924 if(setting->op_pitenv_velf[j][i]) flg++;
3925 snprintf(data, sizeof(data), "%s%d:", data, setting->op_pitenv_velf[j][i]);
3928 MyIni_SetString(inisec, key, data);
3930 MyIni_DeleteKey(&ini, sec, key);
3932 snprintf(key, sizeof(key), "op_%d_widenv_velf", j);
3933 memset(data, 0, sizeof(data));
3935 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3936 if(setting->op_widenv_velf[j][i]) flg++;
3937 snprintf(data, sizeof(data), "%s%d:", data, setting->op_widenv_velf[j][i]);
3940 MyIni_SetString(inisec, key, data);
3942 MyIni_DeleteKey(&ini, sec, key);
3944 snprintf(key, sizeof(key), "op_%d_modenv_velf", j);
3945 memset(data, 0, sizeof(data));
3947 for(i = 0; i < MMS_OP_ENV_PARAM; i++){
3948 if(setting->op_modenv_velf[j][i]) flg++;
3949 snprintf(data, sizeof(data), "%s%d:", data, setting->op_modenv_velf[j][i]);
3952 MyIni_SetString(inisec, key, data);
3954 MyIni_DeleteKey(&ini, sec, key);
3956 snprintf(key, sizeof(key), "op_%d_lfo1", j);
3957 if(setting->op_lfo1[j][0] > 0){
3958 memset(data, 0, sizeof(data));
3959 for(i = 0; i < MMS_OP_LFO_PARAM; i++){
3960 if(setting->op_lfo1[j][i]) flg++;
3961 snprintf(data, sizeof(data), "%s%d:", data, setting->op_lfo1[j][i]);
3963 MyIni_SetString(inisec, key, data);
3965 MyIni_DeleteKey(&ini, sec, key);
3967 snprintf(key, sizeof(key), "op_%d_lfo2", j);
3968 if(setting->op_lfo2[j][0] > 0){
3969 memset(data, 0, sizeof(data));
3970 for(i = 0; i < MMS_OP_LFO_PARAM; i++){
3971 if(setting->op_lfo2[j][i]) flg++;
3972 snprintf(data, sizeof(data), "%s%d:", data, setting->op_lfo2[j][i]);
3974 MyIni_SetString(inisec, key, data);
3976 MyIni_DeleteKey(&ini, sec, key);
3978 snprintf(key, sizeof(key), "op_%d_lfo3", j);
3979 if(setting->op_lfo3[j][0] > 0){
3980 memset(data, 0, sizeof(data));
3981 for(i = 0; i < MMS_OP_LFO_PARAM; i++){
3982 if(setting->op_lfo3[j][i]) flg++;
3983 snprintf(data, sizeof(data), "%s%d:", data, setting->op_lfo3[j][i]);
3985 MyIni_SetString(inisec, key, data);
3987 MyIni_DeleteKey(&ini, sec, key);
3989 snprintf(key, sizeof(key), "op_%d_lfo4", j);
3990 if(setting->op_lfo4[j][0] > 0){
3991 memset(data, 0, sizeof(data));
3992 for(i = 0; i < MMS_OP_LFO_PARAM; i++){
3993 if(setting->op_lfo4[j][i]) flg++;
3994 snprintf(data, sizeof(data), "%s%d:", data, setting->op_lfo4[j][i]);
3996 MyIni_SetString(inisec, key, data);
3998 MyIni_DeleteKey(&ini, sec, key);
4000 MyIni_Save(&ini, is_editor_inifile);
4001 MyIni_SectionAllClear(&ini);
4004 void mms_editor_delete_preset(int num)
4006 if(num < 0 || num > (MMS_SETTING_MAX - 1))
4008 if(!is_editor_preset.mms_setting[num])
4010 safe_free(is_editor_preset.mms_setting[num]->inst_name);
4011 memset(is_editor_preset.mms_setting[num], 0, sizeof(Preset_MMS));
4012 mms_editor_delete_ini(num);
4015 void mms_editor_load_preset(int num)
4018 memcpy(&mms_setting_edit[0], &mms_setting_edit[1], sizeof(Preset_MMS));
4020 if(num > (MMS_SETTING_MAX - 1))
4022 if(!is_editor_preset.mms_setting[num])
4024 memcpy(&mms_setting_edit[0], is_editor_preset.mms_setting[num], sizeof(Preset_MMS));
4028 void mms_editor_store_preset(int num)
4033 memcpy(&mms_setting_edit[1], &mms_setting_edit[0], sizeof(Preset_MMS));
4035 if(num > (MMS_SETTING_MAX - 1))
4037 if(!is_editor_preset.mms_setting[num])
4039 tmp = is_editor_preset.mms_setting[num]->inst_name;
4040 memcpy(is_editor_preset.mms_setting[num], &mms_setting_edit[0], sizeof(Preset_MMS));
4041 is_editor_preset.mms_setting[num]->inst_name = tmp;
4042 mms_editor_save_ini(num);
4046 const char *is_editor_get_ini_path(void)
4048 return (const char *)is_editor_inifile;
4051 void is_editor_set_ini_path(const char *name)
4053 strcpy(is_editor_inifile, name);
4056 void free_is_editor_preset(void)
4059 Preset_IS *set = &is_editor_preset;
4061 safe_free(set->ini_file);
4062 set->ini_file = NULL;
4063 set->scc_data_load = 0;
4064 for (i = 0; i < SCC_DATA_MAX; i++) {
4065 safe_free(set->scc_data_name[i]);
4066 set->scc_data_name[i] = NULL;
4068 for (i = 0; i < SCC_SETTING_MAX; i++) {
4069 if(!set->scc_setting[i])
4071 safe_free(set->scc_setting[i]->inst_name);
4072 set->scc_setting[i]->inst_name = NULL;
4073 safe_free(set->scc_setting[i]);
4074 set->scc_setting[i] = NULL;
4076 for (i = 0; i < MMS_SETTING_MAX; i++) {
4077 if(!set->mms_setting[i])
4079 safe_free(set->mms_setting[i]->inst_name);
4080 set->mms_setting[i]->inst_name = NULL;
4081 safe_free(set->mms_setting[i]);
4082 set->mms_setting[i] = NULL;
4087 void is_editor_load_ini(void)
4089 free_is_editor_preset();
4090 scc_data_editor_override = 0;
4091 scc_editor_override = 0;
4092 mms_editor_override = 0;
4093 load_int_synth_preset(is_editor_inifile, &is_editor_preset, IS_INI_TYPE_ALL, IS_INI_PRESET_ALL, IS_INI_PRESET_INIT); // all, init
4094 scc_data_editor_load_preset(0);
4095 scc_data_editor_store_preset(-1);
4096 scc_editor_load_preset(0);
4097 scc_editor_store_preset(-1);
4098 mms_editor_load_preset(0);
4099 mms_editor_store_preset(-1);
4102 void init_is_editor_param(void)
4105 scc_data_editor_override = 0;
4106 scc_editor_override = 0;
4107 mms_editor_override = 0;
4110 void uninit_is_editor_param(void)
4112 scc_data_editor_override = 0;
4113 scc_editor_override = 0;
4114 mms_editor_override = 0;
4115 free_is_editor_preset();
4130 #define IS_ENVRATE_MAX (0x3FFFFFFFL)
4131 #define IS_ENVRATE_MIN (1L)
4133 /* from instrum.c */
4134 static int32 convert_envelope_rate(uint8 rate)
4138 r=3-((rate>>6) & 0x3);
4140 r = (int32)(rate & 0x3f) << r; /* 6.9 fixed point */
4141 /* 15.15 fixed point. */
4142 return (((r * 44100) / play_mode->rate) * control_ratio) << ((fast_decay) ? 10 : 9);
4145 /* from instrum.c */
4146 static int32 convert_envelope_offset(uint8 offset)
4148 /* 15.15 fixed point */
4149 return offset << (7+15);
4152 static void init_sample_param(Sample *sample)
4154 memset(sample, 0, sizeof(Sample));
4155 sample->data = NULL;
4156 sample->data_type = SAMPLE_TYPE_INT16;
4157 sample->data_alloced = 0; // use Preset_SCC Preset_MMS ptr , see instrum.c free_instrument()
4159 sample->loop_start = 0;
4160 sample->loop_end = INT_MAX;
4161 sample->data_length = INT_MAX;
4162 sample->sample_rate = play_mode->rate;
4163 sample->low_key = 0;
4164 sample->high_key = 127;
4165 sample->root_key = 60;
4166 sample->root_freq = freq_table[60];
4168 sample->def_pan = 64;
4169 sample->sample_pan = 0.0;
4170 sample->note_to_use = 0;
4171 sample->volume = 1.0;
4172 sample->cfg_amp = 1.0;
4173 sample->modes = MODES_16BIT | MODES_LOOPING | MODES_SUSTAIN | MODES_ENVELOPE;
4174 sample->low_vel = 0;
4175 sample->high_vel = 127;
4176 sample->tremolo_delay = 0; // 0ms
4177 sample->tremolo_freq = 5000; // mHz 5Hz
4178 sample->tremolo_sweep = 5; // 5ms
4179 sample->tremolo_to_amp = 0; // 0.01%
4180 sample->tremolo_to_pitch = 0; // cent
4181 sample->tremolo_to_fc = 0; // cent
4182 sample->vibrato_delay = 0; // 0ms
4183 sample->vibrato_freq = 5000; // mHz 5Hz
4184 sample->vibrato_sweep = 5; // 5ms
4185 sample->vibrato_to_amp = 0; // 0.01%
4186 sample->vibrato_to_pitch = 0; // cent
4187 sample->vibrato_to_fc = 0; // cent
4188 sample->cutoff_freq = 20000;
4189 sample->cutoff_low_limit = -1;
4190 sample->cutoff_low_keyf = 0; // cent
4191 sample->resonance = 0;
4192 sample->modenv_to_pitch = 0;
4193 sample->modenv_to_fc =0;
4194 sample->vel_to_fc = 0;
4195 sample->key_to_fc = 0;
4196 sample->vel_to_resonance = 0;
4197 sample->envelope_velf_bpo = 64;
4198 sample->modenv_velf_bpo = 64;
4199 sample->envelope_keyf_bpo = 60;
4200 sample->modenv_keyf_bpo = 60;
4201 sample->vel_to_fc_threshold = 0;
4202 sample->key_to_fc_bpo = 60;
4203 sample->scale_freq = 60;
4204 sample->scale_factor = 1024;
4205 sample->sample_type = SF_SAMPLETYPE_MONO;
4206 sample->root_freq_org = 60;
4207 sample->sample_rate_org = play_mode->rate;
4208 sample->sf_sample_link = -1;
4209 sample->sf_sample_index = 0;
4210 sample->lpf_type = -1;
4211 sample->keep_voice = 0;
4212 sample->hpf[0] = -1; // opt_hpf_def
4213 sample->hpf[1] = 10;
4215 sample->root_freq_detected = 0;
4216 sample->transpose_detected = 0;
4218 sample->pitch_envelope[0] = 0; // 0cent init
4219 sample->pitch_envelope[1] = 0; // 0cent atk
4220 sample->pitch_envelope[2] = 0; // 125ms atk
4221 sample->pitch_envelope[3] = 0; // 0cent dcy1
4222 sample->pitch_envelope[4] = 0; // 125ms dcy1
4223 sample->pitch_envelope[5] = 0; // 0cent dcy2
4224 sample->pitch_envelope[6] = 0; // 125ms dcy3
4225 sample->pitch_envelope[7] = 0; // 0cent rls
4226 sample->pitch_envelope[8] = 0; // 125ms rls
4227 sample->envelope_delay = 0;
4228 sample->envelope_offset[0] = convert_envelope_offset(255);
4229 sample->envelope_rate[0] = IS_ENVRATE_MAX; // instant
4230 sample->envelope_offset[1] = convert_envelope_offset(255);
4231 sample->envelope_rate[1] = IS_ENVRATE_MAX; // instant
4232 sample->envelope_offset[2] = convert_envelope_offset(255);
4233 sample->envelope_rate[2] = IS_ENVRATE_MAX; // instant
4234 sample->envelope_offset[3] = 0;
4235 sample->envelope_rate[3] = convert_envelope_rate(250);
4236 sample->envelope_offset[4] = 0;
4237 sample->envelope_rate[4] = convert_envelope_rate(250);
4238 sample->envelope_offset[5] = 0;
4239 sample->envelope_rate[5] = convert_envelope_rate(250);
4240 sample->modenv_delay = 0;
4241 sample->modenv_offset[0] = convert_envelope_offset(255);
4242 sample->modenv_rate[0] = IS_ENVRATE_MAX; // instant
4243 sample->modenv_offset[1] = convert_envelope_offset(255);
4244 sample->modenv_rate[1] = IS_ENVRATE_MAX; // instant
4245 sample->modenv_offset[2] = convert_envelope_offset(255);
4246 sample->modenv_rate[2] = IS_ENVRATE_MAX; // instant
4247 sample->modenv_offset[3] = 0;
4248 sample->modenv_rate[3] = convert_envelope_rate(1);
4249 sample->modenv_offset[4] = 0;
4250 sample->modenv_rate[4] = convert_envelope_rate(1);
4251 sample->modenv_offset[5] = 0;
4252 sample->modenv_rate[5] = convert_envelope_rate(1);
4253 sample->envelope_keyf[0] = 0;
4254 sample->envelope_keyf[1] = 0;
4255 sample->envelope_keyf[2] = 0;
4256 sample->envelope_keyf[3] = 0;
4257 sample->envelope_keyf[4] = 0;
4258 sample->envelope_keyf[5] = 0;
4259 sample->envelope_velf[0] = 0;
4260 sample->envelope_velf[1] = 0;
4261 sample->envelope_velf[2] = 0;
4262 sample->envelope_velf[3] = 0;
4263 sample->envelope_velf[4] = 0;
4264 sample->envelope_velf[5] = 0;
4265 sample->modenv_keyf[0] = 0;
4266 sample->modenv_keyf[1] = 0;
4267 sample->modenv_keyf[2] = 0;
4268 sample->modenv_keyf[3] = 0;
4269 sample->modenv_keyf[4] = 0;
4270 sample->modenv_keyf[5] = 0;
4271 sample->modenv_velf[0] = 0;
4272 sample->modenv_velf[1] = 0;
4273 sample->modenv_velf[2] = 0;
4274 sample->modenv_velf[3] = 0;
4275 sample->modenv_velf[4] = 0;
4276 sample->modenv_velf[5] = 0;
4277 sample->seq_length = 0;
4278 sample->seq_position = 0;
4279 sample->lorand = -1;
4280 sample->hirand = -1;
4281 sample->rt_decay = 0;
4285 static Preset_IS *is_preset = NULL;
4287 static Preset_IS *load_ini_file(char *ini_file, int type, int preset)
4290 Preset_IS *set = NULL;
4291 Preset_IS *newset = NULL;
4293 #if defined(IS_INI_LOAD_BLOCK)
4294 #if (IS_INI_LOAD_BLOCK == 32)
4295 uint32 block = preset >> 5; // 1block=64preset 32block
4296 #elif (IS_INI_LOAD_BLOCK == 64)
4297 uint32 block = preset >> 6; // 1block=64preset 16block
4298 #elif (IS_INI_LOAD_BLOCK == 128)
4299 uint32 block = preset >> 7; // 1block=128preset 8block
4301 uint32 bit = 1L << block; // < 32bit
4302 block = (block + 1) << 10; // 10bit > max(SCC_SETTING_MAX MMS_SETTING_MAX)
4305 for (set = is_preset; set; set = set->next){
4306 if (set->ini_file && !strcmp(set->ini_file, ini_file)){
4307 #if defined(IS_INI_LOAD_TYPE)
4308 if(type == IS_INI_TYPE_SCC && !set->scc_load)){
4309 load_int_synth_preset(ini_file, set, type, IS_INI_PRESET_ALL, IS_INI_PRESET_NONE);
4311 }else (type == IS_INI_TYPE_MMS && !set->mms_load){
4312 load_int_synth_preset(ini_file, set, type, IS_INI_PRESET_ALL, IS_INI_PRESET_NONE);
4315 #elif defined(IS_INI_LOAD_BLOCK) // block
\92P
\88Ê
\83\8d\81[
\83h
4316 if(type == IS_INI_TYPE_SCC && !(set->scc_load & bit)){
4317 load_int_synth_preset(ini_file, set, type, block, IS_INI_PRESET_NONE);
4318 set->scc_load |= bit;
4319 }else if(type == IS_INI_TYPE_MMS && !(set->mms_load & bit)){
4320 load_int_synth_preset(ini_file, set, type, block, IS_INI_PRESET_NONE);
4321 set->mms_load |= bit;
4323 #elif defined(IS_INI_LOAD_PRESET) // preset
\92P
\88Ê
\83\8d\81[
\83h
4324 load_int_synth_preset(ini_file, set, type, preset, IS_INI_PRESET_NONE);
4329 newset = (Preset_IS *)safe_malloc(sizeof(Preset_IS));
4330 memset(newset, 0, sizeof(Preset_IS));
4334 for (set = is_preset; set; set = set->next){
4341 newset->ini_file = safe_strdup(ini_file);
4342 #if defined(IS_INI_LOAD_ALL) //
\91S
\95\94\83\8d\81[
\83h
4343 load_int_synth_preset(ini_file, newset, IS_INI_TYPE_ALL, IS_INI_PRESET_ALL, IS_INI_PRESET_NONE); //
\91S
\95\94\83\8d\81[
\83h
4344 newset->scc_load = 1;
4345 newset->mms_load = 1;
4346 #elif defined(IS_INI_LOAD_TYPE) // type
\92P
\88Ê
\83\8d\81[
\83h
4347 load_int_synth_preset(ini_file, newset, type, IS_INI_PRESET_ALL, IS_INI_PRESET_NONE); // type
\92P
\88Ê
\83\8d\81[
\83h
4348 if(type == IS_INI_TYPE_SCC)
4349 newset->scc_load = 1;
4350 else if(type == IS_INI_TYPE_MMS)
4351 newset->mms_load = 1;
4352 #elif defined(IS_INI_LOAD_BLOCK) // block
\92P
\88Ê
\83\8d\81[
\83h
4353 load_int_synth_preset(ini_file, newset, type, block, IS_INI_PRESET_NONE); // preset
\92P
\88Ê
\83\8d\81[
\83h
4354 if(type == IS_INI_TYPE_SCC)
4355 newset->scc_load |= bit;
4356 else if(type == IS_INI_TYPE_MMS)
4357 newset->mms_load |= bit;
4358 #elif defined(IS_INI_LOAD_PRESET) // preset
\92P
\88Ê
\83\8d\81[
\83h
4359 load_int_synth_preset(ini_file, newset, type, preset, IS_INI_PRESET_NONE); // preset
\92P
\88Ê
\83\8d\81[
\83h
4364 Instrument *extract_scc_file(char *ini_file, int preset)
4368 Preset_IS *set = NULL;
4370 set = load_ini_file(ini_file, IS_INI_TYPE_SCC, preset);
4371 inst = (Instrument *)safe_malloc(sizeof(Instrument));
4372 memset(inst, 0, sizeof(Instrument));
4373 inst->instname = (char *)safe_malloc(256);
4374 if(!set->scc_setting[preset])
4375 snprintf(inst->instname, 256, "[SCC] %d: ----", preset);
4377 snprintf(inst->instname, 256, "[SCC] %d: %s", preset, (const char *)set->scc_setting[preset]->inst_name);
4378 inst->type = INST_SCC;
4380 inst->sample = (Sample *)safe_malloc(sizeof(Sample));
4381 memset(inst->sample, 0, sizeof(Sample));
4382 sample = inst->sample;
4383 init_sample_param(sample);
4384 sample->inst_type = INST_SCC;
4385 sample->sf_sample_index = preset;
4386 sample->data = (sample_t *)set;
4390 Instrument *extract_mms_file(char *ini_file, int preset)
4394 Preset_IS *set = NULL;
4397 set = load_ini_file(ini_file, IS_INI_TYPE_MMS, preset);
4398 inst = (Instrument *)safe_malloc(sizeof(Instrument));
4399 memset(inst, 0, sizeof(Instrument));
4400 inst->instname = (char *)safe_malloc(256);
4401 if(!set->mms_setting[preset])
4402 snprintf(inst->instname, 256, "[MMS] %d: ----", preset);
4404 snprintf(inst->instname, 256, "[MMS] %d: %s", preset, (const char *)set->mms_setting[preset]->inst_name);
4405 inst->type = INST_MMS;
4407 inst->sample = (Sample *)safe_malloc(sizeof(Sample));
4408 memset(inst->sample, 0, sizeof(Sample));
4409 sample = inst->sample;
4410 init_sample_param(sample);
4411 sample->inst_type = INST_MMS;
4412 sample->sf_sample_index = preset;
4413 sample->data = (sample_t *)set;
4417 void free_int_synth_file(Instrument *ip)
4419 safe_free(ip->instname);
4420 ip->instname = NULL;
4431 // mix 0.0~1.0 (mix=0.0 param1, mix=0.5 param1*0.5+param2*0.5, mix=1.0 param2
4432 static inline double mix_double(double mix, double param1, double param2)
4434 return param1 * (1.0 - mix) + param2 * mix;
4451 const char *osc_wave_name[] =
4463 FLOAT_T compute_osc_sine(FLOAT_T in, int32 var)
4465 return sin((FLOAT_T)M_PI2 * (in + 0.75));
4468 FLOAT_T compute_osc_triangular(FLOAT_T in, int32 var)
4471 return -1.0 + in * 4.0; // -1.0 + (in - 0.0) * 4.0;
4472 else // if(in < 1.0)
4473 return 1.0 - (in - 0.5) * 4.0;
4476 FLOAT_T compute_osc_saw1(FLOAT_T in, int32 var)
4479 return in * 2.0; // (in - 0.0) * 2.0;
4480 else // if(in < 1.0)
4481 return (in - 1.0) * 2.0;
4484 FLOAT_T compute_osc_saw2(FLOAT_T in, int32 var)
4487 return in * -2.0; // (in - 0.0) * -2.0;
4488 else // if(in < 1.0)
4489 return (in - 1.0) * -2.0;
4492 FLOAT_T compute_osc_square(FLOAT_T in, int32 var)
4496 else // if(in < 1.0)
4500 FLOAT_T compute_osc_noise(FLOAT_T in, int32 var)
4502 return (FLOAT_T)((int32)(rand() & 0x7FFFUL) - M_14BIT) * DIV_14BIT;
4505 FLOAT_T compute_osc_noise_lowbit(FLOAT_T in, int32 var)
4507 return lookup_noise_lowbit(in, var);
4510 FLOAT_T compute_osc_sine_table(FLOAT_T in, int32 var)
4512 return lookup2_sine(in + 0.75);
4515 FLOAT_T compute_osc_sine_table_linear(FLOAT_T in, int32 var)
4517 return lookup2_sine_linear(in + 0.75);
4520 compute_osc_t compute_osc[] = {
4523 compute_osc_triangular,
4528 compute_osc_noise_lowbit,
4529 compute_osc_sine_table,
4530 compute_osc_sine_table_linear,
4533 static int check_is_osc_wave_type(int tmpi, int limit)
4535 if(tmpi < 0 || tmpi > limit)
4542 switch(opt_int_synth_sine){
4547 return OSC_SINE_TABLE;
4549 return OSC_SINE_TABLE_LINEAR;
4562 FLOAT_T compute_osc_scc_none(FLOAT_T in, FLOAT_T *data)
4564 return data[((int)(in * 32)) & 0x1F]; // 0~31<32
4567 FLOAT_T compute_osc_scc_linear(FLOAT_T in, FLOAT_T *data)
4577 v2 = data[ofsi + 1];
4578 return v1 + (v2 - v1) * (in - fp);
4581 FLOAT_T compute_osc_scc_sine(FLOAT_T in, FLOAT_T *data)
4589 // fp = 0.5 + sin((in - ofsi - 0.5) * M_PI) * DIV_2;
4590 // fp = 0.5 + sine_table[(int32)((in - ofsi - 0.5) * M_12BIT) & table_size_mask] * DIV_2;
4591 fp = lookup2_sine_p((in - fp) * DIV_2);
4594 v2 = data[ofsi + 1];
4595 return v1 + (v2 - v1) * fp;
4603 rate :
\8aî
\8f\80\82É
\82È
\82é
\83T
\83\93\83v
\83\8b\83J
\83E
\83\93\83g
4604 pcm_rate :
\95Ï
\92²
\97p
\82Ì
\83T
\83\93\83v
\83\8b\83J
\83E
\83\93\83g
4605 pcm_rate = rate + mod_offset (compute_op_pm()
\82Å
\82Írt
\82É
\91\8a\93\96
4606 \95Ï
\92²
\82µ
\82È
\82¢
\8fê
\8d\87\82Í mod_offset = 0
\82È
\82Ì
\82Å pcm_rate = rate
\82ð
\83Z
\83b
\83g
4607 \82Â
\82¢
\82Å
\82Érate
\82Ì
\92l
\88æ
\83`
\83F
\83b
\83N
4611 static inline FLOAT_T compute_pcm_none(Info_OP *info)
4613 FLOAT_T *pcm_data = info->data_ptr;
4614 int32 index = (int32)info->pcm_rate;
4616 if(info->loop_length){ // loop
4617 if(info->rate >= info->ofs_end) // recompute base rate
4618 info->rate -= info->loop_length;
4619 if(index >= info->ofs_end)
4620 index -= info->loop_length;
4621 else if(index < info->ofs_start)
4622 index += info->loop_length;
4623 return pcm_data[index];
4625 if(index >= info->ofs_end){
4626 info->op_flag = 0; // pcm end
4629 return pcm_data[index];
4633 static inline FLOAT_T compute_pcm_linear(Info_OP *info)
4635 FLOAT_T *pcm_data = info->data_ptr;
4636 int32 index = (int32)info->pcm_rate;
4637 FLOAT_T fp = info->pcm_rate - index;
4640 if(info->loop_length){ // loop
4641 if(info->rate >= info->ofs_end) // recompute base rate
4642 info->rate -= info->loop_length;
4643 if(index >= info->ofs_end)
4644 index -= info->loop_length;
4645 else if(index < info->ofs_start)
4646 index += info->loop_length;
4647 v1 = pcm_data[index];
4648 if(++index < info->ofs_end)
4649 v2 = pcm_data[index];
4650 else // return loop_start
4651 v2 = pcm_data[info->ofs_start];
4653 if(index >= info->ofs_end){
4654 info->op_flag = 0; // pcm end
4657 v1 = pcm_data[index];
4658 if(++index < info->ofs_end)
4659 v2 = pcm_data[index]; // linear interpolation
4660 else // pcm end // v2 = 0;
4661 v2 = 0; // linear interpolation
4663 return v1 + (v2 - v1) * fp; // linear interpolation
4670 out mode0 = -1.0 ~ 1.0
4671 out mode1 = 0.0 ~ 1.0
4674 static void init_lfo(Info_LFO *info, FLOAT_T freq, FLOAT_T delay_ms, int type, FLOAT_T attack_ms, int mode)
4682 else if(freq > 100.0)
4683 freq = 40.0; // safe sr>22050,cnt<256
4684 info->freq = freq * div_is_sample_rate;
4687 info->delay = delay_ms * is_sample_rate_ms ;
4690 init_envelope3(&info->env, 0.0, attack_ms * is_sample_rate_ms);
4691 reset_envelope3(&info->env, 1.0, ENVELOPE_KEEP);
4692 info->osc_ptr = compute_osc[check_is_osc_wave_type(type, OSC_NOISE_LOWBIT)]; // check OSC_LIST
4693 info->mode = mode > 0 ? 1 : 0;
4699 static void compute_lfo(Info_LFO *info, int32 count)
4702 if(info->freq <= 0.0)
4704 if(info->delay > 0){
4705 info->delay -= count;
4708 info->rate += info->freq * count; // +1 = 1Hz
4709 if(info->rate >= 1.0){
4710 FLOAT_T ov = floor(info->rate);
4711 info->rate -= ov; // reset count
4712 info->cycle += (int32)ov;
4713 info->cycle &= 0xFFFF;
4715 compute_envelope3(&info->env, count);
4717 info->out = (info->osc_ptr(info->rate, info->cycle) + 1.0) * DIV_2 * info->env.vol; // 0.0~<1.0
4719 info->out = info->osc_ptr(info->rate, info->cycle) * info->env.vol; // -1.0~1.0
4731 static inline void op_filter(FilterCoefficients *fc, FLOAT_T *inout)
4733 DATA_T flt = *inout;
4734 sample_filter(fc, &flt);
4738 #define RESET_OP_RATE \
4743 if(info->update_width == 1) info->update_width = 2; \
4745 FLOAT_T ov = floor(info->rate); \
4748 info->cycle += (int32)ov; \
4749 info->cycle &= 0xFFFF; \
4750 if(info->update_width == 1) info->update_width = 2; \
4754 static inline FLOAT_T calc_op_width(Info_OP *info, FLOAT_T rate)
4756 if(info->update_width == 2){
4757 info->update_width = 0;
4758 info->wave_width1 = info->req_wave_width1;
4759 info->rate_width1 = info->req_rate_width1;
4760 info->rate_width2 = info->req_rate_width2;
4762 if(info->wave_width1 == 0.5)
4764 else if(rate < info->wave_width1)
4765 return rate * info->rate_width1;
4767 return 0.5 + (rate - info->wave_width1) * info->rate_width2;
4770 static inline void compute_op_output(Info_OP *info, FLOAT_T out)
4772 // ptr_connect = out , op->in , dummy
4773 #if (MMS_OP_CON_MAX == 4)
4774 *info->ptr_connect[0] += out;
4775 *info->ptr_connect[1] += out;
4776 *info->ptr_connect[2] += out;
4777 *info->ptr_connect[3] += out;
4780 for(j = 0; j < MMS_OP_CON_MAX; j++)
4781 *info->ptr_connect[j] += out;
4785 static inline void compute_op_sync(Info_OP *info)
4787 info->rate += info->freq; // +1/sr = 1Hz
4788 if(info->rate < 1.0)
4790 info->rate -= floor(info->rate); // reset count
4791 // ptr_connect = op->sync , dummy
4792 #if (MMS_OP_CON_MAX == 4)
4793 *info->ptr_connect[0] = 1.0;
4794 *info->ptr_connect[1] = 1.0;
4795 *info->ptr_connect[2] = 1.0;
4796 *info->ptr_connect[3] = 1.0;
4799 for(j = 0; j < MMS_OP_CON_MAX; j++)
4800 *info->ptr_connect[j] = 1.0;
4804 static inline void compute_op_clip(Info_OP *info)
4806 FLOAT_T in = info->in;
4808 info->in = 0.0; // clear
4809 if(in > info->efx_var1)
4810 in = info->efx_var1;
4811 else if(in < -info->efx_var1)
4812 in = -info->efx_var1;
4813 op_filter(&info->fc, &in);
4814 compute_op_output(info, in * info->amp_vol); // include info->op_level
4817 static inline void compute_op_lowbit(Info_OP *info)
4819 FLOAT_T in = info->in;
4822 info->in = 0.0; // clear
4823 tmp = in * info->efx_var1;
4824 in = (FLOAT_T)tmp * info->efx_var2;
4825 op_filter(&info->fc, &in);
4826 compute_op_output(info, in * info->amp_vol); // include info->op_level
4832 static inline void compute_op_null(Info_OP *info){}
4834 static inline void compute_op_wave_none(Info_OP *info)
4838 info->in = 0.0; // clear
4839 info->rate += info->freq; // +1/sr = 1Hz
4841 osc = info->osc_ptr(calc_op_width(info, info->rate), info->cycle);
4842 op_filter(&info->fc, &osc);
4843 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4846 static inline void compute_op_wave_fm(Info_OP *info)
4849 FLOAT_T in = info->in;
4851 info->in = 0.0; // clear
4852 info->rate += info->freq * (1.0 + (FLOAT_T)in * info->mod_level); // +1/sr = 1Hz;
4854 osc = info->osc_ptr(calc_op_width(info, info->rate), info->cycle);
4855 op_filter(&info->fc, &osc);
4856 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4859 static inline void compute_op_wave_am(Info_OP *info)
4862 FLOAT_T in = info->in;
4864 info->in = 0.0; // clear
4865 info->rate += info->freq; // +1/sr = 1Hz
4867 osc = info->osc_ptr(calc_op_width(info, info->rate), info->cycle);
4868 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
4869 op_filter(&info->fc, &osc);
4870 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4873 static inline void compute_op_wave_pm(Info_OP *info)
4876 FLOAT_T in = info->in; //
4878 info->in = 0.0; // clear
4879 info->rate += info->freq; // +1/sr = 1Hz
4881 rt = info->rate + ((FLOAT_T)in * info->mod_level); // mod level;
4883 osc = info->osc_ptr(calc_op_width(info, rt), info->cycle);
4884 op_filter(&info->fc, &osc);
4885 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4888 static inline void compute_op_wave_ampm(Info_OP *info)
4891 FLOAT_T in = info->in; //
4893 info->in = 0.0; // clear
4894 info->rate += info->freq; // +1/sr = 1Hz
4896 rt = info->rate + ((FLOAT_T)in * info->mod_level); // mod level;
4898 osc = info->osc_ptr(calc_op_width(info, rt), info->cycle);
4899 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
4900 op_filter(&info->fc, &osc);
4901 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4904 static inline void compute_op_wave_rm(Info_OP *info)
4907 FLOAT_T in = info->in;
4909 info->in = 0.0; // clear
4910 info->rate += info->freq; // +1/sr = 1Hz
4912 osc = info->osc_ptr(calc_op_width(info, info->rate), info->cycle);
4913 op_filter(&info->fc, &osc);
4914 osc *= 1.0 + (in - 1.0) * info->mod_level; // rm
4915 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4918 static inline void compute_op_wave_sync(Info_OP *info)
4920 compute_op_sync(info);
4923 static inline void compute_op_wave_clip(Info_OP *info)
4925 compute_op_clip(info);
4928 static inline void compute_op_wave_lowbit(Info_OP *info)
4930 compute_op_lowbit(info);
4933 static inline void compute_op_scc_none(Info_OP *info)
4937 info->in = 0.0; // clear
4938 info->rate += info->freq; // +1/sr = 1Hz
4940 osc = info->scc_ptr(calc_op_width(info, info->rate), info->data_ptr);
4941 op_filter(&info->fc, &osc);
4942 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4945 static inline void compute_op_scc_fm(Info_OP *info)
4948 FLOAT_T in = info->in;
4950 info->in = 0.0; // clear
4951 info->rate += info->freq * (1.0 + (FLOAT_T)in * info->mod_level); // +1/sr = 1Hz;
4953 osc = info->scc_ptr(calc_op_width(info, info->rate), info->data_ptr);
4954 op_filter(&info->fc, &osc);
4955 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4958 static inline void compute_op_scc_am(Info_OP *info)
4961 FLOAT_T in = info->in;
4963 info->in = 0.0; // clear
4964 info->rate += info->freq; // +1/sr = 1Hz
4966 osc = info->scc_ptr(calc_op_width(info, info->rate), info->data_ptr);
4967 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
4968 op_filter(&info->fc, &osc);
4969 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4972 static inline void compute_op_scc_pm(Info_OP *info)
4975 FLOAT_T in = info->in; //
4977 info->in = 0.0; // clear
4978 info->rate += info->freq; // +1/sr = 1Hz
4980 rt = info->rate + ((FLOAT_T)in * info->mod_level); // mod level;
4982 osc = info->scc_ptr(calc_op_width(info, rt), info->data_ptr);
4983 op_filter(&info->fc, &osc);
4984 compute_op_output(info, osc * info->amp_vol); // include info->op_level
4987 static inline void compute_op_scc_ampm(Info_OP *info)
4990 FLOAT_T in = info->in; //
4992 info->in = 0.0; // clear
4993 info->rate += info->freq; // +1/sr = 1Hz
4995 rt = info->rate + in * info->mod_level; // mod level;
4997 osc = info->scc_ptr(calc_op_width(info, rt), info->data_ptr);
4998 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
4999 op_filter(&info->fc, &osc);
5000 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5003 static inline void compute_op_scc_rm(Info_OP *info)
5006 FLOAT_T in = info->in;
5008 info->in = 0.0; // clear
5009 info->rate += info->freq; // +1/sr = 1Hz
5011 osc = info->scc_ptr(calc_op_width(info, info->rate), info->data_ptr);
5012 op_filter(&info->fc, &osc);
5013 osc *= 1.0 + (in - 1.0) * info->mod_level; // rm
5014 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5017 static inline void compute_op_scc_sync(Info_OP *info)
5019 compute_op_sync(info);
5022 static inline void compute_op_scc_clip(Info_OP *info)
5024 compute_op_clip(info);
5027 static inline void compute_op_scc_lowbit(Info_OP *info)
5029 compute_op_lowbit(info);
5032 static inline void compute_op_pcm_none(Info_OP *info)
5036 info->in = 0.0; // clear
5037 info->pcm_rate = info->rate += info->freq; // +1/sr*pcm_rate/root_freq = 1Hz
5038 osc = compute_pcm_linear(info);
5039 op_filter(&info->fc, &osc);
5040 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5043 static inline void compute_op_pcm_fm(Info_OP *info)
5046 FLOAT_T in = info->in; //
5048 info->in = 0.0; // clear
5049 info->pcm_rate = info->rate += info->freq * (1.0 + (FLOAT_T)in * info->mod_level); // +1/sr*pcm_rate/root_freq = 1Hz
5050 osc = compute_pcm_linear(info);
5051 op_filter(&info->fc, &osc);
5052 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5055 static inline void compute_op_pcm_am(Info_OP *info)
5058 FLOAT_T in = info->in; //
5060 info->in = 0.0; // clear
5061 info->pcm_rate = info->rate += info->freq; // +1/sr*pcm_rate/root_freq = 1Hz
5062 osc = compute_pcm_linear(info);
5063 op_filter(&info->fc, &osc);
5064 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5067 static inline void compute_op_pcm_pm(Info_OP *info)
5070 FLOAT_T in = info->in; //
5072 info->in = 0.0; // clear
5073 info->rate += info->freq; // +1/sr*pcm_rate/root_freq = 1Hz
5074 info->pcm_rate = info->rate + in * info->mod_level * info->pcm_cycle; // mod level;
5075 osc = compute_pcm_linear(info);
5076 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
5077 op_filter(&info->fc, &osc);
5078 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5081 static inline void compute_op_pcm_ampm(Info_OP *info)
5084 FLOAT_T in = info->in; //
5086 info->in = 0.0; // clear
5087 info->rate += info->freq; // +1/sr*pcm_rate/root_freq = 1Hz
5088 info->pcm_rate = info->rate + in * info->mod_level * info->pcm_cycle; // mod level;
5089 osc = compute_pcm_linear(info);
5090 osc *= (1.0 - ((FLOAT_T)in * DIV_2 + 0.5) * info->mod_level);
5091 op_filter(&info->fc, &osc);
5092 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5095 static inline void compute_op_pcm_rm(Info_OP *info)
5098 FLOAT_T in = info->in; //
5100 info->in = 0.0; // clear
5101 info->pcm_rate = info->rate += info->freq; // +1/sr*pcm_rate/root_freq = 1Hz
5102 osc = compute_pcm_linear(info);
5103 op_filter(&info->fc, &osc);
5104 osc *= 1.0 + (in - 1.0) * info->mod_level; // rm
5105 compute_op_output(info, osc * info->amp_vol); // include info->op_level
5108 static inline void compute_op_pcm_sync(Info_OP *info)
5110 compute_op_sync(info);
5113 static inline void compute_op_pcm_clip(Info_OP *info)
5115 compute_op_clip(info);
5118 static inline void compute_op_pcm_lowbit(Info_OP *info)
5120 compute_op_lowbit(info);
5124 compute_op_t compute_op[4][OP_LIST_MAX] = {
5127 compute_op_wave_none,
5131 compute_op_wave_ampm,
5133 compute_op_wave_sync,
5134 compute_op_wave_clip,
5135 compute_op_wave_lowbit,
5137 compute_op_scc_none,
5141 compute_op_scc_ampm,
5143 compute_op_scc_sync,
5144 compute_op_scc_clip,
5145 compute_op_scc_lowbit,
5147 compute_op_pcm_none,
5151 compute_op_pcm_ampm,
5153 compute_op_pcm_sync,
5154 compute_op_pcm_clip,
5155 compute_op_pcm_lowbit,
5157 compute_op_pcm_none,
5161 compute_op_pcm_ampm,
5163 compute_op_pcm_sync,
5164 compute_op_pcm_clip,
5165 compute_op_pcm_lowbit,
5172 #define COMP_OP_NUM (*com_ptr++)(inf_ptr++)
5174 static inline FLOAT_T compute_op_num0(InfoIS_MMS *info)
5179 static inline FLOAT_T compute_op_num1(InfoIS_MMS *info)
5182 info->op_ptr[0](&info->op[0]);
5186 static inline FLOAT_T compute_op_num2(InfoIS_MMS *info)
5188 compute_op_t *com_ptr = &info->op_ptr[0];
5189 Info_OP *inf_ptr = &info->op[0];
5192 COMP_OP_NUM; COMP_OP_NUM;
5196 static inline FLOAT_T compute_op_num3(InfoIS_MMS *info)
5198 compute_op_t *com_ptr = &info->op_ptr[0];
5199 Info_OP *inf_ptr = &info->op[0];
5202 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5206 static inline FLOAT_T compute_op_num4(InfoIS_MMS *info)
5208 compute_op_t *com_ptr = &info->op_ptr[0];
5209 Info_OP *inf_ptr = &info->op[0];
5212 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5216 static inline FLOAT_T compute_op_num5(InfoIS_MMS *info)
5218 compute_op_t *com_ptr = &info->op_ptr[0];
5219 Info_OP *inf_ptr = &info->op[0];
5222 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5226 static inline FLOAT_T compute_op_num6(InfoIS_MMS *info)
5228 compute_op_t *com_ptr = &info->op_ptr[0];
5229 Info_OP *inf_ptr = &info->op[0];
5232 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5236 static inline FLOAT_T compute_op_num7(InfoIS_MMS *info)
5238 compute_op_t *com_ptr = &info->op_ptr[0];
5239 Info_OP *inf_ptr = &info->op[0];
5242 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5246 static inline FLOAT_T compute_op_num8(InfoIS_MMS *info)
5248 compute_op_t *com_ptr = &info->op_ptr[0];
5249 Info_OP *inf_ptr = &info->op[0];
5252 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5256 static inline FLOAT_T compute_op_num9(InfoIS_MMS *info)
5258 compute_op_t *com_ptr = &info->op_ptr[0];
5259 Info_OP *inf_ptr = &info->op[0];
5262 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5267 static inline FLOAT_T compute_op_num10(InfoIS_MMS *info)
5269 compute_op_t *com_ptr = &info->op_ptr[0];
5270 Info_OP *inf_ptr = &info->op[0];
5273 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5274 COMP_OP_NUM; COMP_OP_NUM;
5278 static inline FLOAT_T compute_op_num11(InfoIS_MMS *info)
5280 compute_op_t *com_ptr = &info->op_ptr[0];
5281 Info_OP *inf_ptr = &info->op[0];
5284 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5285 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5289 static inline FLOAT_T compute_op_num12(InfoIS_MMS *info)
5291 compute_op_t *com_ptr = &info->op_ptr[0];
5292 Info_OP *inf_ptr = &info->op[0];
5295 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5296 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5300 static inline FLOAT_T compute_op_num13(InfoIS_MMS *info)
5302 compute_op_t *com_ptr = &info->op_ptr[0];
5303 Info_OP *inf_ptr = &info->op[0];
5306 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5307 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5311 static inline FLOAT_T compute_op_num14(InfoIS_MMS *info)
5313 compute_op_t *com_ptr = &info->op_ptr[0];
5314 Info_OP *inf_ptr = &info->op[0];
5317 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5318 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5322 static inline FLOAT_T compute_op_num15(InfoIS_MMS *info)
5324 compute_op_t *com_ptr = &info->op_ptr[0];
5325 Info_OP *inf_ptr = &info->op[0];
5328 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5329 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5333 static inline FLOAT_T compute_op_num16(InfoIS_MMS *info)
5335 compute_op_t *com_ptr = &info->op_ptr[0];
5336 Info_OP *inf_ptr = &info->op[0];
5339 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5340 COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM; COMP_OP_NUM;
5344 compute_op_num_t compute_op_num[] = {
5372 static void set_envelope_param_scc(Envelope0 *env, int32 *envp, int up, int down, FLOAT_T atk_delay)
5374 FLOAT_T ofs, cnt, tmpf;
5377 init_envelope0(env);
5379 env->rate[ENV0_END_STAGE] = (FLOAT_T)ENV0_OFFSET_MAX;
5380 env->offset[ENV0_END_STAGE] = 0;
5381 // ENV0_ATTACK_STAGE
5382 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[1] * DIV_100; // env level
5383 cnt = (FLOAT_T)envp[0] * is_sample_rate_ms; // env time
5384 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5385 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5386 else if(ofs < 1) {ofs = 1;}
5387 env->offset[ENV0_ATTACK_STAGE] = ofs;
5388 env->curve[ENV0_ATTACK_STAGE] = up;
5389 env->rate[ENV0_ATTACK_STAGE] = ofs / cnt;
5391 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[3] * DIV_100; // env level
5392 cnt = (FLOAT_T)envp[2] * is_sample_rate_ms; // env time
5393 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5394 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5395 else if(ofs < 0) {ofs = 0;}
5396 env->offset[ENV0_HOLD_STAGE] = ofs;
5397 ofs -= env->offset[ENV0_ATTACK_STAGE];
5398 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_HOLD_STAGE] = cnt;}
5399 env->curve[ENV0_HOLD_STAGE] = (ofs > 0.0) ? up : down;
5400 env->rate[ENV0_HOLD_STAGE] = fabs(ofs) / cnt;
5402 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[5] * DIV_100; // env level
5403 cnt = (FLOAT_T)envp[4] * is_sample_rate_ms; // env time
5404 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5405 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5406 else if(ofs < 0) {ofs = 0;}
5407 env->offset[ENV0_DECAY_STAGE] = ofs;
5408 ofs -= env->offset[ENV0_HOLD_STAGE];
5409 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_DECAY_STAGE] = cnt;}
5410 env->curve[ENV0_DECAY_STAGE] = (ofs > 0.0) ? up : down;
5411 env->rate[ENV0_DECAY_STAGE] = fabs(ofs) / cnt;
5412 // ENV0_SUSTAIN_STAGE
5413 env->offset[ENV0_SUSTAIN_STAGE] = 0; // env level
5414 ofs = env->offset[ENV0_HOLD_STAGE];
5415 cnt = (FLOAT_T)600000.0 * is_sample_rate_ms; // env time
5416 env->count[ENV0_SUSTAIN_STAGE] = cnt;
5417 env->curve[ENV0_SUSTAIN_STAGE] = down;
5418 env->rate[ENV0_SUSTAIN_STAGE] = ofs / cnt;
5419 env->follow[ENV0_SUSTAIN_STAGE] = 1.0;
5420 // ENV0_RELEASE1_STAGE
5421 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[7] * DIV_100; // env level
5422 cnt = (FLOAT_T)envp[6] * is_sample_rate_ms; // env time
5423 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5424 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5425 else if(ofs < 0) {ofs = 0;}
5426 env->offset[ENV0_RELEASE1_STAGE] = ofs;
5427 ofs = (FLOAT_T)ENV0_OFFSET_MAX; // release1
5428 env->curve[ENV0_RELEASE1_STAGE] = down;
5429 env->rate[ENV0_RELEASE1_STAGE] = fabs(ofs) / cnt;
5430 // ENV0_RELEASE2_STAGE
5431 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[9] * DIV_100; // env level
5432 cnt = (FLOAT_T)envp[8] * is_sample_rate_ms; // env time
5433 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5434 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5435 else if(ofs < 0) {ofs = 0;}
5436 env->offset[ENV0_RELEASE2_STAGE] = ofs;
5437 ofs -= env->offset[ENV0_RELEASE1_STAGE];
5438 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_RELEASE2_STAGE] = cnt;}
5439 env->curve[ENV0_RELEASE2_STAGE] = (ofs > 0.0) ? up : down;
5440 env->rate[ENV0_RELEASE2_STAGE] = fabs(ofs) / cnt;
5441 // ENV0_RELEASE3_STAGE
5442 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[11] * DIV_100; // env level
5443 cnt = (FLOAT_T)envp[10] * is_sample_rate_ms; // env time
5444 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5445 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5446 else if(ofs < 0) {ofs = 0;}
5447 env->offset[ENV0_RELEASE3_STAGE] = ofs;
5448 ofs -= env->offset[ENV0_RELEASE2_STAGE];
5449 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_RELEASE3_STAGE] = cnt;}
5450 env->curve[ENV0_RELEASE3_STAGE] = (ofs > 0.0) ? up : down;
5451 env->rate[ENV0_RELEASE3_STAGE] = fabs(ofs) / cnt;
5452 // ENV0_RELEASE4_STAGE
5453 env->offset[ENV0_RELEASE4_STAGE] = ofs = 0; // env level
5454 cnt = (FLOAT_T)10.0 * is_sample_rate_ms; // env time
5455 ofs -= env->offset[ENV0_RELEASE3_STAGE];
5456 if(ofs == 0.0) {ofs = -1.0;}
5457 env->curve[ENV0_RELEASE4_STAGE] = down;
5458 env->rate[ENV0_RELEASE4_STAGE] = fabs(ofs) / cnt;
5460 env->delay = (atk_delay + (FLOAT_T)envp[12]) * is_sample_rate_ms;
5461 env->offdelay = (atk_delay + (FLOAT_T)envp[13]) * is_sample_rate_ms;
5463 apply_envelope0_param(env);
5466 static inline void init_scc_preset_osc(InfoIS_SCC *info, int v)
5468 Preset_IS *is_set = info->is_set;
5469 Preset_SCC *set = info->set;
5474 tmpi = set->param[0]; // param0= output_level
5477 info->output_level = (FLOAT_T)tmpi * DIV_100;
5479 tmpi = set->osc[1]; // osc1= freq / mlt
5480 tmpf = set->osc[2]; // osc2=tune cent
5481 tmpf += (FLOAT_T)calc_random_param(-400, 400) * DIV_100; // auto detune
5482 switch(set->osc[0]){ // osc0= mode 0:OSC(%) 1:OSC(ppm) 2:OSC(mHz) 3:OSC(note)
5488 info->freq_mlt = (FLOAT_T)tmpi * DIV_100 * voice[v].sample->tune; // % to mlt
5489 info->freq_mlt *= POW2(tmpf * DIV_1200); // osc2=tune // cent to mlt
5490 info->freq = (FLOAT_T)voice[v].frequency * DIV_1000 * info->freq_mlt;
5496 info->freq_mlt = (FLOAT_T)tmpi * DIV_1000000 * voice[v].sample->tune; // ppm to mlt
5497 info->freq_mlt *= POW2(tmpf * DIV_1200); // osc2=tune // cent to mlt
5498 info->freq = (FLOAT_T)voice[v].frequency * DIV_1000 * info->freq_mlt;
5504 info->freq_mlt = (FLOAT_T)tmpi * DIV_1000 * voice[v].sample->tune; // mHz to Hz
5505 info->freq_mlt *= POW2(tmpf * DIV_1200); // osc2=tune // cent to mlt
5506 info->freq = info->freq_mlt;
5514 info->freq_mlt = (FLOAT_T)freq_table[tmpi] * DIV_1000 * voice[v].sample->tune; // note to Hz
5515 info->freq_mlt *= POW2(tmpf * DIV_1200); // osc2=tune // cent to mlt
5516 info->freq = info->freq_mlt;
5519 tmpi = set->osc[3]; // osc3= SCC_DATA
5520 if(scc_data_editor_override){ // IS_EDITOR
5521 info->data_ptr1 = scc_data_edit[0];
5522 }else if(tmpi < 0){ // noise
5523 info->data_ptr1 = NULL;
5525 if(tmpi >= SCC_DATA_MAX)
5527 info->data_ptr1 = is_set->scc_data[tmpi];
5529 tmpi = set->osc[4]; // osc4= time2
5530 if(tmpi < 1 || tmpi > 100000)
5532 info->data2_count = tmpi * is_sample_rate_ms;
5533 tmpi = set->osc[5]; // osc5= SCC_DATA2
5534 if(tmpi < 0){ // noise
5535 info->data_ptr2 = NULL;
5537 if(tmpi >= SCC_DATA_MAX)
5539 info->data_ptr2 = is_set->scc_data[tmpi];
5541 tmpi = set->osc[6]; // osc6= flag3
5542 tmpi = tmpi ? 1 : 0;
5543 info->data3_flag = tmpi;
5544 tmpi = set->osc[7]; // osc7= SCC_DATA3
5545 if(tmpi < 0){ // noise
5546 info->data_ptr3 = NULL;
5548 if(tmpi >= SCC_DATA_MAX)
5550 info->data_ptr3 = is_set->scc_data[tmpi];
5552 if(info->data2_count){
5553 info->data_ptr = info->data_ptr2;
5555 info->data_ptr = info->data_ptr1;
5560 tmpi = set->amp[0]; // amp0= lfo1 to amp
5565 info->lfo_amp = (FLOAT_T)tmpi * DIV_100;
5567 info->lfo_pitch = (FLOAT_T)set->pitch[0] * DIV_1200; // pitch0= lfo2 to freq cent
5568 info->env_pitch = (FLOAT_T)set->pitch[1] * DIV_1200; // pitch1= env to freq cent
5571 tmpf = (FLOAT_T)calc_random_param(0, 400) * DIV_100; // attack delay
5572 set_envelope_param_scc(&info->amp_env, set->ampenv, LINEAR_CURVE, DEF_VOL_CURVE, tmpf);
5574 set_envelope_param_scc(&info->pit_env, set->pitenv, LINEAR_CURVE, LINEAR_CURVE, tmpf);
5576 if(info->lfo_amp != 0.0)
5577 init_lfo(&info->lfo1, (FLOAT_T)set->lfo1[0] * DIV_100, set->lfo1[1], set->lfo1[2], set->lfo1[3], 1);
5579 if(info->lfo_pitch != 0.0)
5580 init_lfo(&info->lfo2, (FLOAT_T)set->lfo2[0] * DIV_100, set->lfo2[1], set->lfo2[2], set->lfo2[3], 0);
5582 tmpi = set->mode[0]; // release
5583 tmpi = tmpi ? 1 : 0;
5584 info->skip_flag = tmpi;
5585 tmpi = set->mode[1]; // loop ms
5586 if(tmpi <= 0 || tmpi > 100000) // 100000ms 100s
5588 info->loop_count = tmpi * is_sample_rate_ms;
5593 static inline void init_scc_preset(int v, InfoIS_SCC *info, Preset_IS *is_set, int preset)
5595 Preset_SCC *set = scc_editor_override ? &scc_setting_edit[0] : is_set->scc_setting[preset];
5605 info->is_set = is_set;
5607 init_scc_preset_osc(info, v);
5609 is_resample_init(&info->rs);
5611 info->thru_count = -1; // init
5615 static void noteoff_scc(InfoIS_SCC *info)
5617 if(!info->init) return;
5618 if(info->loop_count) return;
5619 if(info->skip_flag){
5620 info->skip_flag = -1;
5623 reset_envelope0_release(&info->amp_env, ENV0_KEEP);
5624 reset_envelope0_release(&info->pit_env, ENV0_KEEP);
5627 static void damper_scc(InfoIS_SCC *info, int8 damper)
5629 if(!info->init) return;
5630 if(info->loop_count) return;
5631 if(info->skip_flag) return;
5632 reset_envelope0_damper(&info->amp_env, damper);
5633 reset_envelope0_damper(&info->pit_env, damper);
5636 static void pre_compute_scc(InfoIS_SCC *info, int v, int32 count)
5638 Voice *vp = voice + v;
5639 FLOAT_T amp = 1.0, pitch = 0.0;
5640 int scount, thru_flg;
5642 if(info->scc_flag == 0 && !info->loop_count){ // scc off
5643 vp->finish_voice = 1;
5647 if(info->skip_flag == -1){
5648 init_scc_preset_osc(info, v);
5649 info->skip_flag = 0;
5650 }else if(info->skip_flag > 0){
5654 if(info->loop_count == -1){
5655 init_scc_preset_osc(info, v);
5656 }else if(info->loop_count > 0){
5657 info->loop_count -= count;
5658 if(info->loop_count <= 0)
5659 info->loop_count = -1; // reset flag
5662 if(info->data2_count){
5663 if(info->data2_count == -1){
5664 info->data_ptr = info->data_ptr1;
5665 info->data2_count = 0;
5667 info->data2_count -= count;
5668 if(info->data2_count <= 0)
5669 info->data2_count = -1;
5673 if(info->data3_flag){
5674 if(check_envelope0(&info->amp_env) >= ENV0_RELEASE1_STAGE){
5675 info->data_ptr = info->data_ptr3;
5676 info->data2_count = 0;
5677 info->data3_flag = 0;
5681 compute_envelope0(&info->amp_env, count);
5682 if(!check_envelope0(&info->amp_env)){ // amp_env end
5683 info->amp_vol = 0.0;
5684 if(!info->loop_count)
5685 info->scc_flag = 0; // scc off
5689 if(thru_count_mlt > 1){
5690 scount = count * thru_count_mlt;
5691 if((++info->thru_count) >= thru_count_mlt)
5692 info->thru_count = 0;
5693 thru_flg = info->thru_count;
5699 amp *= info->amp_env.volume;
5700 if(info->lfo_amp > 0.0){
5702 compute_lfo(&info->lfo1, scount);
5703 amp *= 1.0 - info->lfo1.out * info->lfo_amp;
5705 info->amp_vol = floor(amp * 15.0) * DIV_15; // 4bit amp
5706 info->amp_vol *= info->output_level;
5711 if(info->env_pitch != 0.0){
5712 compute_envelope0(&info->pit_env, scount);
5713 pitch += info->env_pitch * info->pit_env.volume;
5715 if(info->lfo_pitch != 0.0){
5716 compute_lfo(&info->lfo2, scount);
5717 pitch += info->lfo_pitch * info->lfo2.out;
5720 info->freq = (FLOAT_T)vp->frequency * DIV_1000 * info->freq_mlt;
5723 info->freq = (FLOAT_T)info->freq_mlt * vp->pitchfactor;
5725 info->freq = (FLOAT_T)info->freq_mlt;
5726 info->freq += channel[vp->channel].pitch_offset_fine;
5728 info->freq *= POW2(pitch) * div_is_sample_rate; // 1/sr = 1Hz
5731 static inline FLOAT_T compute_scc(InfoIS_SCC *info)
5735 info->rate += info->freq; // +1/sr = 1Hz
5737 info->rate -= floor(info->rate);
5738 return compute_osc_scc_none(info->rate, info->data_ptr) * info->amp_vol;
5740 FLOAT_T ov = floor(info->rate);
5742 info->cycle += (int32)ov;
5743 info->cycle &= 0xFFFF;
5744 return lookup_noise_lowbit(info->rate, info->cycle) * info->amp_vol;
5748 static inline void compute_voice_scc_switch(int v, int32 count, DATA_T *is_buf, IS_RS_DATA_T *rs_buf)
5750 Voice *vp = voice + v;
5751 InfoIS_SCC *info = vp->scc;
5755 memset(is_buf, 0, count * sizeof(DATA_T));
5756 }else if(!is_rs_mode){
5757 pre_compute_scc(info, v, count);
5758 for (i = 0; i < count; i++)
5759 #if defined(DATA_T_DOUBLE) || defined(DATA_T_FLOAT)
5760 is_buf[i] = (DATA_T)compute_scc(info);
5762 is_buf[i] = (DATA_T)(compute_scc(info) * is_output_level);
5765 IS_RS_DATA_T *rs_buf2 = rs_buf + is_rs_buff_offset;
5766 Info_Resample *rs = &info->rs;
5768 is_resample_pre(rs, rs_buf, count);
5769 pre_compute_scc(info, v, rs->rs_count);
5770 for (i = 0; i < rs->rs_count; i++)
5771 rs_buf2[i] = (IS_RS_DATA_T)compute_scc(info);
5772 is_resample_core(rs, is_buf, rs_buf, count);
5779 static void set_envelope_param_mms(Envelope0 *env, int32 *envp, int16 *velf, int16 *keyf, int up, int down, FLOAT_T sub_velo, FLOAT_T sub_note)
5783 init_envelope0(env);
5784 env->delay = envp[12] * is_sample_rate_ms;
5785 env->offdelay = envp[13] * is_sample_rate_ms;
5787 env->rate[ENV0_END_STAGE] = (FLOAT_T)ENV0_OFFSET_MAX;
5788 env->offset[ENV0_END_STAGE] = 0;
5789 // ENV0_ATTACK_STAGE
5790 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[1] * DIV_100
5791 * POW2(((FLOAT_T)sub_velo * velf[1] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[1] * DIV_1200)); // env level
5792 cnt = (FLOAT_T)envp[0] * is_sample_rate_ms
5793 * POW2(((FLOAT_T)sub_velo * velf[0] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[0] * DIV_1200)); // env time
5794 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5795 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5796 else if(ofs < 1) {ofs = 1;}
5797 env->offset[ENV0_ATTACK_STAGE] = ofs;
5798 env->curve[ENV0_ATTACK_STAGE] = up;
5799 env->rate[ENV0_ATTACK_STAGE] = ofs / cnt;
5801 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[3] * DIV_100
5802 * POW2(((FLOAT_T)sub_velo * velf[3] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[3] * DIV_1200)); // env level
5803 cnt = (FLOAT_T)envp[2] * is_sample_rate_ms
5804 * POW2(((FLOAT_T)sub_velo * velf[2] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[2] * DIV_1200)); // env time
5805 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5806 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5807 else if(ofs < 0) {ofs = 0;}
5808 env->offset[ENV0_HOLD_STAGE] = ofs;
5809 ofs -= env->offset[ENV0_ATTACK_STAGE];
5810 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_HOLD_STAGE] = cnt;}
5811 env->curve[ENV0_HOLD_STAGE] = (ofs > 0.0) ? up : down;
5812 env->rate[ENV0_HOLD_STAGE] = fabs(ofs) / cnt;
5814 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[5] * DIV_100
5815 * POW2(((FLOAT_T)sub_velo * velf[5] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[5] * DIV_1200)); // env level
5816 cnt = (FLOAT_T)envp[4] * is_sample_rate_ms
5817 * POW2(((FLOAT_T)sub_velo * velf[4] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[4] * DIV_1200)); // env time
5818 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5819 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5820 else if(ofs < 0) {ofs = 0;}
5821 env->offset[ENV0_DECAY_STAGE] = ofs;
5822 ofs -= env->offset[ENV0_HOLD_STAGE];
5823 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_DECAY_STAGE] = cnt;}
5824 env->curve[ENV0_DECAY_STAGE] = (ofs > 0.0) ? up : down;
5825 env->rate[ENV0_DECAY_STAGE] = fabs(ofs) / cnt;
5826 // ENV0_SUSTAIN_STAGE
5827 env->offset[ENV0_SUSTAIN_STAGE] = 0; // env level
5828 ofs = env->offset[ENV0_HOLD_STAGE];
5829 cnt = (FLOAT_T)600000.0 * is_sample_rate_ms; // env time
5830 env->count[ENV0_SUSTAIN_STAGE] = cnt;
5831 env->curve[ENV0_SUSTAIN_STAGE] = down;
5832 env->rate[ENV0_SUSTAIN_STAGE] = ofs / cnt;
5833 env->follow[ENV0_SUSTAIN_STAGE] = 1.0;
5834 // ENV0_RELEASE1_STAGE
5835 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[7] * DIV_100
5836 * POW2(((FLOAT_T)sub_velo * velf[7] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[7] * DIV_1200)); // env level
5837 cnt = (FLOAT_T)envp[6] * is_sample_rate_ms
5838 * POW2(((FLOAT_T)sub_velo * velf[6] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[6] * DIV_1200)); // env time
5839 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5840 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5841 else if(ofs < 0) {ofs = 0;}
5842 env->offset[ENV0_RELEASE1_STAGE] = ofs;
5843 ofs = (FLOAT_T)ENV0_OFFSET_MAX; // release1
5844 env->curve[ENV0_RELEASE1_STAGE] = down;
5845 env->rate[ENV0_RELEASE1_STAGE] = fabs(ofs) / cnt;
5846 // ENV0_RELEASE2_STAGE
5847 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[9] * DIV_100
5848 * POW2(((FLOAT_T)sub_velo * velf[9] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[9] * DIV_1200)); // env level
5849 cnt = (FLOAT_T)envp[8] * is_sample_rate_ms
5850 * POW2(((FLOAT_T)sub_velo * velf[8] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[8] * DIV_1200)); // env time
5851 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5852 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5853 else if(ofs < 0) {ofs = 0;}
5854 env->offset[ENV0_RELEASE2_STAGE] = ofs;
5855 ofs -= env->offset[ENV0_RELEASE1_STAGE];
5856 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_RELEASE2_STAGE] = cnt;}
5857 env->curve[ENV0_RELEASE2_STAGE] = (ofs > 0.0) ? up : down;
5858 env->rate[ENV0_RELEASE2_STAGE] = fabs(ofs) / cnt;
5859 // ENV0_RELEASE3_STAGE
5860 ofs = (FLOAT_T)ENV0_OFFSET_MAX * envp[11] * DIV_100
5861 * POW2(((FLOAT_T)sub_velo * velf[11] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[11] * DIV_1200)); // env level
5862 cnt = (FLOAT_T)envp[10] * is_sample_rate_ms
5863 * POW2(((FLOAT_T)sub_velo * velf[10] * DIV_127 * DIV_100) + ((FLOAT_T)sub_note * keyf[10] * DIV_1200)); // env time
5864 if(cnt == 0.0) {cnt = is_sample_rate_ms;}
5865 if(ofs > ENV0_OFFSET_MAX) {ofs = ENV0_OFFSET_MAX;}
5866 else if(ofs < 0) {ofs = 0;}
5867 env->offset[ENV0_RELEASE3_STAGE] = ofs;
5868 ofs -= env->offset[ENV0_RELEASE2_STAGE];
5869 if(ofs == 0.0) {ofs = -1.0; env->count[ENV0_RELEASE3_STAGE] = cnt;}
5870 env->curve[ENV0_RELEASE3_STAGE] = (ofs > 0.0) ? up : down;
5871 env->rate[ENV0_RELEASE3_STAGE] = fabs(ofs) / cnt;
5872 // ENV0_RELEASE4_STAGE
5873 env->offset[ENV0_RELEASE4_STAGE] = ofs = 0; // env level
5874 cnt = (FLOAT_T)10.0 * is_sample_rate_ms; // env time
5875 ofs -= env->offset[ENV0_RELEASE3_STAGE];
5876 if(ofs == 0.0) {ofs = -1.0;}
5877 env->curve[ENV0_RELEASE4_STAGE] = down;
5878 env->rate[ENV0_RELEASE4_STAGE] = fabs(ofs) / cnt;
5880 apply_envelope0_param(env);
5883 static inline void init_mms_preset_op(InfoIS_MMS *info, int v, int i)
5885 Preset_IS *is_set = info->is_set;
5886 Preset_MMS *set = info->set;
5887 double delay_cnt, attack_cnt, hold_cnt, decay_cnt, sustain_vol, sustain_cnt, release_cnt;
5888 int note = voice[v].note, velo = voice[v].velocity;
5889 FLOAT_T sub_note = note - 60, sub_velo = 127 - velo, div_velo = (FLOAT_T)velo * DIV_127;
5891 Info_OP *info2 = &info->op[i];
5894 tmpi = set->op_param[i][0]; // param0 = op mode 0:OSC 1:FM 2:AM 3:PM 4:AMPM 5:RM 6:SYNC (7:CLIP 8:LOWBIT
5895 if(tmpi < 0 || tmpi >= OP_LIST_MAX)
5897 info2->mod_type = tmpi;
5898 switch(info2->mod_type){
5900 tmpi = set->op_param[i][1]; // param1 = mod level %
5903 info2->mod_level = (FLOAT_T)tmpi * DIV_100;
5906 info2->mod_level = 1.0;
5907 tmpi = set->op_param[i][1]; // param1 = clip level %
5910 info2->efx_var1 = (FLOAT_T)tmpi * DIV_100;
5913 info2->mod_level = 1.0;
5914 tmpi = set->op_param[i][1]; // param1 = multiply
5917 info2->efx_var1 = (FLOAT_T)tmpi;
5918 info2->efx_var2 = 1.0 / info2->efx_var1;
5921 tmpi = set->op_param[i][2]; // param2 = op level %
5924 info2->op_level = (FLOAT_T)tmpi * DIV_100;
5926 if(note < set->op_range[i][0] // range0 = key low
5927 || note > set->op_range[i][1] // range1 = key hi
5928 || velo < set->op_range[i][2] // range2 = velo low
5929 || velo > set->op_range[i][3] // range3 = velo hi
5931 info2->op_flag = 0; // off
5933 info2->op_flag = 1; // on
5935 if(info2->mod_type == OP_SYNC){
5936 for(j = 0; j < MMS_OP_CON_MAX; j++){ // connect0 ~ connect3
5937 tmpi = set->op_connect[i][j]; // connect0 = -1:none(def) -2:output 0~7:op num
5938 if(tmpi >= 0 && tmpi <= info->op_max)
5939 info2->ptr_connect[j] = &info->op[tmpi].sync;
5941 info2->ptr_connect[j] = &info->dummy; // no connect
5944 for(j = 0; j < MMS_OP_CON_MAX; j++){ // connect0 ~ connect3
5945 tmpi = set->op_connect[i][j]; // connect0 = -1:none(def) -2:output 0~7:op num
5947 info2->ptr_connect[j] = &info->out; // output
5948 else if(tmpi <= -1 || tmpi >= info->op_max)
5949 info2->ptr_connect[j] = &info->dummy; // no connect
5951 info2->ptr_connect[j] = &info->op[tmpi].in;
5955 switch(set->op_osc[i][0]){ // osc0= mode 0:OSC(%) 0:OSC(ppm) 1:OSC(mHz) 2:OSC(note)
5959 tmpi = set->op_osc[i][1]; // osc1= freq / mlt
5962 info2->freq_mlt = (FLOAT_T)tmpi * DIV_100 * voice[v].sample->tune; // % to mlt
5963 info2->freq_mlt *= POW2((FLOAT_T)set->op_osc[i][2] * DIV_1200); // osc2=tune // cent to mlt
5964 info2->freq = (FLOAT_T)voice[v].frequency * DIV_1000 * info2->freq_mlt;
5968 tmpi = set->op_osc[i][1]; // osc1= freq / mlt
5971 info2->freq_mlt = (FLOAT_T)tmpi * DIV_1000000 * voice[v].sample->tune; // ppm to mlt
5972 info2->freq_mlt *= POW2((FLOAT_T)set->op_osc[i][2] * DIV_1200); // osc2=tune // cent to mlt
5973 info2->freq = (FLOAT_T)voice[v].frequency * DIV_1000 * info2->freq_mlt;
5977 tmpi = set->op_osc[i][1]; // osc1= freq / mlt
5980 info2->freq_mlt = (FLOAT_T)tmpi * DIV_1000 * voice[v].sample->tune; // mHz to Hz
5981 info2->freq_mlt *= POW2((FLOAT_T)set->op_osc[i][2] * DIV_1200); // osc2=tune // cent to mlt
5982 info2->freq = info2->freq_mlt;
5986 tmpi = set->op_osc[i][1]; // osc1= freq / mlt
5991 info2->freq_mlt = (FLOAT_T)freq_table[tmpi] * DIV_1000 * voice[v].sample->tune; // note to Hz
5992 info2->freq_mlt *= POW2((FLOAT_T)set->op_osc[i][2] * DIV_1200); // osc2=tune // cent to mlt
5993 info2->freq = info2->freq_mlt;
5997 switch(set->op_wave[i][0]){ // wave0 = osc type 0:wave 1:SCC 2:MT32 3:CM32
6000 info2->osc_type = 0;
6001 tmpi = set->op_wave[i][1]; // wave1 = wave type wave 0:sine ~
6002 info2->wave_type = check_is_osc_wave_type(tmpi, OSC_NOISE_LOWBIT);
6003 info2->osc_ptr = compute_osc[info2->wave_type];
6004 tmpi = set->op_wave[i][2]; // wave2 = osc width %
6009 info2->wave_width = (FLOAT_T)tmpi * DIV_200; // width=100% ratio=50:50=(width/2):(1-width/2)
6010 tmpi = set->op_wave[i][3]; // wave3 = phase offset % (start rate
6011 if(tmpi < 0 || tmpi > 99)
6013 info2->rate = (FLOAT_T)tmpi * DIV_100;
6014 info2->freq_coef = div_is_sample_rate; // +1/sr = 1Hz
6017 info2->osc_type = 1;
6018 tmpi = set->op_wave[i][1]; // wave1 = scc type , scc number 0~511
6019 if(tmpi < 0 || tmpi > SCC_DATA_MAX)
6021 info2->wave_type = tmpi;
6022 info2->data_ptr = is_set->scc_data[tmpi];
6023 if(scc_data_editor_override) // IS_EDITOR
6024 info2->data_ptr = scc_data_edit[0];
6025 tmpi = set->op_wave[i][2]; // wave2 = wave width %
6026 if(tmpi < 0 || tmpi > 200)
6028 info2->wave_width = (FLOAT_T)tmpi * DIV_200; // width=100% ratio=50:50=(width/2):(1-width/2)
6029 tmpi = set->op_wave[i][3]; // wave3 = phase offset % (start rate
6030 if(tmpi < 0 || tmpi > 99)
6032 info2->rate = (FLOAT_T)tmpi * DIV_100;
6033 info2->freq_coef = div_is_sample_rate; // +1/sr = 1Hz
6034 info2->scc_ptr = compute_osc_scc_linear;
6035 // info2->scc_ptr = compute_osc_scc_sine;
6036 if(!set->op_wave[i][4]) // wave4
\8ag
\92£
\83t
\83\89\83O
6038 switch(set->op_wave[i][5]){ // wave5 = interpoation
6041 info2->scc_ptr = compute_osc_scc_none;
6044 info2->scc_ptr = compute_osc_scc_linear;
6047 info2->scc_ptr = compute_osc_scc_sine;
6054 info2->osc_type = 2;
6055 tmpi = set->op_wave[i][1]; // wave1 = pcm type , pcm number 0~
6056 if(tmpi < 0 || tmpi >= MT32_DATA_MAX)
6058 pcm_inf = &mt32_pcm_inf[tmpi];
6059 info2->wave_type = tmpi;
6060 info2->data_ptr = mt32_pcm_data;
6062 info2->ofs_start = pcm_inf->loop_start;
6063 info2->ofs_end = pcm_inf->loop_end;
6064 info2->loop_length = pcm_inf->loop_length;
6066 info2->ofs_start = pcm_inf->ofs_start;
6067 info2->ofs_end = pcm_inf->ofs_end;
6068 info2->loop_length = 0;
6070 info2->pcm_cycle = pcm_inf->sample_rate * pcm_inf->div_root_freq; // PCM
\82Ì1
\8eü
\8aú
\95ª
\91\8a\93\96
6071 info2->freq_coef = div_is_sample_rate * info2->pcm_cycle; // +1/sr*pcm_rate/root_freq = 1Hz
6072 info2->rate = pcm_inf->ofs_start;
6078 info2->osc_type = 3;
6079 tmpi = set->op_wave[i][1]; // wave1 = pcm type , pcm number 0~
6080 if(tmpi < 0 || tmpi >= CM32L_DATA_MAX)
6082 pcm_inf = &cm32l_pcm_inf[tmpi];
6083 info2->wave_type = tmpi;
6084 info2->data_ptr = cm32l_pcm_data;
6086 info2->ofs_start = pcm_inf->loop_start;
6087 info2->ofs_end = pcm_inf->loop_end;
6088 info2->loop_length = pcm_inf->loop_length;
6090 info2->ofs_start = pcm_inf->ofs_start;
6091 info2->ofs_end = pcm_inf->ofs_end;
6092 info2->loop_length = 0;
6094 info2->pcm_cycle = pcm_inf->sample_rate * pcm_inf->div_root_freq; // PCM
\82Ì1
\8eü
\8aú
\95ª
\91\8a\93\96
6095 info2->freq_coef = div_is_sample_rate * info2->pcm_cycle; // +1/sr*pcm_rate/root_freq = 1Hz
6096 info2->rate = pcm_inf->ofs_start;
6101 tmpi = set->op_sub[i][0]; // sub0= velo to mod_level
6104 info2->mod_level *= mix_double(div_velo, tmpi * DIV_100, 1.0); // vel=127 modlv=100% , vel=0 modlv=tmpi%
6105 tmpi = set->op_sub[i][1]; // sub1= velo to op_level
6108 info2->op_level *= mix_double(div_velo, tmpi * DIV_100, 1.0); // vel=127 modlv=100% , vel=0 modlv=tmpi%
6109 tmpi = set->op_sub[i][2]; // sub2= key to mod_level
6110 info2->mod_level *= POW2((FLOAT_T)sub_note * tmpi * DIV_1200);
6111 tmpi = set->op_sub[i][3]; // sub3= key to op_level
6112 info2->op_level *= POW2((FLOAT_T)sub_note * tmpi * DIV_1200);
6114 tmpi = set->op_amp[i][0]; // amp0= lfo1 to amp
6119 info2->lfo_amp = (FLOAT_T)tmpi * DIV_100;
6120 info2->amp_vol = 0.0;
6122 info2->lfo_pitch = (FLOAT_T)set->op_pitch[i][0] * DIV_1200; // pitch0= lfo2 to freq
6123 info2->env_pitch = (FLOAT_T)set->op_pitch[i][1] * DIV_1200; // pitch1= pitenv to freq cent
6125 if(info2->osc_type <= MMS_OSC_SCC){
6126 tmpi = set->op_width[i][0]; // width0= lfo3 to wave_width %
6131 info2->lfo_width = (FLOAT_T)tmpi * DIV_200;
6132 tmpi = set->op_width[i][1]; // width1= widenv to wave_width %
6137 info2->env_width = (FLOAT_T)tmpi * DIV_200;
6138 tmpi = set->op_width[i][2]; // width2= vel to wave_width %
6143 info2->wave_width += div_velo * (FLOAT_T)tmpi * DIV_200;
6144 if(info2->wave_width >= 1.0){
6145 info2->wave_width = 1.0;
6146 info2->req_wave_width1 = info2->wave_width1 = 1.0;
6147 info2->req_rate_width1 = info2->rate_width1 = 0.5;
6148 info2->req_rate_width2 = info2->rate_width2 = 0.0;
6149 }else if(info2->wave_width <= 0.0){
6150 info2->wave_width = 0.0;
6151 info2->req_wave_width1 = info2->wave_width1 = 0.0;
6152 info2->req_rate_width1 = info2->rate_width1 = 0.0;
6153 info2->req_rate_width2 = info2->rate_width2 = 0.5;
6155 info2->req_wave_width1 = info2->wave_width1 = info2->wave_width;
6156 info2->req_rate_width1 = info2->rate_width1 = 0.5 / (info2->wave_width1);
6157 info2->req_rate_width2 = info2->rate_width2 = 0.5 / (1.0 - info2->wave_width1);
6160 info2->lfo_width = 0.0;
6161 info2->env_width = 0.0;
6162 info2->req_wave_width1 = info2->wave_width1 = 0.5;
6163 info2->req_rate_width1 = info2->rate_width1 = 1.0;
6164 info2->req_rate_width2 = info2->rate_width2 = 1.0;
6167 set_sample_filter_type(&info2->fc, set->op_filter[i][0]); // filter 0 = type
6169 info2->flt_freq = (FLOAT_T)set->op_filter[i][1]; // filter 1 = freq
6170 info2->flt_reso = (FLOAT_T)set->op_filter[i][2]; // filter 2 = reso
6172 info2->lfo_cutoff = (FLOAT_T)set->op_cutoff[i][0] * DIV_1200; // cutoff 0 = lfo4 to cutoff
6173 info2->env_cutoff = (FLOAT_T)set->op_cutoff[i][1] * DIV_1200; // cutoff 1 = env to cutoff
6174 info2->flt_freq *= POW2(((FLOAT_T)sub_velo * set->op_cutoff[i][2] * DIV_127 * DIV_100) // cutoff 2 = vel to cutoff
6175 + ((FLOAT_T)sub_note * set->op_cutoff[i][3] * DIV_1200)); // cutoff 3 = key to cutoff
6176 set_sample_filter_ext_rate(&info2->fc, is_sample_rate);
6177 set_sample_filter_freq(&info2->fc, info2->flt_freq);
6178 set_sample_filter_reso(&info2->fc, info2->flt_reso);
6179 }else{ // filter off
6180 info2->flt_freq = 0;
6181 info2->flt_reso = 0;
6182 info2->env_cutoff = 0.0;
6183 info2->lfo_cutoff = 0.0;
6186 if(info2->mod_type < OP_SYNC){
6187 info2->amp_env_flg = 1;
6188 set_envelope_param_mms(&info2->amp_env,
6189 set->op_ampenv[i], set->op_ampenv_velf[i], set->op_ampenv_keyf[i],
6190 LINEAR_CURVE, DEF_VOL_CURVE, sub_velo, sub_note);
6192 info2->amp_env_flg = 0;
6193 info2->amp_env.volume = 0.0;
6196 if(info2->env_pitch != 0.0){
6197 info2->pit_env_flg = 1;
6198 set_envelope_param_mms(&info2->pit_env,
6199 set->op_pitenv[i], set->op_pitenv_velf[i], set->op_pitenv_keyf[i],
6200 LINEAR_CURVE, LINEAR_CURVE, sub_velo, sub_note);
6202 info2->pit_env_flg = 0;
6203 info2->pit_env.volume = 0.0;
6206 if(info2->env_width != 0.0){
6207 info2->wid_env_flg = 1;
6208 set_envelope_param_mms(&info2->wid_env,
6209 set->op_widenv[i], set->op_widenv_velf[i], set->op_widenv_keyf[i],
6210 LINEAR_CURVE, LINEAR_CURVE, sub_velo, sub_note);
6212 info2->wid_env_flg = 0;
6213 info2->wid_env.volume = 0.0;
6216 if(info2->env_cutoff != 0.0){
6217 info2->mod_env_flg = 1;
6218 set_envelope_param_mms(&info2->mod_env,
6219 set->op_modenv[i], set->op_modenv_velf[i], set->op_modenv_keyf[i],
6220 SF2_CONVEX, SF2_CONCAVE, sub_velo, sub_note);
6222 info2->mod_env_flg = 0;
6223 info2->mod_env.volume = 0.0;
6226 if(info2->lfo_amp != 0.0){
6227 info2->lfo1_flg = 1;
6228 init_lfo(&info2->lfo1, (FLOAT_T)set->op_lfo1[i][0] * DIV_100, set->op_lfo1[i][1], set->op_lfo1[i][2], set->op_lfo1[i][3], 1);
6230 info2->lfo1_flg = 0;
6231 info2->lfo1.out = 0.0;
6234 if(info2->lfo_pitch != 0.0){
6235 info2->lfo2_flg = 1;
6236 init_lfo(&info2->lfo2, (FLOAT_T)set->op_lfo2[i][0] * DIV_100, set->op_lfo2[i][1], set->op_lfo2[i][2], set->op_lfo2[i][3], 0);
6238 info2->lfo2_flg = 0;
6239 info2->lfo2.out = 0.0;
6242 if(info2->lfo_width != 0.0){
6243 info2->lfo3_flg = 1;
6244 init_lfo(&info2->lfo3, (FLOAT_T)set->op_lfo3[i][0] * DIV_100, set->op_lfo3[i][1], set->op_lfo3[i][2], set->op_lfo3[i][3], 1);
6246 info2->lfo3_flg = 0;
6247 info2->lfo3.out = 0.0;
6250 if(info2->lfo_cutoff != 0.0){
6251 info2->lfo4_flg = 1;
6252 init_lfo(&info2->lfo4, (FLOAT_T)set->op_lfo4[i][0] * DIV_100, set->op_lfo4[i][1], set->op_lfo4[i][2], set->op_lfo4[i][3], 1);
6254 info2->lfo4_flg = 0;
6255 info2->lfo4.out = 0.0;
6258 tmpi = set->op_mode[i][0]; // release
6259 tmpi = tmpi ? 1 : 0;
6260 info2->skip_flag = tmpi;
6261 tmpi = set->op_mode[i][1]; // loop ms
6262 if(tmpi <= 0 || tmpi > 100000) // 100000ms 100s
6264 info2->loop_count = tmpi * is_sample_rate_ms;
6266 info2->in = info2->sync = 0.0;
6270 info->op_ptr[i] = compute_op[info2->osc_type][info2->mod_type];
6272 info->op_ptr[i] = compute_op_null;
6275 static inline void init_mms_preset(int v, InfoIS_MMS *info, Preset_IS *is_set, int preset)
6277 Preset_MMS *set = mms_editor_override ? &mms_setting_edit[0] : is_set->mms_setting[preset];
6286 info->is_set = is_set;
6288 tmpi = set->op_max; // op max
6289 if(tmpi < 1 || tmpi > MMS_OP_MAX)
6291 info->op_max = tmpi;
6293 for(i = 0; i < info->op_max; i++){
6294 init_mms_preset_op(info, v, i);
6296 if(info->op[i].skip_flag)
6297 info->op_ptr[i] = compute_op_null;
6300 is_resample_init(&info->rs);
6302 info->op_num_ptr = compute_op_num[info->op_max];
6304 info->thru_count = -1; // init
6308 static void noteoff_mms(InfoIS_MMS *info)
6312 if(!info->init) return;
6313 for(i = 0; i < info->op_max; i++){
6314 Info_OP *info2 = &info->op[i];
6316 if(info2->op_flag == 0) // op off
6318 if(info2->loop_count)
6320 if(info2->skip_flag){
6321 info2->skip_flag = -1;
6324 if(info2->amp_env_flg)
6325 reset_envelope0_release(&info2->amp_env, ENV0_KEEP);
6326 if(info2->pit_env_flg)
6327 reset_envelope0_release(&info2->pit_env, ENV0_KEEP);
6328 if(info2->wid_env_flg)
6329 reset_envelope0_release(&info2->wid_env, ENV0_KEEP);
6330 if(info2->mod_env_flg)
6331 reset_envelope0_release(&info2->mod_env, ENV0_KEEP);
6335 static void damper_mms(InfoIS_MMS *info, int8 damper)
6339 if(!info->init) return;
6340 for(i = 0; i < info->op_max; i++){
6341 Info_OP *info2 = &info->op[i];
6343 if(info2->op_flag == 0) // op off
6345 if(info2->loop_count)
6347 if(info2->skip_flag)
6350 if(info2->amp_env_flg)
6351 reset_envelope0_damper(&info2->amp_env, damper);
6352 if(info2->pit_env_flg)
6353 reset_envelope0_damper(&info2->pit_env, damper);
6354 if(info2->wid_env_flg)
6355 reset_envelope0_damper(&info2->wid_env, damper);
6356 if(info2->mod_env_flg)
6357 reset_envelope0_damper(&info2->mod_env, damper);
6362 static void pre_compute_mms(InfoIS_MMS *info, int v, int32 count)
6364 Voice *vp = voice + v;
6365 int i, scount, thru_flg, op_count = 0;
6368 if(thru_count_mlt > 1){
6369 scount = count * thru_count_mlt;
6370 if((++info->thru_count) >= thru_count_mlt)
6371 info->thru_count = 0;
6372 thru_flg = info->thru_count;
6377 for(i = 0; i < info->op_max; i++){
6378 Info_OP *info2 = &info->op[i];
6379 FLOAT_T amp = 1.0, pitch = 0.0, cutoff = 0.0, width = 0.0;
6381 if(info2->op_flag == 0) // op off
6384 if(info2->skip_flag == -1){
6385 init_mms_preset_op(info, v, i);
6386 info2->skip_flag = 0;
6387 }else if(info2->skip_flag > 0){
6392 if(info2->loop_count == -1){
6393 init_mms_preset_op(info, v, i);
6394 }else if(info2->loop_count > 0){
6396 info2->loop_count -= count;
6397 if(info2->loop_count <= 0)
6398 info2->loop_count = -1; // reset flag
6401 if(info2->amp_env_flg){
6402 if(!check_envelope0(&info2->amp_env)){ // amp_env end
6403 info2->amp_vol = 0.0;
6404 if(!info2->loop_count)
6405 info2->op_flag = 0; // operator turn off
6406 info->op_ptr[i] = compute_op_null;
6409 compute_envelope0(&info2->amp_env, count);
6410 amp *= info2->amp_env.volume;
6413 if(info2->lfo1_flg){
6415 compute_lfo(&info2->lfo1, scount);
6416 amp *= 1.0 - info2->lfo1.out * info2->lfo_amp;
6418 info2->amp_vol = info2->op_level * amp;
6424 if(info2->pit_env_flg){
6425 compute_envelope0(&info2->pit_env, scount);
6426 pitch += info2->env_pitch * info2->pit_env.volume;
6428 if(info2->lfo2_flg){
6429 compute_lfo(&info2->lfo2, scount);
6430 pitch += info2->lfo_pitch * info2->lfo2.out;
6433 info2->freq = (FLOAT_T)vp->frequency * DIV_1000 * info2->freq_mlt;
6436 info2->freq = info2->freq_mlt * vp->pitchfactor;
6438 info2->freq = info2->freq_mlt;
6439 info2->freq += channel[vp->channel].pitch_offset_fine;
6441 info2->freq *= POW2(pitch) * info2->freq_coef;
6444 if(info2->wid_env_flg){
6445 compute_envelope0(&info2->wid_env, scount);
6446 width += info2->env_width * info2->wid_env.volume;
6448 if(info2->lfo3_flg){
6449 compute_lfo(&info2->lfo3, scount);
6450 width += info2->lfo_width * info2->lfo3.out;
6453 width += info2->wave_width;
6454 if(info2->wave_width1 != width){
6455 info2->update_width = 1;
6457 info2->req_wave_width1 = 1.0;
6458 info2->req_rate_width1 = 0.5;
6459 info2->req_rate_width2 = 0.0;
6460 }else if(width <= 0.0) {
6461 info2->req_wave_width1 = 0.0;
6462 info2->req_rate_width1 = 0.0;
6463 info2->req_rate_width2 = 0.5;
6465 info2->req_wave_width1 = width;
6466 info2->req_rate_width1 = 0.5 / (width);
6467 info2->req_rate_width2 = 0.5 / (1.0 - width);
6473 if(info2->mod_env_flg){
6474 compute_envelope0(&info2->mod_env, scount);
6475 cutoff += info2->env_cutoff * info2->mod_env.volume;
6477 if(info2->lfo4_flg){
6478 compute_lfo(&info2->lfo4, scount);
6479 cutoff += info2->lfo_cutoff * (1.0 - info2->lfo4.out);
6482 set_sample_filter_freq(&info2->fc, info2->flt_freq * POW2(cutoff));
6483 recalc_filter(&info2->fc);
6486 if(!op_count) vp->finish_voice = 1;
6489 static inline void compute_voice_mms_switch(int v, int32 count, DATA_T *is_buf, IS_RS_DATA_T *rs_buf)
6491 Voice *vp = voice + v;
6492 InfoIS_MMS *info = vp->mms;
6496 memset(is_buf, 0, count * sizeof(DATA_T));
6497 }else if(!is_rs_mode){
6498 pre_compute_mms(info, v, count);
6499 for (i = 0; i < count; i++)
6500 #if defined(DATA_T_DOUBLE) || defined(DATA_T_FLOAT)
6501 is_buf[i] = (DATA_T)(info->op_num_ptr(info));
6503 is_buf[i] = (DATA_T)(info->op_num_ptr(info) * is_output_level);
6506 IS_RS_DATA_T *rs_buf2 = rs_buf + is_rs_buff_offset;
6507 Info_Resample *rs = &info->rs;
6509 is_resample_pre(rs, rs_buf, count);
6510 pre_compute_mms(info, v, rs->rs_count);
6511 for (i = 0; i < rs->rs_count; i++)
6512 rs_buf2[i] = (IS_RS_DATA_T)info->op_num_ptr(info);
6513 is_resample_core(rs, is_buf, rs_buf, count);
6519 /**************** interface function SCC MMS ****************/
6521 void init_int_synth_scc(int v)
6523 Voice *vp = voice + v;
6527 init_scc_preset(v, vp->scc, (Preset_IS *)vp->sample->data, vp->sample->sf_sample_index);
6530 void noteoff_int_synth_scc(int v)
6532 Voice *vp = voice + v;
6536 noteoff_scc(vp->scc);
6539 void damper_int_synth_scc(int v, int8 damper)
6541 Voice *vp = voice + v;
6545 damper_scc(vp->scc, damper);
6548 void compute_voice_scc(int v, DATA_T *ptr, int32 count)
6550 Voice *vp = voice + v;
6554 compute_voice_scc_switch(v, count, ptr, is_resample_buffer);
6557 void init_int_synth_mms(int v)
6559 Voice *vp = voice + v;
6563 init_mms_preset(v, vp->mms, (Preset_IS *)vp->sample->data, vp->sample->sf_sample_index);
6566 void noteoff_int_synth_mms(int v)
6568 Voice *vp = voice + v;
6572 noteoff_mms(vp->mms);
6575 void damper_int_synth_mms(int v, int8 damper)
6577 Voice *vp = voice + v;
6581 damper_mms(vp->mms, damper);
6584 void compute_voice_mms(int v, DATA_T *ptr, int32 count)
6586 Voice *vp = voice + v;
6590 compute_voice_mms_switch(v, count, ptr, is_resample_buffer);
6596 void free_int_synth_preset(void)
6599 Preset_IS *set = is_preset;
6602 Preset_IS *next = set->next;
6603 safe_free(set->ini_file);
6604 set->ini_file = NULL;
6605 set->scc_data_load = 0;
6606 for (i = 0; i < SCC_DATA_MAX; i++) {
6607 safe_free(set->scc_data_name[i]);
6608 set->scc_data_name[i] = NULL;
6610 for (i = 0; i < SCC_SETTING_MAX; i++) {
6611 if(!set->scc_setting[i])
6613 safe_free(set->scc_setting[i]->inst_name);
6614 set->scc_setting[i]->inst_name = NULL;
6615 safe_free(set->scc_setting[i]);
6616 set->scc_setting[i] = NULL;
6618 for (i = 0; i < MMS_SETTING_MAX; i++) {
6619 if(!set->mms_setting[i])
6621 safe_free(set->mms_setting[i]->inst_name);
6622 set->mms_setting[i]->inst_name = NULL;
6623 safe_free(set->mms_setting[i]);
6624 set->mms_setting[i] = NULL;
6632 void free_int_synth(void)
6634 free_int_synth_preset();
6635 free_is_editor_preset();
6636 la_pcm_data_load_flg = 0;
6639 void init_int_synth(void)
6642 init_int_synth_lite();
6648 #ifdef MULTI_THREAD_COMPUTE
6649 #include "thread_int_synth.c"