Files
DRAMSys/extensions/apps/traceAnalyzer/scripts/sonification.pl

85 lines
1.8 KiB
Perl

#!/bin/perl -w
use MIDI; # ...which "use"s MIDI::Track et al
use DBI;
use Data::Dumper;
use warnings;
use strict;
my $dbfile = shift || die("No File");
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
# Get time:
my $sth = $dbh->prepare("SELECT clk FROM GeneralInfo");
$sth->execute();
my $result = $sth->fetch;
my $timebase = $result->[0];
$sth = $dbh->prepare("SELECT p.PhaseName, p.PhaseBegin, p.PhaseEnd, t.TBank
FROM Phases p, Transactions t
WHERE (p.PhaseName = 'WR' OR p.PhaseName = 'RD')
AND p.Transact = t.ID
ORDER BY PhaseBegin");
$sth->execute();
my @score;
push(\@score, ['text_event', 0, 'Sonification']);
push(\@score, ['patch_change', 0, 1, 8]);
push(\@score, ['instrument_name', 0, 81]);
while(my @row = $sth->fetchrow_array)
{
#print $row[0]."\t".$row[1]."\t".$row[2]."\t".$row[3]."\n";
# ('note', starttime, duration, channel, note, velocity)
my $note;
if($row[3] == 0)
{
$note = 72; #C
}
elsif($row[3] == 1)
{
$note = 75; #Eb
}
elsif($row[3] == 2)
{
$note = 76; #E
}
elsif($row[3] == 3)
{
$note = 77; #F
}
elsif($row[3] == 4)
{
$note = 78; #Gb
}
elsif($row[3] == 5)
{
$note = 79; #G
}
elsif($row[3] == 6)
{
$note = 82; #Bb
}
elsif($row[3] == 7)
{
$note = 84; #C
}
push(\@score, ['note', $row[1]/$timebase, 1, 1, $note, 96]);
}
#print Dumper(\@score);
#MIDI::Score::dump_score( \@score );
my $track = MIDI::Track->new;
my @events = @{MIDI::Score::score_r_to_events_r( \@score )};
$track->events(@events);
#$track->dump();
my $opus = MIDI::Opus->new({ 'format' => 0, 'ticks' => 240, 'tracks' => [ $track ] });
$opus->write_to_file('cowbell.mid');