すのものの「純正律について」(その5)

※ 検索エンジンから直接このページに来られたかたには、まず 『すのものの「純正律について」』 をお読みになることをおすすめします。

※ これは、ピッチベンドが 100/4096 セント単位でかかると仮定した場合のものである。 実際の PC ではピッチベンドは 1 セント単位でしかかからないので、 「すのものの「純正律について」(その8)」 を利用することをおすすめする。

すのものの「純正律について」(その1)』 で示した表のうち、最も大きいものについて、 mml で用いるピッチベンドの相対指定による書き方 BW+n または BW-n(n は十進表記された整数)の +n, -n の値を表にしたものである。 小数点以下は(ほぼ)四捨五入してある。

左上にゆくほど値が小さく、右下にゆくほど値が大きくなる。 「その3」で、ピッチベンドの幅が ±200 セント、 すなわち平均律の全音以上になっている音はない、 と観察したことに対応して、 ここでの数値は mml の規格で許される範囲に収まっていると思われる。 (規則を知らないので正確なことは言えない。)

また、「その3」で、 最初にとった C からみて完全五度さがることを七回おこなった音 Ces の長三度下の音 Ases は周波数比 0.001280 と非常に 0 に近いことを観察したが、 ここでは、最初にとった C と同じく、+0 となった。 なお、この位置関係にあるすべてのペアについて、 表の中の数値が同じというわけではない。

### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ###
  Hisis
-7288
 
Gisis
-6727
Disis
-6647
Aisis
-6567
Eisis
-6487
Hisis
-6407
 
  His
-6086
Fisis
-6006
Cisis
-5926
Gisis
-5846
Disis
-5766
Aisis
-5686
Eisis
-5606
Hisis
-5526
 
Gis
-5526
Dis
-5446
Ais
-5366
Eis
-5285
His
-5205
Fisis
-5125
Cisis
-5045
Gisis
-4965
Disis
-4885
Aisis
-4805
Eisis
-4725
Hisis
-4645
 
  H
-4885
Fis
-4805
Cis
-4725
Gis
-4645
Dis
-4565
Ais
-4485
Eis
-4405
His
-4324
Fisis
-4244
Cisis
-4164
Gisis
-4084
Disis
-4004
Aisis
-3924
Eisis
-3844
Hisis
-3764
 
G
-4324
D
-4244
A
-4164
E
-4084
H
-4004
Fis
-3924
Cis
-3844
Gis
-3764
Dis
-3684
Ais
-3604
Eis
-3524
His
-3444
Fisis
-3363
Cisis
-3283
Gisis
-3203
Disis
-3123
Aisis
-3043
Eisis
-2963
Hisis
-2883
 
  B
-3684
F
-3604
C
-3524
G
-3444
D
-3363
A
-3283
E
-3203
H
-3123
Fis
-3043
Cis
-2963
Gis
-2883
Dis
-2803
Ais
-2723
Eis
-2643
His
-2563
Fisis
-2483
Cisis
-2403
Gisis
-2322
Disis
-2242
Aisis
-2162
Eisis
-2082
Hisis
-2002
 
Ges
-3123
Des
-3043
As
-2963
Es
-2883
B
-2803
F
-2723
C
-2643
G
-2563
D
-2483
A
-2402
E
-2322
H
-2242
Fis
-2162
Cis
-2082
Gis
-2002
Dis
-1922
Ais
-1842
Eis
-1762
His
-1682
Fisis
-1602
Cisis
-1522
Gisis
-1442
Disis
-1361
Aisis
-1281
Eisis
-1201
Hisis
-1121
 
  Bes
-2482
Fes
-2402
Ces
-2322
Ges
-2242
Des
-2162
As
-2082
Es
-2002
B
-1922
F
-1842
C
-1762
G
-1682
D
-1602
A
-1522
E
-1441
H
-1361
Fis
-1281
Cis
-1201
Gis
-1121
Dis
-1041
Ais
-961
Eis
-881
His
-801
Fisis
-721
Cisis
-641
Gisis
-561
Disis
-481
Aisis
-400
Eisis
-320
Hisis
-240
 
Geses
-1922
Deses
-1842
Ases
-1762
Eses
-1682
Bes
-1602
Fes
-1522
Ces
-1441
Ges
-1361
Des
-1281
As
-1201
Es
-1121
B
-1041
F
-961
C
-881
G
-801
D
-721
A
-641
E
-561
H
-481
Fis
-400
Cis
-320
Gis
-240
Dis
-160
Ais
-80
Eis
-0
His
+80
Fisis
+160
Cisis
+240
Gisis
+320
Disis
+400
Aisis
+480
Eisis
+560
Hisis
+641
 
  Beses
