]> hydra-www.ietfng.org Git - acmetensortoys-chiptunes/commitdiff
Incremental progress towards new packed format.
authorNathaniel Wesley Filardo <nwf@smaug.priv.ietfng.org>
Sun, 11 Apr 2010 05:46:10 +0000 (01:46 -0400)
committerNathaniel Wesley Filardo <nwf@smaug.priv.ietfng.org>
Sun, 11 Apr 2010 05:46:10 +0000 (01:46 -0400)
This brings a new instrument packing style and also uses the (updated)
Perl optimizer/exporter by default.

Makefile
progenv/tracker_optimize.pl
target/main.c

index c41ff1666d89c435746d2a0e3225392b98906906..02ad9c4b9347634bd1312ecaf12ba24a0bc390b3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,11 +25,14 @@ progenv/gentimes.c: progenv/gentimes.pl
 progenv/gentimes.h: progenv/gentimes.pl
        perl $^ --mode=H --fcpu=${CPU_FREQUENCY} --samprate=${SAMPLE_RATE} > $@
 
+#progenv/trackerfmt.ph: progenv/trackerfmt.h
+#      h2ph -d . $^
+
 progenv/gentimes.o: progenv/gentimes.h
 
 .INTERMEDIATE: songs/%.h
-songs/%.s songs/%.h : songs/%.song | tracker/tracker
-       tracker/tracker --export $^ songs/$*
+songs/%.s songs/%.h : songs/%.song | progenv/tracker_optimize.pl
+       perl progenv/tracker_optimize.pl --optimize --packout=songs/$*.s --headout=songs/$*.h --packver=1 < $^
 
     # For use with e.g. "play --rate 16000 -b8 -L -c1 -e un -t raw"
 songs/%.raw : songs/%.song | tracker/tracker
index 3661c97102be3ba58822fafaed7db81f8b167404..c4a4fe83c122ac79ac85951df3cd50ada08b9efa 100644 (file)
@@ -13,6 +13,7 @@ my $VERBOSE = 0;
 my $TRACKOUTF = undef;
 
 my $PACKOUTF = undef;
