Lines Matching refs:chan
117 static void create_channel(channel_t * chan) in create_channel() argument
119 memset(chan, 0, sizeof(*chan)); in create_channel()
120 chan->freq2 = chan->freq = 440; in create_channel()
121 chan->p3 = chan->p2 = chan->p1 = -1; in create_channel()
126 static void set_default_parameters(channel_t * chan) in set_default_parameters() argument
128 switch (chan->type) { in set_default_parameters()
130 if (chan->p1 < 0) in set_default_parameters()
131 chan->p1 = 0.5; /* default to 50% duty cycle */ in set_default_parameters()
135 if (chan->p1 < 0) in set_default_parameters()
136 chan->p1 = 0.5; in set_default_parameters()
144 if (chan->p1 < 0) { in set_default_parameters()
145 chan->p1 = 0.1; in set_default_parameters()
146 chan->p2 = 0.5; in set_default_parameters()
147 chan->p3 = 0.6; in set_default_parameters()
148 } else if (chan->p2 < 0) { /* try a symmetric waveform */ in set_default_parameters()
149 if (chan->p1 <= 0.5) { in set_default_parameters()
150 chan->p2 = (1 - 2 * chan->p1) / 2; in set_default_parameters()
151 chan->p3 = chan->p2 + chan->p1; in set_default_parameters()
154 chan->p2 = chan->p1; in set_default_parameters()
155 chan->p3 = 1; in set_default_parameters()
157 } else if (chan->p3 < 0) in set_default_parameters()
158 chan->p3 = 1; /* simple falling slope to the end */ in set_default_parameters()
162 if (chan->p1 < 0) /* p1 is position of maximum */ in set_default_parameters()
163 chan->p1 = 0.5; in set_default_parameters()
164 if (chan->p2 < 0) /* p2 is amplitude */ in set_default_parameters()
165 chan->p2 = .5; in set_default_parameters()
169 if (chan->p1 < 0) in set_default_parameters()
170 chan->p1 = .4; in set_default_parameters()
171 if (chan->p2 < 0) in set_default_parameters()
172 chan->p2 = .2, chan->p3 = .9; in set_default_parameters()
190 chan->p = d_np / 100; /* adjust so abs(parameter) <= 1 */\
200 channel_t master, * chan = &master; in getopts() local
226 create_channel(chan); in getopts()
245 chan = &p->getopts_channels[p->getopts_nchannels++]; in getopts()
246 memcpy(chan, &master, sizeof(*chan)); in getopts()
247 chan->type = enum_p->value; in getopts()
254 chan->combine = enum_p->value; in getopts()
264 chan->freq2 = chan->freq = lsx_parse_frequency_k(argv[argn], &end_ptr, key); in getopts()
265 if (chan->freq < (chan->type == synth_pluck? 27.5 : 0) || in getopts()
266 (chan->type == synth_pluck && chan->freq > 4220)) { in getopts()
271 if (chan->type >= synth_noise) { in getopts()
275 chan->sweep = strchr(sweeps, *end_ptr) - sweeps; in getopts()
276 chan->freq2 = lsx_parse_frequency_k(end_ptr + 1, &end_ptr, key); in getopts()
277 if (chan->freq2 < 0) { in getopts()
290 if (chan->sweep >= Exp && chan->freq * chan->freq2 == 0) { in getopts()
341 channel_t * chan = &p->channels[i]; in start() local
342 *chan = p->getopts_channels[i % p->getopts_nchannels]; in start()
343 set_default_parameters(chan); in start()
344 if (chan->type == synth_pluck) { in start()
349 double const decay_f = min(912, 266 + 106 * log(chan->freq)); in start()
350 double d = sqr(dB_to_linear(decay_rate / chan->freq)); in start()
352 chan->c0 = d - sqrt(d * d - 1); in start()
353 chan->c1 = 1 - chan->c0; in start()
362 chan->c1 *= exp(-2e4/ (.05+chan->p1)/ chan->freq/ effp->in_signal.rate); in start()
365 chan->c2 = exp(-2 * M_PI * 10 / effp->in_signal.rate); in start()
366 chan->c3 = (1 + chan->c2) * .5; in start()
369 d = chan->c0 / (chan->c0 + chan->c1); in start()
370 chan->buffer_len = effp->in_signal.rate / chan->freq - d; in start()
371 frac = effp->in_signal.rate / chan->freq - d - chan->buffer_len; in start()
372 chan->c4 = (1 - frac) / (1 + frac); in start()
373 chan->pos = 0; in start()
376 chan->buffer = lsx_calloc(chan->buffer_len, sizeof(*chan->buffer)); in start()
377 for (k = 0, p2 = chan->p2; k < 2 && p2 >= 0; ++k, p2 = chan->p3) { in start()
380 for (j = 0; j < chan->buffer_len; ++j) { in start()
381 do d2 = d1 + (chan->phase? DRANQD1:dranqd1(r)) * colour; in start()
383 chan->buffer[j] += d2 * (1 - .3 * k); in start()
386 chan->buffer[j] = sin(2 * M_PI * j / chan->buffer_len); in start()
392 for (j = 0, min = max = 0; j < chan->buffer_len; ++j) { in start()
393 double d2, t = (double)j / chan->buffer_len; in start()
394 chan->lp_last_out = d2 = in start()
395 chan->buffer[j] * chan->c1 + chan->lp_last_out * chan->c0; in start()
397 chan->ap_last_out = in start()
398 d2 * chan->c4 + chan->ap_last_in - chan->ap_last_out * chan->c4; in start()
399 chan->ap_last_in = d2; in start()
401 chan->buffer[j] = chan->buffer[j] * (1 - t) + chan->ap_last_out * t; in start()
402 min = min(min, chan->buffer[j]); in start()
403 max = max(max, chan->buffer[j]); in start()
407 for (j = 0, d = 0; j < chan->buffer_len; ++j) { in start()
408 chan->buffer[j] = (2 * chan->buffer[j] - max - min) / (max - min); in start()
409 d += sqr(chan->buffer[j]); in start()
412 10 * log(d / chan->buffer_len), chan->c0, chan->c1, decay_f, in start()
413 log(chan->c0)/ -2 / M_PI * effp->in_signal.rate, in start()
414 chan->c2, chan->c3, chan->c4, frac); in start()
416 switch (chan->sweep) { in start()
417 case Linear: chan->mult = p->samples_to_do? in start()
418 (chan->freq2 - chan->freq) / p->samples_to_do / 2 : 0; in start()
420 case Square: chan->mult = p->samples_to_do? in start()
421 sqrt(fabs(chan->freq2 - chan->freq)) / p->samples_to_do / sqrt(3.) : 0; in start()
422 if (chan->freq > chan->freq2) in start()
423 chan->mult = -chan->mult; in start()
425 case Exp: chan->mult = p->samples_to_do? in start()
426 log(chan->freq2 / chan->freq) / p->samples_to_do * effp->in_signal.rate : 1; in start()
427 chan->freq /= chan->mult; in start()
429 case Exp_cycle: chan->mult = p->samples_to_do? in start()
430 (log(chan->freq2) - log(chan->freq)) / p->samples_to_do : 1; in start()
435 lsx_find_enum_value(chan->type, synth_type)->text, in start()
436 lsx_find_enum_value(chan->combine, combine_type)->text, in start()
437 p->samples_to_do, chan->freq, chan->freq2, in start()
438 chan->offset, chan->phase, chan->p1, chan->p2, chan->p3, chan->mult); in start()
460 channel_t * chan = &p->channels[c]; in flow() local
463 if (chan->type < synth_noise) { /* Need to calculate phase: */ in flow()
465 switch (chan->sweep) { in flow()
467 phase = (chan->freq + p->samples_done * chan->mult) * in flow()
471 phase = (chan->freq + sign(chan->mult) * in flow()
472 sqr(p->samples_done * chan->mult)) * elapsed_time_s; in flow()
475 phase = chan->freq * exp(chan->mult * elapsed_time_s); in flow()
478 double f = chan->freq * exp(p->samples_done * chan->mult); in flow()
479 double cycle_elapsed_time_s = elapsed_time_s - chan->cycle_start_time_s; in flow()
481 chan->cycle_start_time_s += 1 / f; in flow()
482 cycle_elapsed_time_s = elapsed_time_s - chan->cycle_start_time_s; in flow()
488 phase = fmod(phase + chan->phase, 1.0); in flow()
490 switch (chan->type) { in flow()
504 synth_out = -1 + 2 * (phase < chan->p1); in flow()
529 if (phase < chan->p1) in flow()
530 synth_out = -1 + 2 * phase / chan->p1; /* In rising part of period */ in flow()
532 synth_out = 1 - 2 * (phase - chan->p1) / (1 - chan->p1); /* In falling part */ in flow()
544 if (phase < chan->p1) /* In rising part of period */ in flow()
545 synth_out = -1 + 2 * phase / chan->p1; in flow()
546 else if (phase < chan->p2) /* In high part of period */ in flow()
548 else if (phase < chan->p3) /* In falling part */ in flow()
549 synth_out = 1 - 2 * (phase - chan->p2) / (chan->p3 - chan->p2); in flow()
563 synth_out = dB_to_linear(chan->p2 * -200); /* 0 .. 1 */ in flow()
564 if (phase < chan->p1) in flow()
565 synth_out = synth_out * exp(phase * log(1 / synth_out) / chan->p1); in flow()
567 synth_out = synth_out * exp((1 - phase) * log(1 / synth_out) / (1 - chan->p1)); in flow()
573 } else switch (chan->type) { in flow()
585 chan->c0 = .99886 * chan->c0 + d * (.0555179*_); in flow()
586 chan->c1 = .99332 * chan->c1 + d * (.0750759*_); in flow()
587 chan->c2 = .96900 * chan->c2 + d * (.1538520*_); in flow()
588 chan->c3 = .86650 * chan->c3 + d * (.3104856*_); in flow()
589 chan->c4 = .55000 * chan->c4 + d * (.5329522*_); in flow()
590 chan->c5 = -.7616 * chan->c5 - d * (.0168980*_); in flow()
591 synth_out = chan->c0 + chan->c1 + chan->c2 + chan->c3 in flow()
592 + chan->c4 + chan->c5 + chan->c6 + d * (.5362*_); in flow()
593 chan->c6 = d * (.115926*_); in flow()
599 do synth_out = chan->lp_last_out + DRANQD1 * (1. / 16); in flow()
601 chan->lp_last_out = synth_out; in flow()
605 double d = chan->buffer[chan->pos]; in flow()
607 chan->hp_last_out = in flow()
608 (d - chan->hp_last_in) * chan->c3 + chan->hp_last_out * chan->c2; in flow()
609 chan->hp_last_in = d; in flow()
611 synth_out = range_limit(chan->hp_last_out, -1, 1); in flow()
613 chan->lp_last_out = d = d * chan->c1 + chan->lp_last_out * chan->c0; in flow()
615 chan->ap_last_out = chan->buffer[chan->pos] = in flow()
616 (d - chan->ap_last_out) * chan->c4 + chan->ap_last_in; in flow()
617 chan->ap_last_in = d; in flow()
619 chan->pos = chan->pos + 1 == chan->buffer_len? 0 : chan->pos + 1; in flow()
627 synth_out = synth_out * (1 - fabs(chan->offset)) + chan->offset; in flow()
629 switch (chan->combine) { in flow()