-1281
Feses
-1201
Ceses
-1121
Geses
-1041
Deses
-961
Ases
-881
Eses
-801
Bes
-721
Fes
-641
Ces
-561
Ges
-480
Des
-400
As
-320
Es
-240
B
-160
F
-80
C
+0
G
+80
D
+160
A
+240
E
+320
H
+400
Fis
+480
Cis
+561
Gis
+641
Dis
+721
Ais
+801
Eis
+881
His
+961
Fisis
+1041
Cisis
+1121
Gisis
+1201
Disis
+1281
Aisis
+1361
Eisis
+1441
Hisis
+1521
 
  Beses
-400
Feses
-320
Ceses
-240
Geses
-160
Deses
-80
Ases
+0
Eses
+80
Bes
+160
Fes
+240
Ces
+320
Ges
+400
Des
+481
As
+561
Es
+641
B
+721
F
+801
C
+881
G
+961
D
+1041
A
+1121
E
+1201
H
+1281
Fis
+1361
Cis
+1441
Gis
+1522
Dis
+1602
Ais
+1682
Eis
+1762
His
+1842
Fisis
+1922
Cisis
+2002
Gisis
+2082
Disis
+2162
  Beses
+481
Feses
+561
Ceses
+641
Geses
+721
Deses
+801
Ases
+881
Eses
+961
Bes
+1041
Fes
+1121
Ces
+1201
Ges
+1281
Des
+1361
As
+1441
Es
+1522
B
+1602
F
+1682
C
+1762
G
+1842
D
+1922
A
+2002
E
+2082
H
+2162
Fis
+2242
Cis
+2322
Gis
+2402
Dis
+2482
Ais
+2563
Eis
+2643
His
+2723
 
  Beses
+1361
Feses
+1442
Ceses
+1522
Geses
+1602
Deses
+1682
Ases
+1762
Eses
+1842
Bes
+1922
Fes
+2002
Ces
+2082
Ges
+2162
Des
+2242
As
+2322
Es
+2402
B
+2483
F
+2563
C
+2643
G
+2723
D
+2803
A
+2883
E
+2963
H
+3043
Fis
+3123
Cis
+3203
Gis
+3283
Dis
+3363
  Beses
+2242
Feses
+2322
Ceses
+2403
Geses
+2483
Deses
+2563
Ases
+2643
Eses
+2723
Bes
+2803
Fes
+2883
Ces
+2963
Ges
+3043
Des
+3123
As
+3203
Es
+3283
B
+3363
F
+3444
C
+3524
G
+3604
D
+3684
A
+3764
E
+3844
H
+3924
 
  Beses
+3123
Feses
+3203
Ceses
+3283
Geses
+3363
Deses
+3444
Ases
+3524
Eses
+3604
Bes
+3684
Fes
+3764
Ces
+3844
Ges
+3924
Des
+4004
As
+4084
Es
+4164
B
+4244
F
+4324
C
+4404
G
+4485
D
+4565
  Beses
+4004
Feses
+4084
Ceses
+4164
Geses
+4244
Deses
+4324
Ases
+4405
Eses
+4485
Bes
+4565
Fes
+4645
Ces
+4725
Ges
+4805
Des
+4885
As
+4965
Es
+5045
B
+5125
 
  Beses
+4885
Feses
+4965
Ceses
+5045
Geses
+5125
Deses
+5205
Ases
+5285
Eses
+5366
Bes
+5446
Fes
+5526
Ces
+5606
Ges
+5686
Des
+5766
  Beses
+5766
Feses
+5846
Ceses
+5926
Geses
+6006
Deses
+6086
Ases
+6166
Eses
+6246
Bes
+6326
 
  Beses
+6647
Feses
+6727
Ceses
+6807
Geses
+6887
Deses
+6967
  Beses
+7528
 

上の表は、C言語による次のプログラムに出力させた。 これは、 『すのものの「純正律について」(その4)』 に載せたプログラムのごく一部のみを変更したものである。

付)以下のプログラムは、LICO の値を変えてコンパイルすると正しい結果が得られなかったバグを、 2010-06-22 (3) に修正したものである。

#include <stdio.h>
#include <math.h>   /* log10, floor */