+my $HEADOUTF = undef;
 my $PACKVER = 0;
 
 my @IVERPAR = ( undef,
@@ -29,17 +30,34 @@ my @OVERPAR = (
     , 'BASE_TRACK' => '1'
     , 'NR_CHAN' => '4'
     , 'NR_SONGS' => '1'
-    , 'PACKSIZE_TRACKCMD' => '4'
-    , 'PACKSIZE_SONGTRACK' => '6'
     , 'PACKSIZE_INSTRPAR' => '8'
+    , 'PACKSIZE_INSTRCMD' => '8'
+    , 'PACKSIZE_RESOURCE' => '13'
+    , 'PACKSIZE_SONGTRACK' => '6'
     , 'PACKSIZE_SONGTRANS' => '4'
+    , 'PACKSIZE_TRACKCMD' => '4'
     , 'PACKSIZE_TRACKINST' => '4'
-    , 'PACKSIZE_INSTRCMD' => '8'
+    , 'PACKSIZE_TRACKNOTE' => '7'
     , 'PACKSIZE_TRACKPAR' => '8'
+    , 'TRACKLEN' => '32'
+    , 'INSTRPACKER' => \&pack_inst_linear
+    },
+    { 'BASE_INSTR' => '1'
+    , 'BASE_TRACK' => '1'
+    , 'NR_CHAN' => '4'
+    , 'NR_SONGS' => '1'
+    , 'PACKSIZE_INSTRCMD' => '4'
+    , 'PACKSIZE_INSTRPAR' => '8'
     , 'PACKSIZE_RESOURCE' => '13'
+    , 'PACKSIZE_SONGTRACK' => '6'
+    , 'PACKSIZE_SONGTRANS' => '4'
+    , 'PACKSIZE_TRACKCMD' => '4'
+    , 'PACKSIZE_TRACKINST' => '4'
+    , 'PACKSIZE_TRACKPAR' => '8'
     , 'PACKSIZE_TRACKNOTE' => '7'
     , 'TRACKLEN' => '32'
-    },
+    , 'INSTRPACKER' => \&pack_inst_alternating
+    }
 );
 
 sub h2a($) {
@@ -351,7 +369,7 @@ sub padinstrs($$$) {
 sub printout($$$$$) {
     my ($FH, $iverpar, $songrows, $trackrows, $instrumentrows) = @_;
 
-    print "musicchip tune\nversion $$iverpar{'version'}\n\n";
+    print $FH "musicchip tune\nversion $$iverpar{'version'}\n\n";
 
     while (my ($six, $w) = each %{$songrows}) {
         printf $FH "songline %02x", $six;
@@ -359,7 +377,7 @@ sub printout($$$$$) {
             my ($trk, $trn) = @$tts;
             printf $FH " %02x %02x", $trk, $trn;
         }
-        print "\n";
+        print $FH "\n";
     }
 
     while (my ($tix, $w) = each %{$trackrows}) {
@@ -458,19 +476,48 @@ sub pack_tracks($$$) {
     } @$trackrows];
 }
 
-sub pack_instrs($$$) {
-    my ($v, $format, $instrumentrows) = @_;
+sub pack_inst_linear ($$) {
+    my ($inst, $format) = @_;
 
-    return [map {
-        my $pi = new_pack();
-        foreach my $v (@$_) {
-            my ($c, $p) = @$v;
+    my $pi = new_pack();
+    foreach my $v (@$inst) {
+        my ($c, $p) = @$v;
+        append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, $c);
+        append_pack( $pi, $$format{'PACKSIZE_INSTRPAR'}, $p);
+    }
+    append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, 0);
+    ${finish_pack($pi)}[0];
+}
+
+sub pack_inst_alternating ($$) {
+    my ($inst, $format) = @_;
+
+    my $pi = new_pack();
+    my $phase = 0;
+    foreach my $v (@$inst) {
+        my ($c, $p) = @$v;
+        if($phase == 1) {
             append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, $c);
             append_pack( $pi, $$format{'PACKSIZE_INSTRPAR'}, $p);
+        } else {
+            append_pack( $pi, $$format{'PACKSIZE_INSTRPAR'}, $p);
+            append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, $c);
         }
+        $phase = 1 - $phase;
+    }
+    if($phase == 0) {
         append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, 0);
-        ${finish_pack($pi)}[0];
-    } @$instrumentrows];
+    } else {
+        append_pack( $pi, $$format{'PACKSIZE_INSTRPAR'}, 0);
+        append_pack( $pi, $$format{'PACKSIZE_INSTRCMD'}, 0);
+    }
+    ${finish_pack($pi)}[0];
+}
+
+sub pack_instrs($$$) {
+    my ($v, $format, $instrumentrows) = @_;
+
+    return [map {&{$$format{'INSTRPACKER'}}($_, $format)} @$instrumentrows];
 }
 
 sub packout($$$$$$) {
@@ -481,7 +528,7 @@ sub packout($$$$$$) {
     my $pinss = pack_instrs($v, $params, $air);
 
     # resource header
-    my $offset = int(((1+15+$#$atr)*13 + 7)/8);
+    my $offset = int(((1+15+$#$atr)*$$params{'PACKSIZE_RESOURCE'} + 7)/8);
     my $rpack = new_pack();
     append_pack($rpack, $$params{'PACKSIZE_RESOURCE'}, $offset);
 
@@ -538,10 +585,19 @@ sub packout($$$$$$) {
     print $FH "songdata_end:\n";
 }
 
+sub packheadout($$$$$$) {
+    my ($FH, $v, $params, $asr, $atr, $air) = @_;
+
+    printf $FH "#define MAXTRACK 0x%x\n", (scalar $#$atr);
+    printf $FH "#define SONGLEN 0x%x\n", (scalar $#$asr)+1;
+}
+
+
 GetOptions ( 'verbose=i' => \$VERBOSE
            , 'optimize'  => \$OPTIMIZE
            , 'trackout=s' => \$TRACKOUTF
            , 'packout=s' => \$PACKOUTF
+           , 'headout=s' => \$HEADOUTF
            , 'packver=i' => \$PACKVER
            )
 or die "Unable to parse command line: $!";
@@ -552,17 +608,21 @@ my ($iverpar, $sr, $tr, $ir) = parse(*STDIN);
 my ($nsr, $ntr, $nir) = $OPTIMIZE ? remove_unused($sr, $tr, $ir)
                                   : ($sr, $tr, $ir);
 
-my $air = padinstrs($iverpar, $overpar, $ir);
-my $atr = padtracks($iverpar, $overpar, $tr);
-my $asr = padsong  ($iverpar, $overpar, $sr);
+($sr, $tr, $ir) = undef;
+
+my $air = padinstrs($iverpar, $overpar, $nir);
+my $atr = padtracks($iverpar, $overpar, $ntr);
+my $asr = padsong  ($iverpar, $overpar, $nsr);
 
 if (defined $TRACKOUTF) {
     open TRACKOUT,">$TRACKOUTF" or die "Can't open $TRACKOUTF: $!";
-    printout(*TRACKOUT, $iverpar, $sr, $tr, $ir);
+    printout(*TRACKOUT, $iverpar, $nsr, $ntr, $nir);
     close TRACKOUT
 }
 
 if (defined $PACKOUTF) {
+    die "Also need --headout" if not defined $HEADOUTF;
+
     die "Too many input channels"
         if $$iverpar{'channels'} > $$overpar{'NR_CHAN'};
     die "Too many instruments!"
@@ -572,6 +632,10 @@ if (defined $PACKOUTF) {
 
     open PACKOUT,">$PACKOUTF" or die "Can't open $PACKOUTF: $!";
     packout(*PACKOUT, $iverpar, $overpar, $asr, $atr, $air);
-    close PACKOUT
+    close PACKOUT;
+
+    open HEADOUT,">$HEADOUTF" or die "Can't open $HEADOUTF: $!";
+    packheadout(*HEADOUT, $iverpar, $overpar, $asr, $atr, $air);
+    close HEADOUT;
 }
 
index 67780e8246691f4b19ec672112716a90525b417f..1a74e8a87cd5c1136b8543f2bfaeb7a747c7fa71 100644 (file)
@@ -114,8 +114,17 @@ u16 readchunk(struct unpacker *up, u8 n) {
 }
 
 static void readinstr(u8 num, u8 pos, u8 *dest) {
-       dest[0] = readsongbyte(resources[num] + 2 * pos + 0);
-       dest[1] = readsongbyte(resources[num] + 2 * pos + 1);
+    u16 base = resources[num];
+
+       u8 s0 = readsongbyte(base + pos + pos/2 + 0);
+       u8 s1 = readsongbyte(base + pos + pos/2 + 1);
+    if(pos & 1) {
+        dest[0] = s0 >> 4;
+        dest[1] = s1;
+    } else {
+        dest[0] = s1 & 0xF;
+        dest[1] = s0; 
+    }
 }
 
 static void runcmd(u8 ch, u8 cmd, u8 param) {