File Coverage

blib/lib/SMS/Ringtone/RTTTL/MIDI.pm
Criterion Covered Total %
statement 38 41 92.6
branch 5 10 50.0
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 50 58 86.2


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__