1 package GSM::SMS::Support::RTTTL2MIDI;
4 use vars qw(@ISA @EXPORT $VERSION $error_rtttl %rtl_props @rtl_notes $rtl_name);
8 @EXPORT = qw(Rtttl2Midi);
14 $error_rtttl = "Yaketysax:d=4,o=5,b=125:8d.,16e,8g,8g,16e,16d,16a4,16b4,16d,16b4,";
15 $error_rtttl .="8e,16d,16b4,16a4,16b4,8a4,16a4,16a#4,16b4,16d,16e,16d,g,p,16d,16e,";
16 $error_rtttl .="16d,8g,8g,16e,16d,16a4,16b4,16d,16b4,8e,16d,16b4,16a4,16b4,8d,16d,";
17 $error_rtttl .="16d,16f#,16a,8f,d,p,16d,16e,16d,8g,16g,16g,8g,16g,16g,8g,8g,16e,8e.,";
18 $error_rtttl .="8c,8c,8c,8c,16e,16g,16a,16g,16a#,8g,16a,16b,16a#,16b,16a,16b,8d6,16a,";
19 $error_rtttl .="16b,16d6,8b,8g,8d,16e6,16b,16b,16d,8a,8g,g";
23 my($xrtttl,$program) = @_;
24 $program = 1 unless defined $program;
25 my $status = pharse_rtttl($xrtttl);
31 $xrtttl = $error_rtttl;
32 pharse_rtttl($xrtttl);
35 my ($head, $track_data, $track_head, $midi);
37 $head = mf_write_header_chunk(0,1,384);
38 $track_data = copy_right();
39 $track_data .= track_name("MIDI by RTTTL2MIDI");
40 $track_data .= volumeup();
41 $track_data .= mf_write_tempo($rtl_props{b});
42 $track_data .= add_program($program);
43 $track_data .= notes2midi();
44 $track_data .= end_track();
45 $track_head = mf_write_track_chunk($track_data);
46 $midi = $head . $track_head . $track_data;
58 my ($name,$defaults,$notes) = split /:/, $str;
59 unless($name=~/[a-zA-Z0-9]/ && length($name) < 32) { return 0; }
60 map { my($n,$v) = split /=/, $_; $rtl_props{$n} = $v; } split /,/, $defaults;
61 unless($rtl_props{d} =~ /\d+/) { return 0; }
62 unless($rtl_props{o} =~ /\d+/) { return 0; }
63 unless($rtl_props{b} =~ /\d+/) { return 0; }
64 my($dotted, $i, $r) = 0;
65 my @nts = split /,/, clean_spaces($notes);
66 for($i=0; $i < @nts; $i++) {
67 my($d,$n,$s,$x) = ($nts[$i] =~ /(\d*)([a-z]#?)(\d*)(\.?)/);
68 #duration, note, oktav, dot
69 unless($d =~ /\d*/) { return 0; }
70 unless($n =~ /[a-z]#?/) { return 0; }
71 unless($s =~ /\d*/) { return 0; }
72 unless($x =~ /\.?/) { return 0; }
73 $dotted = ($x eq ".") ? 1:0;
74 $d = $rtl_props{d} if($d == "");
75 $s = $rtl_props{o} if($s == "");
76 $rtl_notes[$i] = ([$d,$n,$s,$dotted]);
90 $r .= eputc((($data >> 24) & 0xff));
91 $r .= eputc((($data >> 16) & 0xff));
92 $r .= eputc((($data >> 8 ) & 0xff));
93 $r .= eputc(($data & 0xff));
100 $r .= eputc((($data & 0xff00) >> 8));
101 $r .= eputc(($data & 0xff));
105 sub mf_write_header_chunk {
106 my ($format, $ntracks, $division) = @_;
107 my $ident = 0x4d546864;
110 $r .= write32bit($ident);
111 $r .= write32bit($length);
112 $r .= write16bit($format);
113 $r .= write16bit($ntracks);
114 $r .= write16bit($division);
118 sub mf_write_track_chunk {
120 my $trkhdr = 0x4d54726b;
122 $r .= write32bit($trkhdr);
123 $r .= write32bit(length($track));
131 $buffer = $value & 0x7f;
132 while(($value >>= 7) > 0) {
135 $buffer += ($value & 0x7f);
138 $r .= eputc(($buffer & 0xff));
149 my $tempo = (60000000.0 / ($t));
155 $r .= eputc((0xff & ($tempo >> 16)));
156 $r .= eputc((0xff & ($tempo >> 8)));
157 $r .= eputc((0xff & $tempo));
161 sub mf_write_midi_event {
162 my ($delta_time, $type, $chan, @data) = @_;
165 my $r = WriteVarLen($delta_time);
168 for($i = 0; $i < @data; $i++) {
169 $r .= eputc($data[$i]);
201 $r = mf_write_midi_event(0,0xc0,0,data1($prg));
206 my($s, $d, $p, $td) = @_;
208 $r .= mf_write_midi_event($s,0x90,0,data($p,100));
209 $r .= mf_write_midi_event($d,0x80,0,data($p,0));
219 my $c = "Rtttl2Midi CopyRight under GPL written by sanalCell.com 2001";
224 $r .= eputc(length($c));
235 $r .= eputc(length($c));
242 $r = mf_write_midi_event(0,0xB0,0,data(0x07,127));
248 $nt = lc(clean_spaces($nt));
266 $r = 12 + (12*$oc) + $r;
290 my ($a, $pt, $tm, $rest) = 0;
291 for($a = 0; $a != @rtl_notes; $a++) {
292 $pt = get_pitch($rtl_notes[$a][1],$rtl_notes[$a][2]-1);
293 $tm = get_time($rtl_notes[$a][0],$rtl_notes[$a][3]);
298 $alldata .= note($rest,$tm,$pt,$r);
309 GSM::SMS::Support::RTTTL2MIDI
313 use GSM::SMS::Support::RTTTL2MIDI;
315 print "Content-type: audio/x-midi\n\n";
316 print Rtttl2Midi($rtttl_string, $piano);
320 Converts rtttl strings to midi sound. Also you can set piano
321 like Hammod Organ (17) and Grand Piano (1).
325 =head2 Rtttl2Midi($strRTTTL, $piano)
327 Generate a binary midi stream from $strRTTTL, using $piano as the
332 Ethem Evlice <webmaster@tuzluk.com>