MIDI-SoundFont
view release on metacpan or search on metacpan
doc/timidity/playmidi.c view on Meta::CPAN
break;
case ME_SYSEX_XG_MSB:
process_sysex_event(ME_SYSEX_XG_MSB,ch,current_event->a,current_event->b);
break;
case ME_NOTE_STEP:
i = ev->a + ((ev->b & 0x0f) << 8);
j = ev->b >> 4;
ctl_mode_event(CTLE_METRONOME, 1, i, j);
if (readmidi_wrd_mode)
wrdt->update_events();
break;
case ME_EOT:
return midi_play_end();
}
#ifndef SUPPRESS_CHANNEL_LAYER
}
}
ev->channel = orig_ch;
#endif
return RC_NONE;
}
static void set_single_note_tuning(int part, int a, int b, int rt)
{
static int tp; /* tuning program number */
static int kn; /* MIDI key number */
static int st; /* the nearest equal-tempered semitone */
double f, fst; /* fraction of semitone */
int i;
switch (part) {
case 0:
tp = a;
break;
case 1:
kn = a, st = b;
break;
case 2:
if (st == 0x7f && a == 0x7f && b == 0x7f) /* no change */
break;
f = 440 * pow(2.0, (st - 69) / 12.0);
fst = pow(2.0, (a << 7 | b) / 196608.0);
freq_table_tuning[tp][kn] = f * fst * 1000 + 0.5;
if (rt)
for (i = 0; i < upper_voices; i++)
if (voice[i].status != VOICE_FREE) {
voice[i].temper_instant = 1;
recompute_freq(i);
}
break;
}
}
static void set_user_temper_entry(int part, int a, int b)
{
static int tp; /* temperament program number */
static int ll; /* number of formula */
static int fh, fl; /* applying pitch bit mask (forward) */
static int bh, bl; /* applying pitch bit mask (backward) */
static int aa, bb; /* fraction (aa/bb) */
static int cc, dd; /* power (cc/dd)^(ee/ff) */
static int ee, ff;
static int ifmax, ibmax, count;
static double rf[11], rb[11];
int i, j, k, l, n, m;
double ratio[12], f, sc;
switch (part) {
case 0:
for (i = 0; i < 11; i++)
rf[i] = rb[i] = 1;
ifmax = ibmax = 0;
count = 0;
tp = a, ll = b;
break;
case 1:
fh = a, fl = b;
break;
case 2:
bh = a, bl = b;
break;
case 3:
aa = a, bb = b;
break;
case 4:
cc = a, dd = b;
break;
case 5:
ee = a, ff = b;
for (i = 0; i < 11; i++) {
if (((fh & 0xf) << 7 | fl) & 1 << i) {
rf[i] *= (double) aa / bb
* pow((double) cc / dd, (double) ee / ff);
if (ifmax < i + 1)
ifmax = i + 1;
}
if (((bh & 0xf) << 7 | bl) & 1 << i) {
rb[i] *= (double) aa / bb
* pow((double) cc / dd, (double) ee / ff);
if (ibmax < i + 1)
ibmax = i + 1;
}
}
if (++count < ll)
break;
ratio[0] = 1;
for (i = n = m = 0; i < ifmax; i++, m = n) {
n += (n > 4) ? -5 : 7;
ratio[n] = ratio[m] * rf[i];
if (ratio[n] > 2)
ratio[n] /= 2;
}
for (i = n = m = 0; i < ibmax; i++, m = n) {
n += (n > 6) ? -7 : 5;
ratio[n] = ratio[m] / rb[i];
if (ratio[n] < 1)
ratio[n] *= 2;
( run in 1.185 second using v1.01-cache-2.11-cpan-f56aa216473 )