#!/usr/bin/perl
print("Midi Q-Bird ringtone generator\nby Dale Heatherington Feb 5, 2004\n");
@midi_header = (0x4d,0x54,0x68,0x64,0,0,0,6,0,0,0,1,0,0xf0);
@midi_trackhdr = (0x4d,0x54,0x72,0x6b,0,0,0,0);
$start_note = 0x52;  #Sets qbird pitch (high end)
$note = $start_note;
$instr = 82;   #sets midi instrument
@name = (0,0xff,0x01,6,ord("Q"),ord("-"),ord("B"),ord("i"),ord("r"),ord("d"));
@patch = (0x00,0xc0,$instr); #Program Change channel 1
@volume = (0,0xb0,7,0x7f);
@attack = (0,0xb0,0x49,0x3f);
@release = (0,0xb0,0x48,0x3f);
@PBS = (0,0xb0,0x65,0,0,0xb0,6,4);
@PB = (0,0xe0,0,127);
@F4_on = (0x10,0x90,$note,0x7f);  #note on message channel 1
@F4_off = (0x82,0x70,0x80,$note,0); #note off message
@qbird_cycle = (@patch,@volume,@PBS,@release,@attack,@PB,@F4_on);  #Insert pgm change and note on message
@end_track = (0,0xff,0x2f,00);
$sweep_time = 4;
$pb = 0;
#This loop creates one high to low frequency sweep...
#...using pitch-blend messages
$pb = 127;
while($pb >= 0){
	@pb1 = ($sweep_time,0xe0,0x00,$pb);
	@qbird_cycle = (@qbird_cycle,@pb1);
	$pb = $pb - 8;
	}
@qbird_cycle = (@qbird_cycle,0,0x80,$note,0); #append the Note off message
#This loop creates 5 complete qbird ringtone cycles
#2 seconds on, 4 seconds off
$j = 0;
while( $j < 5){
$i = 0;
while($i < 16){  #Inner loop builds  16 qbird freq sweeps
@data = (@data,@qbird_cycle);
$i = $i+1;
}
$j = $j + 1;
@data = (@data,0x8f,0x70,0xc0,$instr);  #4 seconds of silence
}
#
@data = (@name,@data,@end_track); #Append end of track message
#
$tracksize = @data ;   #get size of track data
$midi_trackhdr[7] = $tracksize & 255; #Insert size into track header
$midi_trackhdr[6] = $tracksize / 256;

#print size to console for reference
print ("tracksize=",$tracksize,"\n");
@packet =  (@midi_header,@midi_trackhdr,@data);
#create a binary packet
$bin_str = $bin_str . pack("C*",@packet);
open( OUTFILE, ">qbird2.mid");
binmode(OUTFILE);
print OUTFILE ( $bin_str);  #write .mid file to disk
close(OUTFILE);
print "qbird2.mid file written. Grossness complete!\n";




