diff options
Diffstat (limited to 'fmdriver')
-rw-r--r-- | fmdriver/fmdriver.h | 8 | ||||
-rw-r--r-- | fmdriver/fmdriver_common.h | 4 | ||||
-rw-r--r-- | fmdriver/fmdriver_fmp.c | 40 |
3 files changed, 41 insertions, 11 deletions
diff --git a/fmdriver/fmdriver.h b/fmdriver/fmdriver.h index 63d27c0..e858567 100644 --- a/fmdriver/fmdriver.h +++ b/fmdriver/fmdriver.h @@ -34,6 +34,11 @@ struct fmdriver_track_status { uint8_t key; // key after pitchbend, LFO, etc. applied uint8_t actual_key; + uint8_t tonenum; + uint8_t volume; + uint8_t gate; + int8_t detune; + char status[9]; }; struct fmdriver_work { @@ -56,7 +61,8 @@ struct fmdriver_work { // CP932 encoded //const char *title; char comment[3][FMDRIVER_TITLE_BUFLEN]; - // driver status + // driver status (for display) + uint8_t ssg_noise_freq; struct fmdriver_track_status track_status[FMDRIVER_TRACK_NUM]; // fm3ex part map }; diff --git a/fmdriver/fmdriver_common.h b/fmdriver/fmdriver_common.h index 23600cb..706dc95 100644 --- a/fmdriver/fmdriver_common.h +++ b/fmdriver/fmdriver_common.h @@ -5,12 +5,12 @@ static inline uint16_t read16le(const uint8_t *ptr) { return (unsigned)ptr[0] | (((unsigned)ptr[1])<<8); } -static inline int16_t u8s16(uint8_t v) { +static inline int8_t u8s8(uint8_t v) { return (v & 0x80) ? ((int16_t)v)-0x100 : v; } static inline int16_t u16s16(uint16_t v) { - return (v & 0x8000) ? ((int32_t)v)-0x10000 : v; + return (v & 0x8000u) ? ((int32_t)v)-0x10000l : v; } #if 0 diff --git a/fmdriver/fmdriver_fmp.c b/fmdriver/fmdriver_fmp.c index 33ab925..8f3c948 100644 --- a/fmdriver/fmdriver_fmp.c +++ b/fmdriver/fmdriver_fmp.c @@ -252,7 +252,7 @@ static uint16_t fmp_adpcm_freq(uint8_t note) { }
static uint8_t fmp_pdzf_vol_clamp(uint8_t v, uint8_t ev) {
- int16_t ret = v + u8s16(ev);
+ int16_t ret = v + u8s8(ev);
if (ret < 0) ret = 0;
if (ret > 0xf) ret = 0xf;
return ret;
@@ -993,10 +993,10 @@ static bool fmp_cmd75_lfo(struct fmdriver_work *work, // 22f1
fmp->timer_ch3 |= 0x40;
if (val & 0x20) {
- fmp->ch3_se_freqdiff[0] = u8s16(fmp_part_cmdload(fmp, part));
- fmp->ch3_se_freqdiff[1] = u8s16(fmp_part_cmdload(fmp, part));
- fmp->ch3_se_freqdiff[2] = u8s16(fmp_part_cmdload(fmp, part));
- fmp->ch3_se_freqdiff[3] = u8s16(fmp_part_cmdload(fmp, part));
+ fmp->ch3_se_freqdiff[0] = u8s8(fmp_part_cmdload(fmp, part));
+ fmp->ch3_se_freqdiff[1] = u8s8(fmp_part_cmdload(fmp, part));
+ fmp->ch3_se_freqdiff[2] = u8s8(fmp_part_cmdload(fmp, part));
+ fmp->ch3_se_freqdiff[3] = u8s8(fmp_part_cmdload(fmp, part));
}
} else {
// 22e9
@@ -1094,7 +1094,7 @@ static bool fmp_cmd78_lfo_r(struct fmdriver_work *work, part->pdzf.pan = upan - 5;
}
} else {
- int8_t pan = u8s16(lfo->rate);
+ int8_t pan = u8s8(lfo->rate);
if (pan < -4) pan = -4;
if (pan > 4) pan = 4;
part->pdzf.pan = pan;
@@ -1306,7 +1306,7 @@ static bool fmp_cmd7c_lfo_pan_fm(struct fmdriver_work *work, struct pdzf_rhythm *pr = &fmp->pdzf.rhythm[pdzf_i-1];
pr->voice[0] = part->u.fm.wlfo.delay;
pr->voice[1] = part->u.fm.wlfo.speed;
- int16_t panpot = u8s16(part->u.fm.wlfo.rate);
+ int16_t panpot = u8s8(part->u.fm.wlfo.rate);
if (panpot < -4) panpot = -4;
if (panpot > 4) panpot = 4;
pr->pan = panpot;
@@ -1419,7 +1419,7 @@ static bool fmp_cmd7e_loop_det(struct fmdriver_work *work, } else {
// detune relative
// DX
- int16_t det = u8s16(fmp_part_cmdload(fmp, part));
+ int16_t det = u8s8(fmp_part_cmdload(fmp, part));
part->detune += det;
}
return true;
@@ -1826,6 +1826,10 @@ static void fmp_part_init_lfo_awe(struct fmdriver_work *work, // 3073
part->u.fm.alfo.delay_cnt = part->u.fm.alfo.delay;
part->u.fm.alfo.depth_cnt = part->u.fm.alfo.depth;
+ // this line not found in fmp but should be there somewhere
+ // without this, when LFO E, delay would be random every keyon
+ part->u.fm.alfo.speed_cnt = part->u.fm.alfo.speed;
+
part->u.fm.alfo.rate = part->u.fm.alfo.rate_orig;
if (part->u.fm.hlfo_freq & 0x80) {
work->opna_writereg(work, 0x22, 0x00);
@@ -2760,6 +2764,7 @@ static void fmp_work_status_init(struct fmdriver_work *work, static void fmp_work_status_update(struct fmdriver_work *work,
const struct driver_fmp *fmp) {
+ work->ssg_noise_freq = fmp->ssg_noise_freq;
static const uint8_t fmp_track_map[FMDRIVER_TRACK_NUM] = {
FMP_PART_FM_1,
FMP_PART_FM_2,
@@ -2781,13 +2786,21 @@ static void fmp_work_status_update(struct fmdriver_work *work, track->info = FMDRIVER_TRACK_INFO_NORMAL;
if (part->type.adpcm) {
track->actual_key = 0xff;
+ track->volume = part->actual_vol;
} else if (part->type.ssg) {
if (part->u.ssg.env_f.ppz || part->pdzf.mode) {
track->info = FMDRIVER_TRACK_INFO_PPZ8;
track->actual_key = 0xff;
} else {
track->actual_key = part->status.rest ? 0xff : fmp_ssg_freq2key(part->prev_freq);
+ bool tone = !((fmp->ssg_mix >> part->opna_keyon_out) & 1);
+ bool noise = !((fmp->ssg_mix >> part->opna_keyon_out) & 8);
+ if (noise) {
+ if (tone) track->info = FMDRIVER_TRACK_INFO_SSG_NOISE_MIX;
+ else track->info = FMDRIVER_TRACK_INFO_SSG_NOISE_ONLY;
+ }
}
+ track->volume = part->current_vol - 1;
} else {
if (part->pdzf.mode) {
track->info = FMDRIVER_TRACK_INFO_PPZ8;
@@ -2795,6 +2808,7 @@ static void fmp_work_status_update(struct fmdriver_work *work, } else {
track->actual_key = part->status.rest ? 0xff : fmp_fm_freq2key(part->prev_freq);
}
+ track->volume = 0x7f - part->actual_vol;
}
if (part->type.fm && part->opna_keyon_out > 3) {
track->num--;
@@ -2802,6 +2816,16 @@ static void fmp_work_status_update(struct fmdriver_work *work, track->ticks = part->status.off ? 0 : part->tonelen-1;
track->ticks_left = part->tonelen_cnt;
track->key = part->status.rest ? 0xff : fmp_note2key(part->prev_note);
+ track->tonenum = part->tone;
+ track->detune = part->detune - ((part->detune & 0x8000) ? 0x10000 : 0);
+ track->status[0] = part->lfo_f.p ? 'P' : '-';
+ track->status[1] = part->lfo_f.q ? 'Q' : '-';
+ track->status[2] = part->lfo_f.r ? 'R' : '-';
+ track->status[3] = part->lfo_f.a ? 'A' : '-';
+ track->status[4] = '-';
+ track->status[5] = part->lfo_f.e ? 'e' : '-';
+ track->status[6] = (part->type.fm && part->u.fm.hlfo_apms) ? 'H' : '-';
+ track->status[7] = part->status.pitchbend ? 'P' : '-';
}
}
|