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

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

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

すのものの「純正律について」(その1)』 で示した表のうち、最も大きいものについて、 mml で用いるピッチベンドの書き方 BWn(n は十進表記された整数)の n の値を表にしたものである。 小数点以下は(ほぼ)四捨五入してある。 ここでは、最初にとった C は BW8192 とした。 これは、ピッチベンドをしない、に等しい。

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

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

### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ###
  Hisis
904
 
Gisis
1465
Disis
1545
Aisis
1625
Eisis
1705
Hisis
1785
 
  His
2106
Fisis
2186
Cisis
2266
Gisis
2346
Disis
2426
Aisis
2506
Eisis
2586
Hisis
2666
 
Gis
2666
Dis
2746
Ais
2826
Eis
2907
His
2987
Fisis
3067
Cisis
3147
Gisis
3227
Disis
3307
Aisis
3387
Eisis
3467
Hisis
3547
 
  H
3307
Fis
3387
Cis
3467
Gis
3547
Dis
3627
Ais
3707
Eis
3787
His
3868
Fisis
3948
Cisis
4028
Gisis
4108
Disis
4188
Aisis
4268
Eisis
4348
Hisis
4428
 
G
3868
D
3948
A
4028
E
4108
H
4188
Fis
4268
Cis
4348
Gis
4428
Dis
4508
Ais
4588
Eis
4668
His
4748
Fisis
4829
Cisis
4909
Gisis
4989
Disis
5069
Aisis
5149
Eisis
5229
Hisis
5309
 
  B
4508
F
4588
C
4668
G
4748
D
4829
A
4909
E
4989
H
5069
Fis
5149
Cis
5229
Gis
5309
Dis
5389
Ais
5469
Eis
5549
His
5629
Fisis
5709
Cisis
5789
Gisis
5870
Disis
5950
Aisis
6030
Eisis
6110
Hisis
6190
 
Ges
5069
Des
5149
As
5229
Es
5309
B
5389
F
5469
C
5549
G
5629
D
5709
A
5790
E
5870
H
5950
Fis
6030
Cis
6110
Gis
6190
Dis
6270
Ais
6350
Eis
6430
His
6510
Fisis
6590
Cisis
6670
Gisis
6750
Disis
6831
Aisis
6911
Eisis
6991
Hisis
7071
 
  Bes
5710
Fes
5790
Ces
5870
Ges
5950
Des
6030
As
6110
Es
6190
B
6270
F
6350
C
6430
G
6510
D
6590
A
6670
E
6751
H
6831
Fis
6911
Cis
6991
Gis
7071
Dis
7151
Ais
7231
Eis
7311
His
7391
Fisis
7471
Cisis
7551
Gisis
7631
Disis
7711
Aisis
7792
Eisis
7872
Hisis
7952
 
Geses
6270
Deses
6350
Ases
6430
Eses
6510
Bes
6590
Fes
6670
Ces
6751
Ges
6831
Des
6911
As
6991
Es
7071
B
7151
F
7231
C
7311
G
7391
D
7471
A
7551
E
7631
H
7711
Fis
7792
Cis
7872
Gis
7952
Dis
8032
Ais
8112
Eis
8192
His
8272
Fisis
8352
Cisis
8432
Gisis
8512
Disis
8592
Aisis
8672
Eisis
8752
Hisis
8833
 
  Beses
6911
Feses
6991
Ceses
7071
Geses
7151
Deses
7231
Ases
7311
Eses
7391
Bes
7471
Fes
7551
Ces
7631
Ges
7712
Des
7792
As
7872
Es
7952
B
8032
F
8112
C
8192
G
8272
D
8352
A
8432
E
8512
H
8592
Fis
8672
Cis
8753
Gis
8833
Dis
8913
Ais
8993
Eis
9073
His
9153
Fisis
9233
Cisis
9313
Gisis
9393
Disis
9473
Aisis
9553
Eisis
9633
Hisis
9713
 
  Beses
7792
Feses
7872
Ceses
7952
Geses
8032
Deses
8112
Ases
8192
Eses
8272
Bes
8352
Fes
8432
Ces
8512
Ges
8592
Des
8673
As
8753
Es
8833
B
8913
F
8993
C
9073
G
9153
D
9233
A
9313
E
9393
H
9473
Fis
9553
Cis
9633
Gis
9714
Dis
9794
Ais
9874
Eis
9954
His
10034
Fisis
10114
Cisis
10194
Gisis
10274
Disis
10354
  Beses
8673
Feses
8753
Ceses
8833
Geses
8913
Deses
8993
Ases
9073
Eses
9153
Bes
9233
Fes
9313
Ces
9393
Ges
9473
Des
9553
As
9633
Es
9714
B
9794
F
9874
C
9954
G
10034
D
10114
A
10194
E
10274
H
10354
Fis
10434
Cis
10514
Gis
10594
Dis
10674
Ais
10755
Eis
10835
His
10915
 
  Beses
9553
Feses
9634
Ceses
9714
Geses
9794
Deses
9874
Ases
9954
Eses
10034
Bes
10114
Fes
10194
Ces
10274
Ges
10354
Des
10434
As
10514
Es
10594
B
10675
F
10755
C
10835
G
10915
D
10995
A
11075
E
11155
H
11235
Fis
11315
Cis
11395
Gis
11475
Dis
11555
  Beses
10434
Feses
10514
Ceses
10595
Geses
10675
Deses
10755
Ases
10835
Eses
10915
Bes
10995
Fes
11075
Ces
11155
Ges
11235
Des
11315
As
11395
Es
11475
B
11555
F
11636
C
11716
G
11796
D
11876
A
11956
E
12036
H
12116
 
  Beses
11315
Feses
11395
Ceses
11475
Geses
11555
Deses
11636
Ases
11716
Eses
11796
Bes
11876
Fes
11956
Ces
12036
Ges
12116
Des
12196
As
12276
Es
12356
B
12436
F
12516
C
12596
G
12677
D
12757
  Beses
12196
Feses
12276
Ceses
12356
Geses
12436
Deses
12516
Ases
12597
Eses
12677
Bes
12757
Fes
12837
Ces
12917
Ges
12997
Des
13077
As
13157
Es
13237
B
13317
 
  Beses
13077
Feses
13157
Ceses
13237
Geses
13317
Deses
13397
Ases
13477
Eses
13558
Bes
13638
Fes
13718
Ces
13798
Ges
13878
Des
13958
  Beses
13958
Feses
14038
Ceses
14118
Geses
14198
Deses
14278
Ases
14358
Eses
14438
Bes
14518
 
  Beses
14839
Feses
14919
Ceses
14999
Geses
15079
Deses
15159
  Beses
15720
 

上の表は、C言語による次のプログラムに出力させた。 これは、 『すのものの「純正律について」(その2)』 に載せたプログラムのごく一部のみを変更したものである。 文がコメントになっている行が三行あるが、 最初の二行は「その2」にあったものをコメント化したものであり、 最後の一行は、「その3」で示したプログラムで使われた行である。

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

#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 + 8192);
            }
        }
        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