I had the task of transposing some guitar chords the other day. A very simple form of music notation along the lines of:
C F G G7
needing to go up a semitone to
C# F# G# G#7
And I thought "this will be easy to do with perl..."
This is the best I could come up with:
use strict;
use warnings;
my %notes_hash = (
'A' => 0,
'A#' => 1,
'B' => 2,
'C' => 3,
'C#' => 4,
'D' => 5,
'D#' => 6,
'E' => 7,
'F' => 8,
'F#' => 9,
'G' => 10,
'G#' => 11
);
my @notes_array = ( sort( keys(%notes_hash) ) );
sub transpose {
my ( $note, $amount ) = @_;
my ( $base_note, $modifiers ) = $note =~ m/^([ABCDEFG]#?)(.*)/;
return
$notes_array[ ( ( $notes_hash{$base_note} + $amount ) % 12 ) ]
. $modifiers;
}
print transpose( 'C#7', 1 );
But as you can see, it's not elegant. I'm curious how other Monks might approach this problem.
[Musical scales are modular, in case Monks don't know.]
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.