diff options
-rw-r--r-- | src/convert.rs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/convert.rs b/src/convert.rs index d3e1a4b..a8aeb1a 100644 --- a/src/convert.rs +++ b/src/convert.rs @@ -226,19 +226,23 @@ impl<'a, 'b> Converter<'a, 'b> let nonfx = |ch: u8, cell, chmem: Rc<RefCell<ChannelMemory>>, ps: PlayerState, t: Rational| { if !ch == 0 || ps.in_rep { return Vec::new(); } let mut ret = Vec::new(); - let Cell { mask, note, mut inst, mut vol, .. } = cell; + let Cell { mask, note, mut inst, vol, .. } = cell; + let vole = Effect::from_it_vol(vol); + let mut vel = 0xffu8; + if mask & 0x44 != 0 + { + match vole + { + Effect::SetVolume(vol) => vel = vol, + _ => () + } + } if mask & 0x11 != 0 && ps.current_tick == 0 { if mask & 0x22 == 0 { inst = chmem.borrow().postinst; } - if mask & 0x44 == 0 && (0u8..0x78).contains(¬e) - { - let samp = if self.it.inst_mode() { self.it.insts[(inst - 1) as usize].samp_for_key(note) } else { inst }; - if samp != 0 - { vol = self.it.samps[(samp - 1) as usize].default_vol(); } - } match note { 0x78..=0xff => @@ -253,8 +257,13 @@ impl<'a, 'b> Converter<'a, 'b> { ret.push((TimedMidiEvent{t: t.as_int_trunc() as u32, e: MidiEvent::NoteOff{ch: 0, key: chmem.borrow().postnote, vel: 0x40}}, (ch, chmem.borrow().postinst))); } - if vol == 0 { vol = 1; } //TODO: investigate - ret.push((TimedMidiEvent{t: t.as_int_trunc() as u32, e: MidiEvent::NoteOn{ch: 0, key: note, vel: vol}}, (ch, inst))); + if vel == 0xff + { + let samp = if self.it.inst_mode() { self.it.insts[(inst - 1) as usize].samp_for_key(note) } else { inst }; + if samp != 0 + { vel = self.it.samps[(samp - 1) as usize].default_vol(); } + } + ret.push((TimedMidiEvent{t: t.as_int_trunc() as u32, e: MidiEvent::NoteOn{ch: 0, key: note, vel}}, (ch, inst))); chmem.borrow_mut().postnote = note; chmem.borrow_mut().postinst = inst; chmem.borrow_mut().initvol = vol; @@ -279,7 +288,7 @@ impl<'a, 'b> Converter<'a, 'b> else { inst = chinst[ch as usize]; } if mask & 0x11 != 0 - { instchmap.insert((ch, inst)); } + { instchmap.insert((inst, ch)); } ps }; let p = Player::new(Box::new(RefCell::new(h)), it); @@ -301,7 +310,7 @@ impl<'a, 'b> Converter<'a, 'b> let inittpo = it.header.tempo as f64; let rpb = it.time_signature().unwrap_or((4, 4)).0 as f64; self.trks[0].push(TimedMidiEvent{ t: 0, e: MidiEvent::MetaTempo(inittpo * 24. / rpb / initspd)}); - for ((ch, inst), trkn) in instch.iter() + for ((inst, ch), trkn) in instch.iter() { let tn = format!("{} (instr #{}) @ ch{}", it.insts[(inst - 1) as usize].inst_name() , *inst, *ch); self.trks[*trkn].push(TimedMidiEvent{ t:0, e: MidiEvent::MetaTrackName(tn) }); @@ -322,7 +331,7 @@ impl<'a, 'b> Converter<'a, 'b> let ev = (h.borrow_mut())(ch, cell, self.chmem[ch as usize].clone(), ps.clone(), self.miditick); ev.iter().for_each( |(e, (ch, inst))| { - let target_track = instch.get(&(*ch, *inst)).unwrap_or(&0); + let target_track = instch.get(&(*inst, *ch)).unwrap_or(&0); self.trks[*target_track].push(e.clone()); } ); |