aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2025-03-01 17:59:32 -0500
committerGravatar Chris Xiong <chirs241097@gmail.com> 2025-03-01 17:59:32 -0500
commit1b75753a315064a97c14742babcc783dedb7bf6f (patch)
treeda7e1cd781db56508ddcfd6200c2d95a798b13ef
parent6e5dc4eaee1ffb9474390dbd62a6dae4b90d8f5f (diff)
downloadit2midi-1b75753a315064a97c14742babcc783dedb7bf6f.tar.xz
Random playback ordering fixes that I have forgotten about.
-rw-r--r--src/convert.rs31
-rw-r--r--src/itfile.rs8
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()?;