#define LIN 21  /* 行の数(変えるとプログラム自体にも手直しが必要) */
#define COL 74  /* 列の数(変えるとプログラム自体にも手直しが必要) */
#define LI  10  /* 周波数 1 を何行めにおくか(変えてよい) */
#define CO  33  /* 周波数 1 を何列めにおくか(変えてよい) */

double val[2];  /* 分子、分母 */

char* name[] = {"Beses",
                "Feses", "Ceses", "Geses", "Deses", "Ases", "Eses", "Bes", \
                "Fes", "Ces", "Ges", "Des", "As", "Es", "B", \
                "F", "C", "G", "D", "A", "E", "H", \
                "Fis", "Cis", "Gis", "Dis", "Ais", "Eis", "His", \
                "Fisis", "Cisis", "Gisis", "Disis", "Aisis", "Eisis", "Hisis" };

char* color[] = { "ffffdd", "eeddff", "ddffdd", "ffddee", "ddffff", "ffeedd", \
                  "ddddff", "eeffdd", "ffddff", "ddffee", "ffdddd", "ddeeff" };
        /* (平均律で)As, Es, B, F, C, G; D, A, E, H, Fis, Cis の地の色(変えてよい) */

void standardize(double* a);
double power(double base, int n);

main() {
    int i, j, n;
    double bend;    /* 半音を 1 としたときの値 */

    printf("<html><body>\n<table border=\"1\">\n");
    printf("<tr>\n");
    for (j = 0; j < COL; j++) {
        printf("\t<td><font color=\"white\">###</font></td>\n");
    }
    printf("</tr>\n");
    for (i = 0; i < LIN; i++) {
        printf("<tr align=\"center\">\n");
        if (i <= LIN / 2) {
            if (i % 2 == 0) {
                printf("\t<td>&nbsp;</td>\n"); j = 1;
            } else {
                j = 0;
            }
        } else {
            printf("\t<td colspan=\"%d\">&nbsp;</td>\n", 7*i - COL + 5); j = 7*i - COL + 5;
        }

        for (   ; j < 7*i + 2 && j < COL - 1; j += 2) {
            if (i <= LI) {
                val[0] = power(5, LI - i); val[1] = 1;
            } else {
                val[0] = 1; val[1] = power(5, i - LI);
            }
            if (i + j < LI + CO) {
                val[1] *= power(3, ((LI + CO) - (i + j) + 1)/2);
            } else {
                val[0] *= power(3, ((i + j) - (LI + CO))/2);
            }
            n = 35 - (7*i+1)/2 + j/2;           /* この値で音名が決まる */
            standardize(val);
            printf("\t<td colspan=\"2\" bgcolor=\"#%s\">", color[n%12]);
/*          printf("%s<br>%.0f/%.0f<br>", name[n], val[0], val[1]);     */
/*          printf("%f</td>\n", log10(val[0]/val[1])/log10(2)*1200);    */
            printf("%s<br>", name[n]);

            bend = log10(val[0]/val[1])/log10(2)*12 - (7*n+7*(COL-CO)/2+4*LI+5)%12;
            if (bend > 6) {
                bend -= 12;	/* Cis の 120 セント下、など */
            } else if (bend < -6) {
                bend += 12;     /* H の 120 セント上、など */
            }
            if (bend <= -2 || bend >= 2) {
                printf("-</td>\n");
            } else {
/*              printf("%f</td>\n", bend*100); */
                printf("%+.0f</td>\n", bend * 4096);
            }
        }
        if (j <= COL-1) {
            if (COL-1-j > 1) {
                printf("\t<td colspan=\"%d\">&nbsp;</td>\n", COL-j);
            } else {
                printf("\t<td>&nbsp;</td>\n");
            }
        }
        printf("</tr>\n");
    }
    printf("</table>\n");
}


/* a[] を分数とみたとき、1 以上 2 未満に規格化する */
void standardize(double* a) {
    while (a[0] < a[1]) {
        if (floor(a[1] / 2) == a[1] / 2) {
            a[1] /= 2;
        } else {
            a[0] *= 2;
        }
    }
    while (a[0] / 2 >= a[1]) {
        if (floor(a[0] / 2) == a[0] / 2) {
            a[0] /= 2;
        } else {
            a[1] *= 2;
        }
    }
}


/* base の n 乗を返す。K&R2 にあるのとほぼ同じ */
double power(double base, int n) {
    int i;
    double p;

    p = 1;
    for (i = 0; i < n; i++) {
        p *= base;
    }
    return p;
}


すのもの Sunomono