MIDI-Perl-0.8 > MIDI


MIDI - read, compose, modify, and write MIDI files

MIDI - MIDIファイルの読み込み、作成、修正、書き出し


 use MIDI;
 $chimes_track = MIDI::Track->new({ 'events' => [
  ['text_event',0, 'www.ely.anglican.org/parishes/camgsm/chimes.html'],
  ['text_event',0, 'Lord through this hour/ be Thou our guide'],
  ['text_event',0, 'so, by Thy power/ no foot shall slide'],
  ['text_event',0, '(coded at ' . scalar(localtime) . ' )'],
  ['patch_change', 0, 1, 8], # Patch 8 = Celesta
  map( (['note_on',0,1,$_->[0],96], ['note_off',$_->[1],1,$_->[0],0]),
     )# [Note,Duration] ==> ['note_on',0,1, N ,96], ['note_off', D ,1, N ,0]
 ] });
 $chimes = MIDI::Opus->new(
  { 'format' => 0, 'ticks' => 96, 'tracks' => [ $chimes_track ] } );


This suite of modules provides routines for reading, composing, modifying, and writing MIDI files.

このモジュールセットは、MIDIファイルの読込・作成・修正・書出を行う ルーチンを提供する。

From FOLDOC (http://wombat.doc.ic.ac.uk/foldoc/):

FOLDOC (http://wombat.doc.ic.ac.uk/foldoc/) から引用:

MIDI, Musical Instrument Digital Interface

<multimedia, file format> (MIDI /mi'-dee/, /mee'-dee/) A hardware specification and protocol used to communicate note and effect information between synthesisers, computers, music keyboards, controllers and other electronic music devices. [...]

MIDI, Musical Instrument Digital Interface

<マルチメディア、ファイルフォーマット> (MIDI 発音はミディ あるいはミィディ) シンセサイザー、コンピューター、ミュージックキーボード、 制御装置、その他の電子音楽機器の間で、音符と効果の情報をやりとりするために 使われるハードウェアの仕様及び、プロトコルのこと。…

The basic unit of information is a "note on/off" event which includes a note number (pitch) and key velocity (loudness). There are many other message types for events such as pitch bend, patch changes and synthesizer-specific events for loading new patches etc.

情報の基本単位はノートナンバー(音階)とキーベロシティ(音の強さ)を含む "ノート オン/オフ"イベント。それ以外にも多くのメッセージタイプがある。 ピッチベンド、パッチチェンジや、新しいパッチをロードするシンセサイザー特有の イベント等々。

There is a file format for expressing MIDI data which is like a dump of data sent over a MIDI port. [...]

MIDIデータを表現するためのファイルフォーマットがある。このデータは MIDIポートへ送られるデータダンプのようなものである。…


The MIDI-Perl suite consists of these modules:


MIDI (which you're looking at), MIDI::Opus, MIDI::Track, MIDI::Event, MIDI::Score, and MIDI::Simple. All of these contain documentation in pod format. You should read all of these pods.

MIDI (あなたが今読んでいる), MIDI::Opus, MIDI::Track, MIDI::Event, MIDI::Score, MIDI::Simple。 これら全てのモジュールにPODドキュメントが含まれている。 全てのPODに目を通してもらいたい。

The order you want to read them in will depend on what you want to do with this suite of modules: if you are focused on manipulating the guts of existing MIDI files, read the pods in the order given above.

ドキュメントを読む順番は、あなたがこのモジュールを使って何をしたいかによって 決まる。もし既存のMIDIファイルの中身を弄繰り回すことに関心があるなら、 上にあげた順番で読めばよい。

But if you aim to compose music with this suite, read this pod, then MIDI::Score and MIDI::Simple, and then skim the rest.

だが、もしこのパッケージを使って作曲をするのが目的なら、 このドキュメントの次にMIDI::ScoreMIDI::Simpleを読んで欲しい。 それから残りはざっと目を通せばよい。

(For your reference, there is also a document in pod format which is not itself an actual module: MIDI::Filespec. It is an old version of the MIDI file specification.)

(参考:パッケージの中にもう一つPODドキュメントがあるが、これは実際には 使われていないモジュールMIDI::Filespecのもの。これはMIDIファイル仕様の 古いバージョンだ。)


This suite of modules is basically object-oriented, with the exception of MIDI::Simple. MIDI opuses ("songs") are represented as objects belonging to the class MIDI::Opus. An opus contains tracks, which are objects belonging to the class MIDI::Track. A track will generally contain a list of events, where each event is a list consisting of a command, a delta-time, and some number of parameters. In other words, opuses and tracks are objects, and the events in a track comprise a LoL (and if you don't know what an LoL is, you must read perllol).

このモジュールパッケージはMIDI::Simpleを除いて基本的にオブジェクト指向である。 MIDIのオプス(ソング)はMIDI::Opusクラスに属するオブジェクトを表す。 一つのオプスはトラックを有する。トラックはMIDI::Trackクラスに属する オブジェクトである。トラックは一般的にイベントリストを含み、各イベントは 命令、デルタタイムや、いくつかのパラメーターで構成されたリストである。 つまり、オプスとトラックはオブジェクトで、トラック内のイベントは LoL(リストのリスト)からなっている(もしもLoLが何なのかわからない 場合はperllolを読むこと)。

Furthermore, for some purposes it's useful to analyze the totality of a track's events as a "score" -- where a score consists of notes where each event is a list consisting of a command, a time offset from the start of the track, and some number of parameters. This is the level of abstraction that MIDI::Score and MIDI::Simple deal with.

さらに、何かの目的でトラックイベント全体を"スコア"として分析すると便利だ。 スコアはノート(音符)から構成される。ノートとはイベントであり、 このイベントはコマンド、トラック開始からの時間経過、そしていくつかの パラメータからなるリストである。 これがMIDI::ScoreとMIDI::Simpleが扱う抽象的なレベルである。

While this suite does provide some functionality accessible only if you're comfortable with various kinds of references, and while there are some options that deal with the guts of MIDI encoding, you can (I hope) get along just fine with just a basic grasp of the MIDI "standard", and a command of LoLs. I have tried, at various points in this documentation, to point out what things are not likely to be of use to the casual user.

もしもあなたが様々な種類のリファレンスに満足した場合にのみ、 このパッケージは使いやすい機能を提供することになる。また、 MIDIエンコードの内幕を扱うためにいくつかの選択肢がある。 "標準"MIDIと、リストのリストを操作する基礎を理解することで 素晴らしい日々を過ごすことができるだろう(と私は望みたい)。 私はこのドキュメントの中の様々な個所で、何がひょっこりやってきた ユーザーにとって役立つようなものではないかを指摘しようと努めてきた。


Maybe have a MIDI cookbook of commonly used short scripts?


A PLEA: Currently this suite can only read/write MIDI data from/to MIDI files. However, it would be desirable to have realtime access to a MIDI device -- at least on systems where a MIDI device (whether thru a hardware port or as a virtual sequencer in a sound card) is accessable as a virtual file (/dev/midi0, /dev/midi, /dev/sequencer, or whatever). However, I have no such MIDI devices (much less ports) at hand for development and testing. But if you have such devices (I'm thinking a Linuxer with a synth hooked to their MIDI port), and if you want to help me experiment with directly accessing them from Perl, then please email me. I already have a pretty good idea of how it should work -- but as always, the proof is as much in the pudding as the devil is in the details.

いいわけ:現在、このパッケージはMIDI ファイルに対してのみ、 MIDIデータの読み書きができる。だがMIDI機器へリアルタイムにアクセス出来た 方が望ましい。少なくともMIDI機器(ハードウェアポートを通じてなのか、 サウンドカードの仮想シーケンサであるかに関係なく)がバーチャルファイル (/dev/midi0/dev/midi/dev/sequencerなど)としてアクセスできる システム上でのアクセスが。 ところが私は開発とテストに利用できるようなMIDI機器を持っていない (いわんやポートをや)。しかしあなたがそのような機器を持っていて (MIDIポートにフックされたシンセを持っているLinux使いの方なら あるのではないかと思う)、かつ、Perlから直接それらの機器にアクセスする実験を 私のためにやってくれるのなら、Eメールを送って頂きたい。 私は既にいかにリアルタイムアクセスを行うかについての素晴らしいアイディアを 持っている。だが世の常で、悪は細部に宿るが如く、証拠はプディングの中に 宿っているのだ[訳補足:プディングの味は食べてみなければわからない。 実際にやってみせるしかないということを言っている]。


The bare module MIDI.pm doesn't do much more than use the necessary component submodules (i.e., all except MIDI::Simple). But it does provide some hashes you might find useful:

単なるモジュールであるMIDI.pmは、必要となるサブモジュール (つまりMIDI::Simple以外全部)をuseする以上のことはしない。とはいえ、 MIDI.pmはいくつかのハッシュを提供する。これはたぶんあなたの役に立つだろう。


%MIDI::number2note correponds MIDI note numbers to a more comprehensible representation (e.g., 68 to 'Gs4', for G-sharp, octave 4); %MIDI::note2number is the reverse. Have a look at the source to see the contents of the hash.

%MIDI::number2noteは、MIDIノートナンバーをより理解しやすい表現 (例:68→'Gs4'…オクターブ4のG#)に対応させる。%MIDI::note2numberは その逆だ。ハッシュの内容を知りたいならソースを一瞥すること。


%MIDI::number2patch correponds General MIDI patch numbers (0 to 127) to English names (e.g., 79 to 'Ocarina'); %MIDI::patch2number is the reverse. Have a look at the source to see the contents of the hash.

%MIDI::number2patchはGMのパッチナンバー(0〜127)を英語名(例:79→'Ocarina') に対応させる。%MIDI::patch2numberはその逆。ハッシュの内容を知りたいなら ソースを一瞥すること。


%MIDI::notenum2percussion correponds General MIDI Percussion Keys to English names (e.g., 56 to 'Cowbell') -- but note that only numbers 35 to 81 (inclusive) are defined; %MIDI::percussion2notenum is the reverse. Have a look at the source to see the contents of the hash.

%MIDI::notenum2percussionはGMのパーカッションキーを英語名に対応させる (例:56→'Cowbell')。ただし定義されている番号は35〜81までだ。 %MIDI::percussion2notenumはその逆。ハッシュの内容を知りたいなら ソースを一瞥すること。


This glossary defines just a few terms, just enough so you can (hopefully) make some sense of the documentation for this suite of modules. If you're going to do anything serious with these modules, however, you should really invest in a good book about the MIDI standard -- see the References.

この用語集は若干の語が定義されている。このモジュールセットのドキュメントを 利用する上で必要な分だけである。だが、あなたがこれらのモジュールを使って それなりのことをやろうというなら、標準MIDIに関する良書で 実際に勉強しなければならない。"参考文献"を参照して欲しい。

channel: a logical channel to which control changes and patch changes apply, and in which MIDI (note-related) events occur.

チャンネル:コントロールチェンジとパッチチェンジ[訳補足:プログラム チェンジともいう]が適用される論理チャンネル。 チャンネル内で(ノートに関わる)MIDIイベントが現れる。

control: one of the various numeric parameters associated with a given channel. Like S registers in Hayes-set modems, MIDI controls consist of a few well-known registers, and beyond that, it's patch-specific and/or sequencer-specific.

コントロール:与えられたチャンネルと関わる様々な数値パラメータのうちの一つ。 ヘイズモデムにおけるSレジスタのように、MIDIコントロールは少しは名の知られた レジスタで構成されている。そのほかにパッチ独自、かつ・あるいはシーケンサー 独自のコントロールがある。

delta-time: the time (in ticks) that a sequencer should wait between playing the previous event and playing the current event.

デルタタイム:直前と現在の演奏の合間にシーケンサが待たなければならない 時間(単位:ティック)。

meta-event: any of a mixed bag of events whose common trait is merely that they are similarly encoded. Most meta-events apply to all channels, unlike events, which mostly apply to just one channel.

メタイベント:その共通特性が同じようにエンコードされているだけ、という イベントの寄せ集め。ほとんどのメタイベントは、イベントと違って全ての チャンネルに適用される。イベントの方は大概一つのチャンネルにだけに適用される。

note: my oversimplistic term for items in a score structure.


opus: the term I prefer for a piece of music, as represented in MIDI. Most specs use the term "song", but I think that this falsely implies that MIDI files represent vocal pieces.

オプス:MIDIでいうところの「曲」を表す私が好んで使う用語。 大概の仕様書では"ソング"が使われるが、これだとMIDIファイルが 歌曲を表すような誤解を与えるように私は思う。

patch: an electronic model of the sound of a given notional instrument.


running status: a form of modest compression where an event lacking an event command byte (a "status" byte) is to be interpreted as having the same event command as the preceding event -- which may, in turn, lack a status byte and may have to be interpreted as having the same event command as its previous event, and so on back.

ランニングステータス:緩やかな圧縮形式。イベントコマンドバイト (ステータスバイト)が欠落しているイベントを、先行するイベントと同じ ステータスバイトを持っていると解釈させる。 この先行イベントもステータスバイトを持たず、その前のイベントの ステータスバイトを持っていると解釈されているかもしれない。以下同様に続いていく。

score: a structure of notes like an event structure, but where notes are represented as single items, and where timing of items is absolute from the beginning of the track, instead of being represented in delta-times.

スコア:イベント構造体に似た、ノートからなる構造体。 ただし、ノートは単一のアイテムとして表され、アイテムの時間間隔は デルタタイムの代わりに、トラック開始からの絶対時間となる。

song: what some MIDI specs call a song, I call an opus.

ソング: MIDIの仕様によってはソングと呼ぶが私はオプスと呼ぶ。

sequencer: a device or program that interprets and acts on MIDI data. This prototypically refers to synthesizers or drum machines, but can also refer to more limited devices, such as mixers or even lighting control systems.

シーケンサ:MIDIデータを解釈し演奏する装置ないしはプログラム。 もともとシンセサイザーやドラムマシーンと関連がある。しかしまた、 ミキサーや照明制御装置のようなより限定的な装置とも関わりあっている。

status: a synonym for "event".


sysex: a chunk of binary data encapsulated in the MIDI data stream, for whatever purpose.

システムエクスクルーシブメッセージ:どんな目的にも使える MIDIデータストリームに包まれたバイナリデータのチャンク。

text event: any of the several meta-events (one of which is actually called 'text_event') that conveys text. Most often used to just label tracks, note the instruments used for a track, or to provide metainformation about copyright, performer, and piece title and author.

テキストイベント:テキストを運ぶメタイベントの総称(そのうちの一つは実際に 'text_event'という)。トラック名や楽器の注釈をするのに使われたり、著作権、 演奏者、作品タイトルや作者などのメタ情報を提供するのに使われることが多い。

tick: the timing unit in a MIDI opus.


variable-length encoding: an encoding method identical to what Perl calls the 'w' (BER, Basic Encoding Rules) pack/unpack format for integers.

可変長データエンコード:Perlで整数値に対し使われる'w' pack/unpack フォーマットと同じエンコード方法。


Christian Braut. The Musician's Guide to Midi. ISBN 0782112854. [This one is indispensible --SMB]

Christian Braut. The Musician's Guide to Midi. ISBN 0782112854. [これは必携の書 --SMB]

Langston, Peter S. 1998. "Little Music Languages", p.587-656 in: Salus, Peter H,. editor in chief, /Handbook of Programming Languages/, vol. 3. MacMillan Technical, 1998. [The volume it's in is probably not worth the money, but see if you can at least glance at this article anyway. It's not often you see 70 pages written on music languages. --SMB]

Langston, Peter S. 1998. "Little Music Languages", p.587-656 in: Salus, Peter H,. editor in chief, /Handbook of Programming Languages/, vol. 3. MacMillan Technical, 1998. [たぶんこの巻は値段に見合わないだろう。 だがとにかくこの記事にざっと目を通すことができるかどうかやってみるとよい。 音楽言語に関して70ページ書かれたものにお目にかかることはめったにないのだ。 --SMB]

I'll keep a list of other references and good stuff at the URL http://www.speech.cs.cmu.edu/~sburke/pub/perl_midi/

http://www.speech.cs.cmu.edu/~sburke/pub/perl_midi/ から 他の参考文献や素晴らしい素材のリストを得ている。


Copyright (c) 1998-2002 Sean M. Burke. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


Sean M. Burke sburke@cpan.org