📄 sndfont.c
字号:
(keynote < 0 || keynote == ip->pat.keynote)) break; } if(ip == NULL) { ip = (InstList*)SFMalloc(current_sfrec, sizeof(InstList)); memset(ip, 0, sizeof(InstList)); ip->pr_idx = pridx; ip->pat.bank = bank; ip->pat.preset = preset; ip->pat.keynote = keynote; ip->order = order; ip->samples = 0; ip->slist = NULL; ip->next = current_sfrec->instlist[addr]; current_sfrec->instlist[addr] = ip; } /* new sample */ sp = (SampleList *)SFMalloc(current_sfrec, sizeof(SampleList)); memset(sp, 0, sizeof(SampleList)); sp->bank = bank; sp->keynote = keynote; if(tbl->set[SF_keynum]) { sp->v.note_to_use = (int)tbl->val[SF_keynum]; } else if(bank == 128) { sp->v.note_to_use = keynote; } make_info(sf, sp, tbl); /* add a sample */ if(ip->slist == NULL) ip->slist = sp; else { SampleList *cur, *prev; int32 start; /* Insert sample */ start = sp->start; cur = ip->slist; prev = NULL; while(cur && cur->start <= start) { prev = cur; cur = cur->next; } if(prev == NULL) { sp->next = ip->slist; ip->slist = sp; } else { prev->next = sp; sp->next = cur; } } ip->samples++; } /* for(;;) */ if(done==0) return AWE_RET_SKIP; else return AWE_RET_OK;}/*---------------------------------------------------------------- * * Modified for TiMidity *//* conver to Sample parameter */static void make_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){ set_sample_info(sf, vp, tbl); set_init_info(sf, vp, tbl); set_rootkey(sf, vp, tbl); set_rootfreq(vp); /* tremolo & vibrato */#ifndef SF_SUPPRESS_TREMOLO convert_tremolo(vp, tbl);#endif /* SF_SUPPRESS_TREMOLO */#ifndef SF_SUPPRESS_VIBRATO convert_vibrato(vp, tbl);#endif /* SF_SUPPRESS_VIBRATO */}static void set_envelope_parameters(SampleList *vp){ /* convert envelope parameters */ vp->v.envelope_offset[0] = to_offset(65535); vp->v.envelope_rate[0] = vp->attack; vp->v.envelope_offset[1] = to_offset(65534); vp->v.envelope_rate[1] = vp->hold; vp->v.envelope_offset[2] = to_offset(vp->sustain); vp->v.envelope_rate[2] = vp->decay; vp->v.envelope_offset[3] = 0; vp->v.envelope_rate[3] = vp->release; vp->v.envelope_offset[4] = 0; vp->v.envelope_rate[4] = vp->release; vp->v.envelope_offset[5] = 0; vp->v.envelope_rate[5] = vp->release; /* convert modulation envelope parameters */ vp->v.modenv_offset[0] = to_offset(65535); vp->v.modenv_rate[0] = vp->modattack; vp->v.modenv_offset[1] = to_offset(65534); vp->v.modenv_rate[1] = vp->modhold; vp->v.modenv_offset[2] = to_offset(vp->modsustain); vp->v.modenv_rate[2] = vp->moddecay; vp->v.modenv_offset[3] = 0; vp->v.modenv_rate[3] = vp->modrelease; vp->v.modenv_offset[4] = 0; vp->v.modenv_rate[4] = vp->modrelease; vp->v.modenv_offset[5] = 0; vp->v.modenv_rate[5] = vp->modrelease;}/* set sample address */static void set_sample_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){ SFSampleInfo *sp = &sf->sample[tbl->val[SF_sampleId]]; /* set sample position */ vp->start = (tbl->val[SF_startAddrsHi] << 15) + tbl->val[SF_startAddrs] + sp->startsample; vp->len = (tbl->val[SF_endAddrsHi] << 15) + tbl->val[SF_endAddrs] + sp->endsample - vp->start; vp->start = abs(vp->start); vp->len = abs(vp->len); /* set loop position */ vp->v.loop_start = (tbl->val[SF_startloopAddrsHi] << 15) + tbl->val[SF_startloopAddrs] + sp->startloop - vp->start; vp->v.loop_end = (tbl->val[SF_endloopAddrsHi] << 15) + tbl->val[SF_endloopAddrs] + sp->endloop - vp->start; /* set data length */ vp->v.data_length = vp->len + 1; if (vp->v.loop_end > vp->len + 1) vp->v.loop_end = vp->len + 1; if (vp->v.loop_start > vp->len) vp->v.loop_start = vp->len; /* Sample rate */ if(sp->samplerate > 50000) {sp->samplerate = 50000;} else if(sp->samplerate < 400) {sp->samplerate = 400;} vp->v.sample_rate = sp->samplerate; /* sample mode */ vp->v.modes = MODES_16BIT; /* volume envelope & total volume */ vp->v.volume = calc_volume(tbl) * current_sfrec->amptune;#ifndef SF_SUPPRESS_ENVELOPE convert_volume_envelope(vp, tbl);#endif /* SF_SUPPRESS_ENVELOPE */ set_envelope_parameters(vp); if(tbl->val[SF_sampleFlags] == 1 || tbl->val[SF_sampleFlags] == 3) { /* looping */ vp->v.modes |= MODES_LOOPING | MODES_SUSTAIN; if(tbl->val[SF_sampleFlags] == 3) vp->v.data_length = vp->v.loop_end; /* strip the tail */ } else { /* set a small blank loop at the tail for avoiding abnormal loop. */ vp->v.loop_start = vp->len; vp->v.loop_end = vp->len + 1; } /* convert to fractional samples */ vp->v.data_length <<= FRACTION_BITS; vp->v.loop_start <<= FRACTION_BITS; vp->v.loop_end <<= FRACTION_BITS; /* point to the file position */ vp->start = vp->start * 2 + sf->samplepos; vp->len *= 2; vp->v.vel_to_fc = -2400; /* SF2 default value */ vp->v.key_to_fc = vp->v.vel_to_resonance = 0; vp->v.envelope_velf_bpo = vp->v.modenv_velf_bpo = vp->v.vel_to_fc_threshold = 64; vp->v.key_to_fc_bpo = 60; memset(vp->v.envelope_velf, 0, sizeof(vp->v.envelope_velf)); memset(vp->v.modenv_velf, 0, sizeof(vp->v.modenv_velf)); vp->v.inst_type = INST_SF2;}/*----------------------------------------------------------------*//* set global information */static void set_init_info(SFInfo *sf, SampleList *vp, LayerTable *tbl){ int val; SFSampleInfo *sample; sample = &sf->sample[tbl->val[SF_sampleId]]; /* key range */ if(tbl->set[SF_keyRange]) { vp->low = LOWNUM(tbl->val[SF_keyRange]); vp->high = HIGHNUM(tbl->val[SF_keyRange]); } else { vp->low = 0; vp->high = 127; } vp->v.low_freq = freq_table[(int)vp->low]; vp->v.high_freq = freq_table[(int)vp->high]; /* velocity range */ if(tbl->set[SF_velRange]) { vp->v.low_vel = LOWNUM(tbl->val[SF_velRange]); vp->v.high_vel = HIGHNUM(tbl->val[SF_velRange]); } else { vp->v.low_vel = 0; vp->v.high_vel = 127; } /* fixed key & velocity */ if(tbl->set[SF_keynum]) vp->v.note_to_use = (int)tbl->val[SF_keynum]; if(tbl->set[SF_velocity] && (int)tbl->val[SF_velocity] != 0) { ctl->cmsg(CMSG_INFO,VERB_DEBUG,"error: fixed-velocity is not supported."); } vp->v.sample_type = sample->sampletype; vp->v.sf_sample_index = tbl->val[SF_sampleId]; if (sample->sampletype == SF_SAMPLETYPE_MONO) { vp->v.sf_sample_link = -1; } else { vp->v.sf_sample_link = sample->samplelink; } /* panning position: 0 to 127 */ val = (int)tbl->val[SF_panEffectsSend]; if(sample->sampletype == SF_SAMPLETYPE_MONO || val != 0) { /* monoSample = 1 */ if(val < -500) vp->v.panning = 0; else if(val > 500) vp->v.panning = 127; else vp->v.panning = (int8)((val + 500) * 127 / 1000); } else if(sample->sampletype == SF_SAMPLETYPE_RIGHT) { /* rightSample = 2 */ vp->v.panning = 127; } else if(sample->sampletype == SF_SAMPLETYPE_LEFT) { /* leftSample = 4 */ vp->v.panning = 0; } else if(sample->sampletype == SF_SAMPLETYPE_LINKED) { /* linkedSample = 8 */ ctl->cmsg(CMSG_ERROR,VERB_NOISY,"error: linkedSample is not supported."); } memset(vp->v.envelope_keyf, 0, sizeof(vp->v.envelope_keyf)); memset(vp->v.modenv_keyf, 0, sizeof(vp->v.modenv_keyf)); if(tbl->set[SF_autoHoldEnv2]) { vp->v.envelope_keyf[1] = (int16)tbl->val[SF_autoHoldEnv2]; } if(tbl->set[SF_autoDecayEnv2]) { vp->v.envelope_keyf[2] = (int16)tbl->val[SF_autoDecayEnv2]; } if(tbl->set[SF_autoHoldEnv1]) { vp->v.modenv_keyf[1] = (int16)tbl->val[SF_autoHoldEnv1]; } if(tbl->set[SF_autoDecayEnv1]) { vp->v.modenv_keyf[2] = (int16)tbl->val[SF_autoDecayEnv1]; }#ifndef CFG_FOR_SF current_sfrec->def_cutoff_allowed = 1; current_sfrec->def_resonance_allowed = 1;#endif /* initial cutoff & resonance */ vp->cutoff_freq = 0; if((int)tbl->val[SF_initialFilterFc] < 0) tbl->set[SF_initialFilterFc] = tbl->val[SF_initialFilterFc] = 0; if(current_sfrec->def_cutoff_allowed && tbl->set[SF_initialFilterFc] && (int)tbl->val[SF_initialFilterFc] >= 1500 && (int)tbl->val[SF_initialFilterFc] <= 13500) { val = (int)tbl->val[SF_initialFilterFc]; val = abscent_to_Hz(val);#ifndef CFG_FOR_SF if(!opt_modulation_envelope) { if(tbl->set[SF_env1ToFilterFc] && (int)tbl->val[SF_env1ToFilterFc] > 0) { val *= pow(2.0,(double)tbl->val[SF_env1ToFilterFc] / 1200.0f); if(val > 20000) {val = 20000;} } }#endif vp->cutoff_freq = val; } vp->v.cutoff_freq = vp->cutoff_freq; vp->resonance = 0; if(current_sfrec->def_resonance_allowed && tbl->set[SF_initialFilterQ]) { val = (int)tbl->val[SF_initialFilterQ]; vp->resonance = val; } vp->v.resonance = vp->resonance;#if 0 /* Not supported */ /* exclusive class key */ vp->exclusiveClass = tbl->val[SF_keyExclusiveClass];#endif}static int abscent_to_Hz(int abscents){ return (int)(8.176 * pow(2.0, (double)abscents / 1200.0));}/*----------------------------------------------------------------*/#define SF_MODENV_CENT_MAX 1200 /* Live! allows only +-1200cents. *//* calculate root key & fine tune */static void set_rootkey(SFInfo *sf, SampleList *vp, LayerTable *tbl){ SFSampleInfo *sp = &sf->sample[tbl->val[SF_sampleId]]; int temp; /* scale factor */ vp->v.scale_factor = 1024 * (double) tbl->val[SF_scaleTuning] / 100 + 0.5; /* set initial root key & fine tune */ if (sf->version == 1 && tbl->set[SF_samplePitch]) { /* set from sample pitch */ vp->root = tbl->val[SF_samplePitch] / 100; vp->tune = -tbl->val[SF_samplePitch] % 100; if (vp->tune <= -50) vp->root++, vp->tune += 100; } else { /* from sample info */ vp->root = sp->originalPitch; vp->tune = (int8) sp->pitchCorrection; } /* orverride root key */ if (tbl->set[SF_rootKey]) vp->root = tbl->val[SF_rootKey]; else if (vp->bank == 128 && vp->v.scale_factor != 0) vp->tune += (vp->keynote - sp->originalPitch) * 100 * (double) vp->v.scale_factor / 1024; vp->tune += tbl->val[SF_coarseTune] * 100 + tbl->val[SF_fineTune]; /* correct too high pitch */ if (vp->root >= vp->high + 60) vp->root -= 60; vp->v.tremolo_to_pitch = (tbl->set[SF_lfo1ToPitch]) ? tbl->val[SF_lfo1ToPitch] : 0; vp->v.tremolo_to_fc = (tbl->set[SF_lfo1ToFilterFc]) ? tbl->val[SF_lfo1ToFilterFc] : 0; vp->v.modenv_to_pitch = (tbl->set[SF_env1ToPitch]) ? tbl->val[SF_env1ToPitch] : 0; /* correct tune with the sustain level of modulation envelope */ temp = vp->v.modenv_to_pitch * (double) (1000 - tbl->val[SF_sustainEnv1]) / 1000 + 0.5; vp->tune += temp, vp->v.modenv_to_pitch -= temp; vp->v.modenv_to_fc = (tbl->set[SF_env1ToFilterFc]) ? tbl->val[SF_env1ToFilterFc] : 0;}static void set_rootfreq(SampleList *vp){ int root = vp->root; int tune = 0.5 - 256 * (double) vp->tune / 100; /* 0 <= tune < 255 */ while (tune < 0) root--, tune += 256; while (tune > 255) root++, tune -= 256; if (root < 0) { vp->v.root_freq = freq_table[0] * (double) bend_fine[tune] / bend_coarse[-root] + 0.5; vp->v.scale_freq = 0; /* scale freq */ } else if (root > 127) { vp->v.root_freq = freq_table[127] * (double) bend_fine[tune] * bend_coarse[root - 127] + 0.5; vp->v.scale_freq = 127; /* scale freq */ } else { vp->v.root_freq = freq_table[root] * (double) bend_fine[tune] + 0.5; vp->v.scale_freq = root; /* scale freq */ }}/*----------------------------------------------------------------*//*Pseudo Reverb*/extern int32 modify_release;/* volume envelope parameters */static void convert_volume_envelope(SampleList *vp, LayerTable *tbl){ vp->attack = to_rate(65535, tbl->val[SF_attackEnv2]); vp->hold = to_rate(1, tbl->val[SF_holdEnv2]); vp->sustain = calc_sustain(tbl->val[SF_sustainEnv2]); vp->decay = to_rate(65533 - vp->sustain, tbl->val[SF_decayEnv2]); if(modify_release) /* Pseudo Reverb */ vp->release = calc_rate(65535, modify_release); else vp->release = to_rate(65535, tbl->val[SF_releaseEnv2]); vp->v.envelope_delay = play_mode->rate * to_msec(tbl->val[SF_delayEnv2]) * 0.001; /* convert modulation envelope */ vp->modattack = to_rate(65535, tbl->val[SF_attackEnv1]); vp->modhold = to_rate(1, tbl->val[SF_holdEnv1]); vp->modsustain = calc_sustain(tbl->val[SF_sustainEnv1]); vp->moddecay = to_rate(65533 - vp->modsustain, tbl->val[SF_decayEnv1]); if(modify_release) /* Pseudo Reverb */ vp->modrelease = calc_rate(65535, modify_release); else vp->modrelease = to_rate(65535, tbl->val[SF_releaseEnv1]); vp->v.modenv_delay = play_mode->rate * to_msec(tbl->val[SF_delayEnv1]) * 0.001; vp->v.modes |= MODES_ENVELOPE;}#ifndef SF_SUPPRESS_TREMOLO/*---------------------------------------------------------------- * tremolo (LFO1) conversion *----------------------------------------------------------------*/static void convert_tremolo(SampleList *vp, LayerTable *tbl){ int32 freq; double level; if(!tbl->set[SF_lfo1ToVolume]) return; level = pow(10.0, (double)abs(tbl->val[SF_lfo1ToVolume]) / -200.0); vp->v.tremolo_depth = 256 * (1.0 - level); if((int)tbl->val[SF_lfo1ToVolume] < 0) {vp->v.tremolo_depth = -vp->v.tremolo_depth;} /* frequency in mHz */ if(!tbl->set[SF_freqLfo1]) freq = 0; else { freq = (int)tbl->val[SF_freqLfo1]; freq = TO_MHZ(freq); } /* convert mHz to sine table increment; 1024<<rate_shift=1wave */ vp->v.tremolo_phase_increment = ((play_mode->rate / 1000 * freq) >> RATE_SHIFT) / control_ratio; vp->v.tremolo_delay = play_mode->rate * to_msec(tbl->val[SF_delayLfo1]) * 0.001;}#endif#ifndef SF_SUPPRESS_VIBRATO/*---------------------------------------------------------------- * vibrato (LFO2) conversion *----------------------------------------------------------------*/static void convert_vibrato(SampleList *vp, LayerTable *tbl){ int32 shift, freq; if(!tbl->set[SF_lfo2ToPitch]) { vp->v.vibrato_control_ratio = 0; return; } shift = (int)tbl->val[SF_lfo2ToPitch]; /* cents to linear; 400cents = 256 */ shift = shift * 256 / 400; if(shift > 255) {shift = 255;} else if(shift < -255) {shift = -255;} vp->v.vibrato_depth = (int16)shift; /* frequency in mHz */ if(!tbl->set[SF_freqLfo2]) freq = 0; else { freq = (int)tbl->val[SF_freqLfo2]; freq = TO_MHZ(freq); if(freq == 0) {freq = 1;} /* convert mHz to control ratio */ vp->v.vibrato_control_ratio = (1000 * play_mode->rate) / (freq * 2 * VIBRATO_SAMPLE_INCREMENTS); } vp->v.vibrato_delay = play_mode->rate * to_msec(tbl->val[SF_delayLfo2]) * 0.001;}#endif#ifdef CFG_FOR_SF/********************************************************************* cfg for soundfont utility. demanded sources. common.c controls.c dumb_c.c instrum.c sbkconv.c sffile.c sfitem.c sndfont.c tables.c version.c mt19937ar.c quantity.c smplfile.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -