From 1b75753a315064a97c14742babcc783dedb7bf6f Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sat, 1 Mar 2025 17:59:32 -0500 Subject: Random playback ordering fixes that I have forgotten about. --- src/convert.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'src/convert.rs') 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>, ps: PlayerState, t: Rational| { + if !ch == 0 || ps.in_rep { return Vec::new(); } + let mut ret: Vec = 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 }; -- cgit v1.2.3