diff options
author | 2025-03-01 17:59:32 -0500 | |
---|---|---|
committer | 2025-03-01 17:59:32 -0500 | |
commit | 1b75753a315064a97c14742babcc783dedb7bf6f (patch) | |
tree | da7e1cd781db56508ddcfd6200c2d95a798b13ef | |
parent | 6e5dc4eaee1ffb9474390dbd62a6dae4b90d8f5f (diff) | |
download | it2midi-1b75753a315064a97c14742babcc783dedb7bf6f.tar.xz |
Random playback ordering fixes that I have forgotten about.
-rw-r--r-- | src/convert.rs | 31 | ||||
-rw-r--r-- | src/itfile.rs | 8 |
2 files changed, 28 insertions, 11 deletions
diff --git a/src/convert.rs b/src/convert.rs index a96c802..d3cae16 100644 --- a/src/convert.rs +++ b/src/convert.rs @@ -145,7 +145,7 @@ impl<'a, 'b> Player<'a, 'b> { u8::MAX => PlayerState{loop_ctr: 1, in_rep: true, .. self.skip_to(ps.current_row, ps.current_ord, ps)}, _ if ps.loop_ctr >= c => PlayerState{loop_ctr: !0, in_rep: false, ..ps}, - _ => PlayerState{loop_ctr: ps.loop_start + 1, .. self.skip_to(ps.current_row, ps.current_ord, ps)} + _ => PlayerState{loop_ctr: ps.loop_ctr + 1, .. self.skip_to(ps.current_row, ps.current_ord, ps)} }, Effect::TempoSlideDown(v) => PlayerState{tempo: ps.tempo - v, ..ps}, Effect::TempoSlideUp(v) => PlayerState{tempo: ps.tempo + v, ..ps}, @@ -190,14 +190,16 @@ impl<'a, 'b> Player<'a, 'b> /// passing !0 to row or ord if it's unused fn skip_to(&self, row: u8, ord: u8, ps: PlayerState) -> PlayerState { - println!("skip to row {} of ord #{}", row, ord); - PlayerState { + println!("skip to row {} of ord #{}, current ord #{}", row, ord, ps.current_ord); + let r = PlayerState { skip_row: if !row != 0 { row } else { ps.skip_row }, skip_ord: if !ord != 0 { ord } else { if (!row != 0) && (!ps.skip_ord == 0) { ps.current_ord + 1 } else { ps.skip_ord } }, ..ps - } + }; + println!("new location {} {}", r.skip_row, r.skip_ord); + r } fn process_orders(&self) { @@ -222,13 +224,13 @@ impl<'a, 'b> Player<'a, 'b> { if oid >= self.it.orders.len() { break; } if self.it.orders[oid] == 0xff { break; } - if self.it.orders[oid] == 0xfe { continue; } + if self.it.orders[oid] == 0xfe { oid += 1; continue; } ps.current_ord = oid as u8; ps = self.process_pattern(self.it.orders[oid].into(), ps); if !ps.skip_ord != 0 { if ps.skip_ord as usize <= oid && !ps.loop_ctr == 0 - { println!("loop?"); } + { println!("loop?"); break; } else { oid = ps.skip_ord as usize; } ps.skip_ord = !0; } @@ -278,13 +280,13 @@ impl<'a, 'b> Converter<'a, 'b> } match note { - 0x78..=0xff => + 0x78..=0xff => //cut / off / fade -> note off if chmem.borrow().postnote != 0xff { ret.push((TimedMidiEvent{t: t.as_int_trunc() as u32, e: MidiEvent::NoteOff{ch: 0, key: chmem.borrow().postnote, vel: 0x40}}, (ch, inst))); chmem.borrow_mut().postnote = 0xff; }, - _ => + _ => //new note { if chmem.borrow().postnote != 0xff { @@ -331,6 +333,15 @@ impl<'a, 'b> Converter<'a, 'b> } ret }; + let volfx = |ch: u8, cell, chmem: Rc<RefCell<ChannelMemory>>, ps: PlayerState, t: Rational| { + if !ch == 0 || ps.in_rep { return Vec::new(); } + let mut ret: Vec<TimedMidiEvent> = Vec::new(); + let Cell { mask, vol, efx, fxp, .. } = cell; + let vfx = Effect::from_it_vol(vol); + let fx = Effect::from_it_efx((efx, fxp)); + ret + }; + self.fx_handlers.push(Box::new(RefCell::new(tempofx))); self.fx_handlers.push(Box::new(RefCell::new(nonfx))); @@ -342,12 +353,12 @@ impl<'a, 'b> Converter<'a, 'b> { let h = |ch, cell, ps: PlayerState| { if (ch == 0xff) || (ps.current_tick != 0) { return ps; } - let Cell{mask, mut inst, ..} = cell; + let Cell{mask, note, mut inst, ..} = cell; if mask & 0x22 != 0 { chinst[ch as usize] = inst; } else { inst = chinst[ch as usize]; } - if mask & 0x11 != 0 + if (mask & 0x11 != 0) && (note < 0x78) { instchmap.insert((inst, ch)); } ps }; diff --git a/src/itfile.rs b/src/itfile.rs index 6d85a87..311207b 100644 --- a/src/itfile.rs +++ b/src/itfile.rs @@ -541,7 +541,8 @@ pub fn load(filename: &str) -> Result<ITFile, self::Error> let patt_offsets: Vec<u32> = read_vec(&mut f, header.npatt as usize)?; println!("orders {:?}", orders); - println!("inst offsets {:x?}",inst_offsets); + println!("inst offsets {:x?}", inst_offsets); + println!("patt offsets {:x?}", patt_offsets); let mut message = String::new(); if header.has_message() @@ -601,6 +602,11 @@ pub fn load(filename: &str) -> Result<ITFile, self::Error> let mut patterns: Vec<Patt> = Vec::new(); for patt_offset in patt_offsets { + if patt_offset == 0 + { + patterns.push(Patt{nrows: 0, nch: 64, data: vec![]}); + continue; + } f.seek(SeekFrom::Start(patt_offset.into()))?; let patt = Patt::load(&mut f)?; let dataend_off = f.stream_position()?; |