Last active
November 21, 2019 19:28
-
-
Save creaktive/1e2c42264a8f6a2799cd726b2e237607 to your computer and use it in GitHub Desktop.
heptatonic scale generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env perl | |
| # inspired by https://randscullard.com/CircleOfFifths/ | |
| # and http://pages.mtu.edu/~suits/notefreqs.html | |
| use 5.010; | |
| use strict; | |
| use warnings; | |
| use charnames (); | |
| use open OUT => ':locale'; | |
| use utf8; | |
| my $tones = 12; | |
| my @mode = qw( 2 2 1 2 2 2 1 ); # Ionian | |
| # my @mode = qw( 2 1 2 2 1 2 2 ); # Aeolian | |
| my %natural = qw( 0 C 2 D 4 E 5 F 7 G 9 A 11 B ); | |
| my @note; | |
| my $c = 0; | |
| for my $i ( @mode ) { | |
| push @note => $c; | |
| $c += $i; | |
| } | |
| my ( %sharp, %flat ); | |
| for my $i ( keys %natural ) { | |
| $sharp { ( $i + 1 ) % $tones } = $natural{ $i } . "\N{MUSIC SHARP SIGN}"; | |
| $flat { ( $i - 1 ) % $tones } = $natural{ $i } . "\N{MUSIC FLAT SIGN}"; | |
| } | |
| sub print_scale (@) { sprintf join( ' ', ( '%-2s' ) x 7 ) => @_ } | |
| sub notes ($) { map { ( 7 * $_[ 0 ] + $note[ $_ ] ) % $tones } 0 .. $#mode } | |
| for my $i ( 0 .. 6 ) { | |
| say print_scale map { | |
| $i == 6 | |
| ? $sharp{ $_ } || $natural{ $_ } | |
| : $natural{ $_ } || $sharp{ $_ } | |
| } notes $i | |
| } | |
| for my $i ( 6 .. 11 ) { | |
| say print_scale map { | |
| $i == 6 | |
| ? $flat{ $_ } || $natural{ $_ } | |
| : $natural{ $_ } || $flat{ $_ } | |
| } notes $i | |
| } | |
| __DATA__ | |
| C D E F G A B | |
| G A B C D E F♯ | |
| D E F♯ G A B C♯ | |
| A B C♯ D E F♯ G♯ | |
| E F♯ G♯ A B C♯ D♯ | |
| B C♯ D♯ E F♯ G♯ A♯ | |
| F♯ G♯ A♯ B C♯ D♯ E♯ | |
| G♭ A♭ B♭ C♭ D♭ E♭ F | |
| D♭ E♭ F G♭ A♭ B♭ C | |
| A♭ B♭ C D♭ E♭ F G | |
| E♭ F G A♭ B♭ C D | |
| B♭ C D E♭ F G A | |
| F G A B♭ C D E |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!doctype html> | |
| <html class="no-js" lang=""> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
| <title>Major & Minor Scales</title> | |
| <meta name="description" content=""> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:200" rel="stylesheet"> | |
| <style> | |
| body { background-color: #000 } | |
| table { | |
| border: 0; | |
| -webkit-border-horizontal-spacing: 0; | |
| -webkit-border-vertical-spacing: 0; | |
| } | |
| td { | |
| width: 10em; | |
| height: 10em; | |
| color: #fff; | |
| font-family: 'Source Code Pro', monospace; | |
| font-size: 10pt; | |
| text-align: center; | |
| vertical-align: middle; | |
| } | |
| td span { opacity: 0.75 } | |
| td span big { font-size: 3em } | |
| </style> | |
| </head> | |
| <body><table> | |
| <tr> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>277.2 Hz<br/>124.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>D♯</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>G♯</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>A♯</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>G♯</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>A♯</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>D♯</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>D♯</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>G♯</big><br/>830.6 Hz<br/>41.5 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>A♯</big><br/>932.3 Hz<br/>37.0 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>G♯</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>D♯</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>G♯</big><br/>830.6 Hz<br/>41.5 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>293.7 Hz<br/>117.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>C♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>F♯</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610000"><span><big>C</big><br/>261.6 Hz<br/>131.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>293.7 Hz<br/>117.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>784.0 Hz<br/>44.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>A</big><br/>880.0 Hz<br/>39.2 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>A♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>D</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#20FF00"><span><big>A♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>D♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>G</big><br/>784.0 Hz<br/>44.0 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#9A0000"><span><big>D♭</big><br/>277.2 Hz<br/>124.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>G♭</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>A♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>C</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FFD400"><span><big>G♭</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>A♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>D♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>F</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610061"><span><big>B</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>D♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>E</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>G♭</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>A♭</big><br/>830.6 Hz<br/>41.5 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>B♭</big><br/>932.3 Hz<br/>37.0 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#9A0000"><span><big>c♯</big><br/>277.2 Hz<br/>124.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>d♯</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>f♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>g♯</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FFD400"><span><big>f♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>g♯</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>c♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>c♯</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>f♯</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>784.0 Hz<br/>44.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>880.0 Hz<br/>39.2 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>f♯</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>784.0 Hz<br/>44.0 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>293.7 Hz<br/>117.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610000"><span><big>c</big><br/>261.6 Hz<br/>131.9 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>293.7 Hz<br/>117.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>392.0 Hz<br/>88.0 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610000"><span><big>c</big><br/>523.3 Hz<br/>65.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>698.5 Hz<br/>49.4 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>830.6 Hz<br/>41.5 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF5300"><span><big>f</big><br/>349.2 Hz<br/>98.8 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#4800FF"><span><big>b♭</big><br/>466.2 Hz<br/>74.0 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>622.3 Hz<br/>55.4 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>277.2 Hz<br/>124.5 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e♭</big><br/>311.1 Hz<br/>110.9 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>329.6 Hz<br/>104.7 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>370.0 Hz<br/>93.2 cm</span></td> | |
| <td style="background-color:#20FF00"><span><big>a♭</big><br/>415.3 Hz<br/>83.1 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>440.0 Hz<br/>78.4 cm</span></td> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| </tr> | |
| <tr> | |
| <td style="background-color:#610061"><span><big>b</big><br/>493.9 Hz<br/>69.9 cm</span></td> | |
| <td style="background-color:#9A0000"><span><big>d♭</big><br/>554.4 Hz<br/>62.2 cm</span></td> | |
| <td style="background-color:#D20000"><span><big>d</big><br/>587.3 Hz<br/>58.7 cm</span></td> | |
| <td style="background-color:#FF0000"><span><big>e</big><br/>659.3 Hz<br/>52.3 cm</span></td> | |
| <td style="background-color:#FFD400"><span><big>g♭</big><br/>740.0 Hz<br/>46.6 cm</span></td> | |
| <td style="background-color:#B5FF00"><span><big>g</big><br/>784.0 Hz<br/>44.0 cm</span></td> | |
| <td style="background-color:#00B6FF"><span><big>a</big><br/>880.0 Hz<br/>39.2 cm</span></td> | |
| </tr> | |
| </table></body> | |
| </html> | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env perl | |
| # inspired by https://randscullard.com/CircleOfFifths/ | |
| # and http://pages.mtu.edu/~suits/notefreqs.html | |
| use 5.010; | |
| use strict; | |
| use warnings; | |
| use charnames (); | |
| use open OUT => ':locale'; | |
| use utf8; | |
| use Carp; | |
| use POSIX; | |
| use Scalar::Util qw(dualvar); | |
| my $tones = 12; | |
| my %notes = qw(0 C 2 D 4 E 5 F 7 G 9 A 11 B); | |
| my @freqs = | |
| map { 2 ** (($_ - 9) / $tones) * 440 } | |
| 0 .. $tones - 1; | |
| my @wavelengths = map { 345 / $_ } @freqs; | |
| my @rgb = reverse map { | |
| sprintf '#' . ('%02X' x 3), | |
| map { POSIX::round(255 * $_) } | |
| convert_wave_length_nm_to_rgb($_) | |
| } map { | |
| 380 + 400 * $_ # in nanometers | |
| } map { | |
| ($_ - $wavelengths[0]) / ($wavelengths[-1] - $wavelengths[0]) | |
| } @wavelengths; | |
| my $last_note; | |
| my @sharps; | |
| for my $i (0 .. $tones - 1) { | |
| push @sharps, dualvar $i, $notes{$i} // $last_note . "\N{MUSIC SHARP SIGN}"; | |
| $last_note = $notes{$i}; | |
| } | |
| my @flats; | |
| for my $i (reverse 0 .. $tones - 1) { | |
| unshift @flats, dualvar $i, => $notes{$i} // $last_note . "\N{MUSIC FLAT SIGN}"; | |
| $last_note = $notes{$i}; | |
| } | |
| my @major = reverse ( # fifths steps | |
| (map { $flats[$_ * 7 % $tones] } 3 .. 10), | |
| (map { $sharps[$_ * 7 % $tones] } 11 .. 29), | |
| ); | |
| my @major_order = reverse ( # 5,3,1,6,4,2,0 | |
| (grep { not $_ % 2 } 0 .. 6), | |
| (grep { $_ % 2 } 1 .. 5), | |
| ); | |
| my @minor = ( # fourths steps | |
| (map { $sharps[$_ * 5 % $tones] } -2 .. 11), | |
| (map { $flats[$_ * 5 % $tones] } 12 .. 24), | |
| ); | |
| my @minor_order = @major_order[5, 6, 0 .. 4]; | |
| say <<'HEADER'; | |
| <!doctype html> | |
| <html class="no-js" lang=""> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
| <title>Major & Minor Scales</title> | |
| <meta name="description" content=""> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:200" rel="stylesheet"> | |
| <style> | |
| body { background-color: #000 } | |
| table { | |
| border: 0; | |
| -webkit-border-horizontal-spacing: 0; | |
| -webkit-border-vertical-spacing: 0; | |
| } | |
| td { | |
| width: 10em; | |
| height: 10em; | |
| color: #fff; | |
| font-family: 'Source Code Pro', monospace; | |
| font-size: 10pt; | |
| text-align: center; | |
| vertical-align: middle; | |
| } | |
| td span { opacity: 0.75 } | |
| td span big { font-size: 3em } | |
| </style> | |
| </head> | |
| <body><table> | |
| HEADER | |
| print_scale(0, (@major[$_ .. $_ + 6]) [@major_order]) for 5 .. 19; | |
| print_scale(1, (@minor[$_ .. $_ + 6]) [@minor_order]) for 5 .. 19; | |
| say <<'FOOTER'; | |
| </table></body> | |
| </html> | |
| FOOTER | |
| sub print_scale { | |
| my ($is_minor, @scale) = @_; | |
| my $row = qq(\t\t<td style="background-color:%s"><span><big>%s</big><br/>%0.1f Hz<br/>%0.1f cm</span></td>\n); | |
| say "\t<tr>"; | |
| my $o = 1; | |
| my $prev_note; | |
| for my $note (@scale) { | |
| ++$o if defined $prev_note && $freqs[$note] < $freqs[$prev_note]; | |
| printf $row, | |
| $rgb[$note], | |
| $is_minor ? lc $note : uc $note, | |
| $o * $freqs[$note], | |
| ($wavelengths[$note] * 100) / $o; | |
| $prev_note = $note; | |
| } | |
| say "\t</tr>"; | |
| } | |
| # Ported to Perl from: https://github.com/ArashPartow/bitmap/blob/master/bitmap_image.hpp | |
| # Credits: Dan Bruton http://www.physics.sfasu.edu/astro/color.html | |
| sub convert_wave_length_nm_to_rgb { | |
| my ($wave_length_nm, $gamma) = @_; | |
| $gamma ||= 0.8; | |
| my ($red, $green, $blue); | |
| if ((380 <= $wave_length_nm) && ($wave_length_nm < 440)) { | |
| $red = -($wave_length_nm - 440) / (440 - 380); | |
| $green = 0; | |
| $blue = 1; | |
| } elsif ((440 <= $wave_length_nm) && ($wave_length_nm < 490)) { | |
| $red = 0; | |
| $green = ($wave_length_nm - 440) / (490 - 440); | |
| $blue = 1; | |
| } elsif ((490 <= $wave_length_nm) && ($wave_length_nm < 510)) { | |
| $red = 0; | |
| $green = 1; | |
| $blue = -($wave_length_nm - 510) / (510 - 490); | |
| } elsif ((510 <= $wave_length_nm) && ($wave_length_nm < 580)) { | |
| $red = ($wave_length_nm - 510) / (580 - 510); | |
| $green = 1; | |
| $blue = 0; | |
| } elsif ((580 <= $wave_length_nm) && ($wave_length_nm < 645)) { | |
| $red = 1; | |
| $green = -($wave_length_nm - 645) / (645 - 580); | |
| $blue = 0; | |
| } elsif ((645 <= $wave_length_nm) && ($wave_length_nm <= 780)) { | |
| $red = 1; | |
| $green = 0; | |
| $blue = 0; | |
| } else { | |
| carp "Wave length of $wave_length_nm nm is outside of the visible range (380-780 nm)"; | |
| $red = $green = $blue = 0; | |
| } | |
| my $factor; | |
| if ((380 <= $wave_length_nm) && ($wave_length_nm < 420)) { | |
| $factor = 0.3 + 0.7 * ($wave_length_nm - 380) / (420 - 380); | |
| } elsif ((420 <= $wave_length_nm) && ($wave_length_nm < 700)) { | |
| $factor = 1; | |
| } elsif ((700 <= $wave_length_nm) && ($wave_length_nm <= 780)) { | |
| $factor = 0.3 + 0.7 * (780 - $wave_length_nm) / (780 - 700); | |
| } else { | |
| $factor = 0; | |
| } | |
| return map { | |
| ($_ * $factor) ** $gamma | |
| } ($red, $green, $blue); | |
| } | |
| __DATA__ | |
| C D E F G A B | |
| F G A A♯ C D E | |
| A♯ C D D♯ F G A | |
| D♯ F G G♯ A♯ C D | |
| G♯ A♯ C C♯ D♯ F G | |
| C♯ D♯ F F♯ G♯ A♯ C | |
| F♯ G♯ A♯ B C♯ D♯ F | |
| B C♯ D♯ E F♯ G♯ A♯ | |
| E F♯ G♯ A B C♯ D♯ | |
| A B C♯ D E F♯ G♯ | |
| D E F♯ G A B C♯ | |
| G A B C D E F♯ | |
| C D E F G A B | |
| F G A B♭ C D E | |
| B♭ C D E♭ F G A | |
| E♭ F G A♭ B♭ C D | |
| A♭ B♭ C D♭ E♭ F G | |
| D♭ E♭ F G♭ A♭ B♭ C | |
| G♭ A♭ B♭ B D♭ E♭ F | |
| B D♭ E♭ E G♭ A♭ B♭ | |
| E G♭ A♭ A B D♭ E♭ | |
| c d d♯ f g g♯ a♯ | |
| f g g♯ a♯ c c♯ d♯ | |
| a♯ c c♯ d♯ f f♯ g♯ | |
| d♯ f f♯ g♯ a♯ b c♯ | |
| g♯ a♯ b c♯ d♯ e f♯ | |
| c♯ d♯ e f♯ g♯ a b | |
| f♯ g♯ a b c♯ d e | |
| b c♯ d e f♯ g a | |
| e f♯ g a b c d | |
| a b c d e f g | |
| d e f g a b♭ c | |
| g a b♭ c d e♭ f | |
| c d e♭ f g a♭ b♭ | |
| f g a♭ b♭ c d♭ e♭ | |
| b♭ c d♭ e♭ f g♭ a♭ | |
| e♭ f g♭ a♭ b♭ b d♭ | |
| a♭ b♭ b d♭ e♭ e g♭ | |
| d♭ e♭ e g♭ a♭ a b | |
| g♭ a♭ a b d♭ d e | |
| b d♭ d e g♭ g a | |
| e g♭ g a b c d |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment