ハノンの『60の練習曲によるヴィルトゥオーゾ・ピアニスト』はピアノの指の練習に使われます。機械的にスケールを上下する曲で構成されていますがこれを実装したいと思います。
第一番について
練習曲の第一番は以下のようになっています。
右と左でオクターブ違いで同じ音を弾いていきます。左側の小節は一回弾いたら鍵盤を一つ上にずらして同じように弾きます。上に上がりながら合計14回弾いたら右の小節に移ります。
左の小節は弾いたら一つ下に下がります。下がるほうは15回弾いて左小節最初のCで終わります。
演奏するすべての音を一つずつプログラムするのであれば時間はかかりますがJava+MIDIで演奏させることができます。でもここでは少し趣向を変えフルートで演奏させたいと思います。フルートは単音楽器なのでピアノの右手側のみ演奏することにして、フルートの音域に合わせて1オクターブ上げることにします。最初の音はノート番号60になります。
音程の一覧
使う音程を一覧にします。まず左側の小節です。基準とオクターブは60と0にして音程だけ変えていきます。いわゆる「一度」は音程の0になるので注意してください。
音を上げていくときには音程を上げていくことになります。最初はドから始まっていますが音程に1を足すとレから始まります。仮に基準に1を足してしまうと調はCメジャーではなくC♯メジャーになってしまいます。
1. 基準 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
---|---|---|---|---|---|---|---|---|
2. オクターブ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3. 音程 | 0 | 2 | 3 | 4 | 5 | 4 | 3 | 2 |
出力ノート番号 | 60 | 64 | 65 | 67 | 69 | 67 | 65 | 64 |
右側の小節です。基準とオクターブは60と2にしていますが84と0と考えてもよいでしょう。音程を1ずつ減らしていくことで下にずらしていくことができます。
1. 基準 | 60 | 60 | 60 | 60 | 60 | 60 | 60 | 60 |
---|---|---|---|---|---|---|---|---|
2. オクターブ | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
3. 音程 | 4 | 2 | 1 | 0 | -1 | 0 | 1 | 2 |
出力ノート番号 | 91 | 88 | 86 | 84 | 83 | 84 | 86 | 88 |
実装
実装内容が決まったところで実装に入ります。音階クラスを利用して実装したいと思います。まずは音階クラスのインスタンスを作ります。
Scale scale = new Scale(0, 2, 4, 5, 7, 9, 11);
引数として半音階単位での音程を指定しています。これでドレミファソラシの音程情報を持つインスタンスができたわけです。次にシーケンスエディターを作ります。トラックは一つ、拍子は二拍子でテンポは80 BPMです。フルートは音色番号73を設定します。
double tempo = 80; SequenceEditor se = new SequenceEditor(1, 2, tempo); se.getTrackEditor(0).setProgram(0, 0, 0, 0, 73);
次にフレーズエディターを作ります。8音まとめて演奏処理を行えるようにします。抑揚をつけるため最初はレガートで後半は少し音を切るようにします。
PhraseEditor pe1 = new PhraseEditor(se) { @Override public void playPhrase(int[] notes) { play(0, 0.00, 0, notes[0], 100, 0.25); play(0, 0.25, 0, notes[1], 90, 0.25); play(0, 0.50, 0, notes[2], 80, 0.25); play(0, 0.75, 0, notes[3], 80, 0.25); play(0, 1.00, 0, notes[4], 80, 0.2); play(0, 1.25, 0, notes[5], 70, 0.2); play(0, 1.50, 0, notes[6], 70, 0.2); play(0, 1.75, 0, notes[7], 70, 0.2); } };
次回に続きます。