简体   繁体   English

生成正确的音调频率值

[英]Generating correct pitch frequency values

I have written a perl script to generate a list of note information entries to be used in a C++ header. 我已经编写了一个perl脚本来生成要在C ++标头中使用的注释信息条目的列表。 The script contains contains the following: 该脚本包含以下内容:

#!/bin/perl
use strict;
use warnings;

my @NOTES = ( "C" , "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" );

#2*(x/12)
my @CF_VALUES = (1, 1.0594630943592953, 1.122462048309373, 1.189207115002721, 1.2599210498948732, 1.3348398541700344, 1.4142135623730951, 1.4983070768766815, 1.5874010519681994, 1.681792830507429, 1.7817974362806785, 1.8877486253633868);

my @START_FREQS = (27.5,55,110,220,440,880,1760,3520,7040);

my $FREQUENCY = 0;
my $OCTAVE;
my $KEY;
my $INDEX = 12;

print "static const MidiNote_t Notes[" . 8 * 12 . "] = {\n";

#4 times

for ($OCTAVE=0; $OCTAVE<=8; $OCTAVE++)
{
    for ($KEY=0; $KEY<12; $KEY++)
    {
        print "\t{ $INDEX, \"" . @NOTES[$KEY] . $OCTAVE . "\", " . @START_FREQS[$OCTAVE] * @CF_VALUES[$KEY] .  " }";
        if ($KEY == 11 && $OCTAVE == 8) {
            print "\n};";
        } else {
            print ",\n";
        }
        $INDEX++;
    }
}

And the generated output looks like this: 生成的输出如下所示:

static const MidiNote_t Notes[96] = {
        { 12, "C0", 13.75 },
        { 13, "C#0", 14.5676175474403 },
        { 14, "D0", 15.4338531642539 },
        { 15, "D#0", 16.3515978312874 },
        { 16, "E0", 17.3239144360545 },
        { 17, "F0", 18.354047994838 },
        { 18, "F#0", 19.4454364826301 },
        { 19, "G0", 20.6017223070544 },
        { 20, "G#0", 21.8267644645627 },
        { 21, "A0", 23.1246514194772 },
        { 22, "A#0", 24.4997147488593 },
        { 23, "B0", 25.9565435987466 },
        { 24, "C1", 27.5 },
        { 25, "C#1", 29.1352350948806 },
...

Although, I cannot seem to get the resulting frequencies in the list generated by my script, to align with the base 'A' frequencies. 虽然,我似乎无法在脚本生成的列表中得到与最终的“ A”频率一致的频率。

For example, A4 should correspond to 440 Hz, and A0 should be 27.5 Hz. 例如,A4应对应于440 Hz,而A0应为27.5 Hz。

How can I align the frequencies properly and multiply each note in each octave with its respective base A note frequency? 如何正确对齐频率,并将每个八度音阶中的每个音符乘以其各自的基本A音符频率?

Your program is expecting the values in @START_FREQS to be the C frequencies, and not the A frequencies. 您的程序期望@START_FREQS的值是C频率,而不是A频率。 We can modify the value printed to be based on the A be dividing everything on the A changer like this: 我们可以通过修改打印到立足于价值A是将一切都在A像这样的转换:

print "\\t{ $INDEX, \\"" . $NOTES[$KEY] . $OCTAVE . "\\", " . $START_FREQS[$OCTAVE] * $CF_VALUES[$KEY] / $CF_VALUES[9] . " }";

This would be the whole program: 这将是整个程序:

#!/bin/perl
use strict;
use warnings;

my @NOTES = ( "C" , "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" );

#2*(x/12)
my @CF_VALUES = (1, 1.0594630943592953, 1.122462048309373, 1.189207115002721, 1.2599210498948732, 1.3348398541700344, 1.4142135623730951, 1.4983070768766815, 1.5874010519681994, 1.681792830507429, 1.7817974362806785, 1.8877486253633868);

my @START_FREQS = (27.5,55,110,220,440,880,1760,3520,7040);

my $FREQUENCY = 0;
my $OCTAVE;
my $KEY;
my $INDEX = 12;

print "static const MidiNote_t Notes[" . 8 * 12 . "] = {\n";

#4 times

for ($OCTAVE=0; $OCTAVE<=8; $OCTAVE++)
{
    for ($KEY=0; $KEY<12; $KEY++)
    {
        print "\t{ $INDEX, \"" . $NOTES[$KEY] . $OCTAVE . "\", " . $START_FREQS[$OCTAVE] * $CF_VALUES[$KEY] / $CF_VALUES[9] .  " }";
        if ($KEY == 11 && $OCTAVE == 8) {
            print "\n};";
        } else {
            print ",\n";
        }
        $INDEX++;
    }
}

Gives this output: 给出以下输出:

 static const MidiNote_t Notes[96] = {
      { 12, "C0", 16.3515978312874 },
      { 13, "C#0", 17.3239144360545 },
      { 14, "D0", 18.354047994838 },
      { 15, "D#0", 19.4454364826301 },
      { 16, "E0", 20.6017223070544 },
      { 17, "F0", 21.8267644645627 },
      { 18, "F#0", 23.1246514194772 },
      { 19, "G0", 24.4997147488593 },
      { 20, "G#0", 25.9565435987466 },
      { 21, "A0", 27.5 },
      { 22, "A#0", 29.1352350948806 },
      { 23, "B0", 30.8677063285078 },
      { 24, "C1", 32.7031956625748 },
      { 25, "C#1", 34.647828872109 },
      { 26, "D1", 36.7080959896759 },
      { 27, "D#1", 38.8908729652601 },
      { 28, "E1", 41.2034446141087 },
      { 29, "F1", 43.6535289291255 },
      { 30, "F#1", 46.2493028389543 },
      { 31, "G1", 48.9994294977187 },
      { 32, "G#1", 51.9130871974931 },
      { 33, "A1", 55 },
      { 34, "A#1", 58.2704701897612 },
      { 35, "B1", 61.7354126570155 },
      { 36, "C2", 65.4063913251497 },
      { 37, "C#2", 69.295657744218 },
      { 38, "D2", 73.4161919793519 },
      { 39, "D#2", 77.7817459305202 },
      { 40, "E2", 82.4068892282175 },
      { 41, "F2", 87.307057858251 },
      { 42, "F#2", 92.4986056779086 },
      { 43, "G2", 97.9988589954373 },
      { 44, "G#2", 103.826174394986 },
      { 45, "A2", 110 },
      { 46, "A#2", 116.540940379522 },
      { 47, "B2", 123.470825314031 },
      { 48, "C3", 130.812782650299 },
      { 49, "C#3", 138.591315488436 },
      { 50, "D3", 146.832383958704 },
      { 51, "D#3", 155.56349186104 },
      { 52, "E3", 164.813778456435 },
      { 53, "F3", 174.614115716502 },
      { 54, "F#3", 184.997211355817 },
      { 55, "G3", 195.997717990875 },
      { 56, "G#3", 207.652348789973 },
      { 57, "A3", 220 },
      { 58, "A#3", 233.081880759045 },
      { 59, "B3", 246.941650628062 },
      { 60, "C4", 261.625565300599 },
      { 61, "C#4", 277.182630976872 },
      { 62, "D4", 293.664767917408 },
      { 63, "D#4", 311.126983722081 },
      { 64, "E4", 329.62755691287 },
      { 65, "F4", 349.228231433004 },
      { 66, "F#4", 369.994422711634 },
      { 67, "G4", 391.995435981749 },
      { 68, "G#4", 415.304697579945 },
      { 69, "A4", 440 },
      { 70, "A#4", 466.16376151809 },
      { 71, "B4", 493.883301256124 },
      { 72, "C5", 523.251130601197 },
      { 73, "C#5", 554.365261953744 },
      { 74, "D5", 587.329535834815 },
      { 75, "D#5", 622.253967444162 },
      { 76, "E5", 659.25511382574 },
      { 77, "F5", 698.456462866008 },
      { 78, "F#5", 739.988845423269 },
      { 79, "G5", 783.990871963499 },
      { 80, "G#5", 830.60939515989 },
      { 81, "A5", 880 },
      { 82, "A#5", 932.32752303618 },
      { 83, "B5", 987.766602512248 },
      { 84, "C6", 1046.50226120239 },
      { 85, "C#6", 1108.73052390749 },
      { 86, "D6", 1174.65907166963 },
      { 87, "D#6", 1244.50793488832 },
      { 88, "E6", 1318.51022765148 },
      { 89, "F6", 1396.91292573202 },
      { 90, "F#6", 1479.97769084654 },
      { 91, "G6", 1567.981743927 },
      { 92, "G#6", 1661.21879031978 },
      { 93, "A6", 1760 },
      { 94, "A#6", 1864.65504607236 },
      { 95, "B6", 1975.5332050245 },
      { 96, "C7", 2093.00452240479 },
      { 97, "C#7", 2217.46104781498 },
      { 98, "D7", 2349.31814333926 },
      { 99, "D#7", 2489.01586977665 },
      { 100, "E7", 2637.02045530296 },
      { 101, "F7", 2793.82585146403 },
      { 102, "F#7", 2959.95538169308 },
      { 103, "G7", 3135.96348785399 },
      { 104, "G#7", 3322.43758063956 },
      { 105, "A7", 3520 },
      { 106, "A#7", 3729.31009214472 },
      { 107, "B7", 3951.06641004899 },
      { 108, "C8", 4186.00904480958 },
      { 109, "C#8", 4434.92209562995 },
      { 110, "D8", 4698.63628667852 },
      { 111, "D#8", 4978.03173955329 },
      { 112, "E8", 5274.04091060592 },
      { 113, "F8", 5587.65170292806 },
      { 114, "F#8", 5919.91076338615 },
      { 115, "G8", 6271.92697570799 },
      { 116, "G#8", 6644.87516127912 },
      { 117, "A8", 7040 },
      { 118, "A#8", 7458.62018428944 },
      { 119, "B8", 7902.13282009799 }
 };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM