perlで音楽


 試行錯誤しています。音のファイルは、mp3に変換しています。

 ピアノの鍵盤。CSSで作成されます。鍵盤のクリックやキーボードで演奏が出来ます。

 なんでmidi-perl と思われそう。動画に音楽を付けたいと思い、曲を自作できればと思った。それでperlで楽譜が書けないかと「perl midi」で検索。midi-perlがあることが分かる。でも、midi-perlをインストールしないと「midi」用のperl scriptが動かない。それで、midi-perlをインストールする。

 コマンドプロンプトを開き、perlがインストールされている先頭のディレクトリーで、

ppm install MIDI-Perl

でMIDI-Perlがインストールされて、"use MIDI;"が使えるようになった。

 インストールされたMIDI.pmを読み、記述してあるスクリプトファイルを実行してみた。
  1. use MIDI::Simple;
  2. new_score;
  3. text_event ' comment';
  4. text_event ' comment';
  5. set_tempo 500000; # 1 qn =.5 seconds (500,000 microseconds)
  6. patch_change 1, 8; # Patch 8 = Celesta
  7. noop c1, f, o5; # Setup
  8. # Now play
  9. n qn, Cs; n F; n Ds; n hn, Gs_d1;
  10. n qn, Cs; n Ds; n F; n hn, Cs;
  11. n qn, F; n Cs; n Ds; n hn, Gs_d1;
  12. n qn, Gs_d1; n Ds; n F; n hn, Cs;
  13. write_score 'westmister_chimes.mid';
  14. dump_score 'westmister_chimes.mid';

 。もしも、曲-1が鳴らない時は曲-2を押して下さい。。midファイルですので、Final Note Pad などの楽譜作成ソフトで作成された曲を確認、試聴できます。
スクリプトの説明
3、4行目、オリジナルとは異なるがここにコメントや著作権者名を記入できる。
5行目は演奏のテンポを指定する。ここでは、4分音符を0.5秒。
6行目のpatch_change 1, 8とあり、1は、チャンネル番号。次の8は音色の番号。8はCelestaを表す。音色は、128種類あり、16グループに分けられている。対応する楽器や実際の音などを音色の一覧を示した。

 8行目のnoopの次のc1はチャンネル番号が1を、次のfは音量を表す。値は1~127。音量は次のような記号が使用され、記号と音量の関係を次に示す。なお、数値で表す場合は、数値の前に大文字のVを付けて書く。
記号音量 名 称
ppp1pianississimo
pp12pianissimo
p24piano
mp48mezzopiano
m64mezzo/medio/meta/middle/whatever
mezzo64
mf80mezzoforte
f96forte
ff112fortissimo
fff127fortississimo

 次のo5は、音階(octave)を表す。音階は0~10まである。
 次の10行目は、音符を表している。nは、note(音符)。qnは、四分音符を表す。
wn は全音符、hn は2分音符、en は8分音符、sn は16分音符である。d は府点。4分お音符を1とすると各記号の長さは、次のようになる。
記号長さ記号長さ記号長さ記号長さ
wn 4dwn6ddwn7twn(8/3)
hn 2dhn3ddhn3.5thn(4/3)
qn 1dqn1.5ddqn1.75tqn(2/3)
en.5den.75dden.875ten(1/3)
sn.25dsn.375ddsn.4375tsn(1/6)

次のCs のCはドを、s はsharpを表す。音名は、C、D、E、F、G、A、Bで表され、Cはド、Dはレ、Eはミ、Fはファ、Gはソ、Aはラ、Bはシを表す。
音名記号
ファ

 音は、全部で128個あり、次のようになる。数値は、オクターブを表し、s はシャープ、ピアノで黒の鍵盤に対応。各音色で128種類の音を出すことはできるが、本物の楽器では出ない音やmidiで推薦されている音域があるようです。ボタンをクリックすると反応は鈍いですが音がでます。音はピアノです。なお、Ç0~B1、Cs9~G10までは省略。
C2
Cs2
D2
Ds2
E2
F2
Fs2
G2
Gs2
A2
As2
B2
C3
Cs3
D3
Ds3
E3
F3
Fs3
G3
Gs3
A3
As3
B3
C4
Cs4
D4
Ds4
E4
F4
Fs4
G4
Gs4
A4
As4
B4
C5
Cs5
D5
Ds5
E5
F5
Fs5
G5
Gs5
A5
As5
B5
C6
Cs6
D6
Ds6
E6
F6
Fs6
G6
Gs6
A6
As6
B6
C7
Cs7
D7
Ds7
E7
F7
Fs7
G7
Gs7
A7
As7
B7
C8
Cs8
D8
Ds8
E8
F8
Fs8
G8
Gs8
A8
As8
B8
C9
(上の表の作成と音の再生の仕方は、Audio でサウンド再生を参考にさせて頂きました。)
音(C、D、E、、、)は、変数での取扱いは、単音だけ(@note=(C,E,D,E,F,G,A,B,C_u1))、和音はできない。音符の長さの変数取扱い可能。

15行目は、作成されたmidiファイルを'westmister_chimes.mid'として書き出すことを表している。
16行目で、作成されたmidiファイルがテキストに変換されたものが、表示される。

 ドラム音も用意されている。ドラム音の一覧

ドラム演奏用のスクリプト例。なお、前述のスクリプトでは、1行目、use MIDIの後に Simple があり、音名記号(C、D、E、F、、、)でドレミが鳴りましたが、use MIDI では、音名記号は使用できません。
  1. use MIDI;
  2. use strict;
  3. use warnings;
  4. my @events = (
  5. ['text_event',0, 'MORE COWBELL'],
  6. ['set_tempo', 0, 450_000], # 1qn = .45 seconds
  7. );
  8. for (1 .. 20) {
  9. push @events,
  10. ['note_on' , 90, 9, 56, 127],
  11. ['note_off', 6, 9, 56, 127],
  12. ;
  13. }
  14. foreach my $delay (reverse(1..96)) {
  15. push @events,
  16. ['note_on' , 0, 9, 56, 127],
  17. ['note_off', $delay, 9, 56, 127],
  18. ;
  19. }
  20. my $cowbell_track = MIDI::Track->new({ 'events' => \@events });
  21. my $opus = MIDI::Opus->new(
  22. { 'format' => 0, 'ticks' => 96, 'tracks' => [ $cowbell_track ] } );
  23. $opus->write_to_file( 'cowbell.mid' );

スクリプトの説明
11、12行目の9はチャネル番号。ドラム音は9に割り当てられている。56は、音色の" cowbell "。127は最大音量。11行目の90は、約4分休符分後にcowbellを鳴らす。12行目の6は11行目の音を消音するまでの時間。
15行目から20行目までで、ベルを4分音符で鳴らし、徐々にベルの鳴る間隔が速くなる。
18行目の$delayで、各値が変数で取り扱えそうだと想像できる。



 準備は出来た。後は音を出すだけ。
このページへの訪問者数

(since 2015/Sep/23)

音のファイルは無断では使用しないで下さい。

メール

(2015年9月23日掲載。2020年1月7日更新)
Copyright 2015-19. MiKe All rights reserved.