line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package SMS::Ringtone::RTTTL::MIDI; |
2
|
|
|
|
|
|
|
#### Package information #### |
3
|
|
|
|
|
|
|
# Description and copyright: |
4
|
|
|
|
|
|
|
# See POD (i.e. perldoc SMS::Ringtone::RTTTL::MIDI). |
5
|
|
|
|
|
|
|
#### |
6
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
9285
|
use strict; |
|
1
|
|
|
|
|
6
|
|
|
1
|
|
|
|
|
52
|
|
8
|
1
|
|
|
1
|
|
7
|
use Exporter; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
50
|
|
9
|
1
|
|
|
1
|
|
1835
|
use MIDI::Simple; |
|
1
|
|
|
|
|
31500
|
|
|
1
|
|
|
|
|
426
|
|
10
|
1
|
|
|
1
|
|
20
|
use SMS::Ringtone::RTTTL::MIDI; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
27
|
|
11
|
1
|
|
|
1
|
|
1011
|
use IO::String; # Add line "sub BINMODE {}" to this module. |
|
1
|
|
|
|
|
4690
|
|
|
1
|
|
|
|
|
387
|
|
12
|
|
|
|
|
|
|
our @ISA = qw(Exporter); |
13
|
|
|
|
|
|
|
our @EXPORT = qw(rtttl_to_midi); |
14
|
|
|
|
|
|
|
our $VERSION = '0.04'; |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
1; |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
sub rtttl_to_midi { |
19
|
1
|
|
|
1
|
1
|
16815
|
my $parser = shift; # SMS::Ringtone::RTTTL::Parser object |
20
|
1
|
|
|
|
|
2
|
my $patch = shift; # Instrument |
21
|
1
|
50
|
|
|
|
5
|
unless(defined($patch)) { |
22
|
1
|
|
|
|
|
1
|
$patch = 1; # Piano |
23
|
|
|
|
|
|
|
} |
24
|
1
|
|
|
|
|
11
|
my $ms = MIDI::Simple->new_score(); |
25
|
1
|
50
|
|
|
|
95
|
if (length($parser->get_part_name())) { |
26
|
1
|
|
|
|
|
8
|
$ms->track_name($parser->get_part_name()); |
27
|
|
|
|
|
|
|
} |
28
|
1
|
|
|
|
|
23
|
$ms->patch_change(0,$patch-1); # Set instrument on channel 0. |
29
|
1
|
|
|
|
|
13
|
$ms->set_tempo(60000000 / $parser->get_bpm()); # Microseconds per quarter note |
30
|
1
|
|
|
|
|
19
|
$ms->noop('fff','c0'); # Set max volume on channel 0. |
31
|
1
|
|
|
|
|
39
|
foreach my $nref ($parser->get_notes()) { |
32
|
|
|
|
|
|
|
# Convert RTTTL duration to MIDI ticks. |
33
|
22
|
|
|
|
|
1042
|
my $ticks = ($ms->Tempo() * 4)/$nref->[0]; |
34
|
22
|
50
|
|
|
|
159
|
if ($nref->[3] == 1) { |
|
|
50
|
|
|
|
|
|
35
|
0
|
|
|
|
|
0
|
$ticks *= 1.5; |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
elsif ($nref->[3] == 2) { |
38
|
0
|
|
|
|
|
0
|
$ticks *= 1.75; |
39
|
|
|
|
|
|
|
} |
40
|
|
|
|
|
|
|
# Write notes |
41
|
22
|
50
|
|
|
|
35
|
if ($nref->[1] eq 'P') { |
42
|
0
|
|
|
|
|
0
|
$ms->r("d$ticks"); |
43
|
|
|
|
|
|
|
} |
44
|
|
|
|
|
|
|
else { |
45
|
22
|
|
|
|
|
25
|
my $note = uc($nref->[1]); |
46
|
22
|
|
|
|
|
32
|
$note =~ s/#/s/go; |
47
|
22
|
|
|
|
|
103
|
$ms->n("d$ticks",$note . $nref->[2]); |
48
|
|
|
|
|
|
|
} |
49
|
|
|
|
|
|
|
} |
50
|
1
|
|
|
|
|
50
|
my $midi; |
51
|
1
|
|
|
|
|
4
|
local(*OUT); |
52
|
1
|
|
|
|
|
14
|
tie *OUT, 'IO::String', \$midi; |
53
|
1
|
|
|
|
|
52
|
$ms->write_score(\*OUT); |
54
|
1
|
|
|
|
|
1800
|
close(OUT); |
55
|
1
|
|
|
|
|
18
|
return $midi; |
56
|
|
|
|
|
|
|
} |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
__END__ |