構 造 的 音楽 記 述 言 語 「
楽 」 とそ の コ ンパ イ ラの 実 現 法
一MlDlに
よ る計 算 機 音 楽 研 究 用 シ ス テ ムー
松
原 康
夫
Specification
of a Music
Description
Language
"GAKU"
and its
Compiler
Construction
A Studying
System
for Computer
Music
Yasuo Matsubara
A language to describe music data is important for studies of computer music . The
language must be easy not only to read or write, but also to process with a computer .
Many such languages have been proposed. None of them , however, are widely used It
seems now that more research of such languages is required.
Music can be considered as parallel occurrences
of certain sequences. Such
se-quences may themselves include not only notes but also further parallel occurrences
of notes or other sequences.
In this paper, "GAKU", a new language to describe music is introduced . With this
language, parallel occurrences of elements can be described by enclosing them with
, and sequential occurrences of elements can be described by enclosing them with
( ). An element may be a note, a parallel occurrence or a sequential occurrence .
Therefore, a piece of music may be described in a structured manner.
In addition, the construction
of a compiler to process the language is described .
This compiler outputs a code which can be performed using a MIDI instrument .
1.は じ め に
現 代 に お い て は 音 楽 とコ ン ピ ュ ー タ と の 関
わ りは大 変 深 い もの と な っ て お り,日 常 接 す
る音 の多 く は何 らか の 形 で コ ン ピ ュ ー タが 関
わ っ て い る 。
元 来 音 楽 は人 間 に よ って 作 曲 され,人
間 に
よ って 演 奏 され て きた 。 人 間が 行 な う こ の よ
うな 活 動 は詳 し く見 て行 く と極 め て複 雑 な内
容 を含 ん で い る。
最 も簡 単 と考 え られ る演 奏 に つ い て も,最
初 に楽 譜 を 目で捉 え る パ タ ー ン認 識 の 過 程 を
含 む 。 さ らに そ れ を手 や 息 な どの動 作 に変 換
して 実 際 の音 を 出 して 行 く。
楽 譜 で 記 述 さ れ て い るの は骨 組 み だ けで あ
り,豊 か な表 情 は演 奏 を行 な う人 間 が付 け加
え る の で あ る。 こ の過 程 が ど の よ うに行 なわ
れ る か につ い て は全 く不 明 と言 う しか な い 。
こ の よ う な 演 奏 が 良 くて,あ
の よ う な演 奏 は
良 くな い とい う専 門 的 な方 法 論 が 少 し存 在 す
る の で あ ろ う。 しか しそ れ を 数 学 的 に定 式 化
す る こ とは 困難 で あ る。
そ して 人 間が 演 奏 す る と き に具 体 的 に ど の
よ う な演 奏 を して い る か を捉 え る こ と も なか
な か 困 難 で あ る。
こ れ に対 し,コ ン ピ ュ ー タ を音 楽 に応 用 す
る こ と はい ろ い ろ な形 で行 な わ れ て い る。
演 奏 を コ ン ピ ュ ー タで 自動 化 す る こ とは コ
ン ピ ュ ー タ音 楽 の 中 で も最 も頻 繁 に実 行 さ れ
て い る こ とで あ る。 技 術 が 伴 わ な い た め に音
楽 を 演 奏 す る こ とが で き なか った 非 専 門家 に
も,コ
ン ピ ュ ー タを 使 う こ とに よ っ て演 奏 が
可 能 とな っ た。
現 代 に お い て コ ン ピ ュ ー タ を使 っ た音 楽 を
大 衆 化 させ た 主 役 がMIDIで
あ る 。MIDIと
はMusicInstrumentDigitalInterfaceの
略 で
あ り,い ろ い ろ なデ ィジ タル 楽 器 を結 び付 け
る イ ン タ ー フ ェ ース の規 約 で あ る13)。
MIDIに
は い ろ い ろ と不 十 分 な 点 も あ るが
少 な くと も従 来 の楽 譜 で記 述 で き る音 楽 の演
奏 に は現 実 的 な意 味 で は十 分 で あ る し,そ の
普 及 度 か ら比 較 的安 価 にい ろ い ろ な 実 験 が で
き る。
次 に作 曲 の 問 題 を考 え て み る 。 こ れ に もい
くつ か の観 点 が あ る。 一 つ は コ ン ピ ュ ー タ を
文 房 具 と して使 う こ と に よ って 作 曲 の 中 の 純
粋 に機 械 的 な部 分 を軽 減 す る こ とで あ る 。 こ
れ は作 曲 家 が ワ ー プ ロ を使 うの と同様 で あ る 。
も う一 つ は これ まで 人 間 が作 っ た 曲 を分 析 す
る こ とで,あ
る ジ ャ ンル の 音 楽 ま た は特 定 の
作 曲 家 の 傾 向 を調 べ る こ とで あ る 。 音 楽 に 限
らず 芸 術 作 品 は,必 然 性 と任 意 性 の 両 面 を 有
す る 。 人 間 は次 に何 が 来 るか が 方 程 式 で一 意
的 に決 ま って し ま う もの や,逆
に何 の法 則 も
な い 乱 数 等 に は 美 を 感 じな い とい わ れ て い る。
丁 度 そ の 中 間 に位 置 す る もの が 芸 術 作 品 と な
る。 コ ン ピ ュ ー タ を使 っ て音 楽 全 般 ま た は 特
定 の ジ ャ ン ル ま た は作 曲家 に つ い て,何 が 必
然 で 何 が 任 意 で あ る か を探 る こ と も興 味 深 い
こ とで あ る 。
さ らに は,コ
ン ピ ュー タ を使 っ て従 来 に は
ない 音 楽 の 可 能 性 を 開 拓 す る こ とが 考 え られ
る。
一 つ は従 来 の 楽 器 で は 出 せ な か っ た 音 を
使 っ て 曲 を作 る こ とで あ る。 単 に半 音 よ り細
か い微 分 音 だ け で は な く,周 波 数 の帯 域 に あ
る 広 が り もつ 音 を コ ン ピ ュ ー タ で 合 成 す
る10)。
また,演 奏 と人 間 の 関 わ り方 を革 新 す る も
の もあ る。 例 え ば人 間が 描 い た絵 を 自動 的 に
音 に変 換 した り,各 種 の セ ンサ ー か らの 信 号
を音 に変 換 す る もの もあ る9)。
計 算 機 音 楽 の 研 究 に もい ろ い ろ な 方 向 が あ
る。 例 え ば 曲 を デ ー タ と して入 力 し,そ の構
造 を分 析 す るが,そ
の 方 法 と して 統 計 処 理 を
す る 情 報 論 的 な 方 法,構 造 をAI的
に 分 析 す
る 方 法 や,言
語 理 論 を 応 用 す る な ど 多 岐 に
渡 っ て い る5)。 ま た,楽 器 の 音 を 分 析 した り
逆 に合 成 す る研 究 は古 くか ら進 め ら れ て お
り2),分 析 に は フ ー リエ 変 換,線
形 予 測 符 号
化 な どの 方 法 が 使 わ れ て い る。 合 成 に は加 算
合 成,減 算 合 成,な
ど多 くの 方 法 が 考 え られ
て お り,最 近 で は実 際 の 楽 器 の発 音 機 構 を シ
ミュ レー トす る こ と も行 な わ れ て い る。
人 間が 音 楽 を どの よ う に認 識 す るか を考 え
る認 知 科 学 的 な研 究 もあ り1)8),AIや
自動 作
曲 な ど と も 関連 して 今 後 の重 要 な テ ー マ と な
るで あ ろ う。
計 算 機 の高 度 な 技 術 が 要 求 され る分 野 と し
て は 楽 譜 の 自動 読 み 取 りや,自 動 採 譜 な どが
あ る。 楽 譜 は 人 間 に は容 易 に 読 み 取 る こ とが
で き るが,計
算 機 で こ れ を行 な う こ と は 困 難
な パ タ ー ン認 識 の 問 題 と な る6)。 自動 採 譜 は
単 音 の 場 合 はあ る程 度 実 用 に な る が,複 音 に
つ い て はAIの
手 法 を応 用 し て 人 間 の 聞 く過
程 を シ ミ ュ レ ー トす る こ とな どが 試 み られ て
い る。
計 算 機 で 曲 を分 析 す る に して も,ま た 演 奏
を させ る に して も,コ ン ピ ュ ー タが 認 識 で き
る形 で デ ー タ を記 述 す る こ とが 必 要 に な る。
これ ま で に もい ろ い ろ な言 語 仕 様 が 提 案 さ
れ3)4),実 現 さ れ て い る。ASNIに
よ る標 準
化 案 も提 案 され て い る4)が,一
般 に受 け 入 れ
られ て い る とは 言 い 難 い 。 音 楽 記 述 言 語 は,
まだ まだ い ろ い ろ な こ と を試 行 す るべ き段 階
に あ る と考 え られ る16)。
音 楽記 述 言 語 は 人 間 が 理 解 しや す く書 きや
す い とい う条 件 と同 時 に,計 算 機 で の処 理 が
容 易 で あ る必 要 が あ り,こ の 点 で 一 般 の プ ロ
グ ラ ミ ン グ言 語 と共 通 す る。 従 って プ ロ グ ラ
ミ ン グ 言 語 を処 理 す る コ ンパ イ ラ の 技 法14)
15)を如 何 に して 応 用 す る か が
,記
述 の 容 易
性 と高 い記 述 能 力 を 同 時 に実 現 す るた め の鍵
と な る。
本 論 文 で は,音 楽 に 内 在 す る直 列 性 と並 列
性 を構 造 的 に 記 述 で きる こ と と,音 符 が 自然
な 形 で 記 述 で き る こ とに 重 点 を お い た 音 楽 記
述 言 語 の 仕 様 を提 案 す る 。
併 せ て,こ
の 言 語 を処 理 す る コ ンパ イ ラ を
構 築 す る た め の技 法 に付 い て も述 べ る 。
2.MIDIイ ン タ ー フ ェ ー ス 我 々 はMIDIイ ン フ ェ ー ス を 基 本 と した 計 算 機 音 楽 の 研 究 用 シ ス テ ム の 構 築 を 目 指 し て い る の で,MIDIに つ い て 述 べ て お こ う 。 MIDIの 規 格 に は ハ ー ド ウ ェ ア に 関 す る 規 定 と,そ れ に よ っ て 伝 送 さ れ る デ ー タ に 関 す る 規 定 が あ る 。 2.1ハ ー ド ウ ェ ア ハ ー ドウ ェ ア と し て は 非 同 期 方 式 の シ リ ア ル 転 送 を 行 な う 。 転 送 は8ビ ッ ト単 位 で 行 な わ れ,前 後 に ス タ ー ト ビ ッ ト と ス ト ッ プ ビ ッ ト が 付 け 加 え ら れ る 。 転 送 速 度 は31.25K Baudeな の で1バ イ ト送 る の に320オSか か る 。 電 気 的 に は5mAカ レ ン トル ー プ で あ り,論 理0は 電 流 が 流 れ て い る 状 態 と す る 。5ピ ン のDINコ ネ ク タ を 使 い,レ シ ー バ に は フ ォ トカ プ ラ を 使 う な ど の 規 定 が あ る 。 2.2デ ー タ フ ォ ー マ ッ ト デ ー タ は 一 つ ま た は 複 数 の バ イ トか ら な る メ ッ セ ー ジ で や り取 り す る 。 メ ッ セ ー ジ は 最 初 に ス テ ー タ ス と呼 ば れ る バ イ トが 存 在 し, こ れ に よ っ て メ ッ セ ー ジ の 種 類 が 定 ま る 。 そ れ に よ っ て 幾 つ の デ ー タ バ イ トが 以 下 に 続 く か を も指 定 す る 。 デ ー タ バ イ ト は0,1,2バ イ ト の い ず れ か で あ る 。 ス テ ー タ ス バ イ トの MSBは1と し,デ 」 タ バ イ トのMSBは0と す る こ と で 両 者 は 区 別 さ れ る 。 メ ッ セ ー ジ に は 大 き く分 け て チ ャ ン ネ ル メ ッ セ ー ジ と シ ス テ ム メ ッ セ ー ジ が あ る 。 チ ャ ン ネ ル メ ッ セ ー ジ は1∼16ま で の い ず れ か の チ ャ ン ネ ル を 指 定 して 送 ら れ る も の で あ り,そ の チ ャ ン ネ ル に 該 当 し な い 機 器 は こ れ を 無 視 す る 。 チ ャ ン ネ ル メ ッ セ ー ジ に つ い て は あ と で さ ら に 詳 し く 述 べ る 。 シ ス テ ム メ ッセ ー ジ は 特 定 の チ ャ ン ネ ル に 限 らず,接 続 さ れ た 全 て の 機 器 を 対 象 と す る も の で あ り,コ モ ン メ ッ セ ー ジ,リ ア ル タ イ ・ ム メ ッ セ ー ジ,エ ク ス ク ル ー シ ブ メ ッ セ ー ジ が あ る 。 コ モ ン メ ッ セ ー ジ に は ソ ン グ ポ ジ シ ョ ン ポ イ ン タ,ソ ン グ セ レ ク ト,チ ュ ー ン リ ク エ ス ト,EOXが あ り,そ れ ぞ れ 曲 の ど の 位 置 か ら 開 始 す る か,ど の 曲 を 選 択 す る か,音 高 の 調 整,エ ク ス ク ル ー シ ブ メ ッ セ ー ジ の 終 わ り を 示 す た め 等 に 使 わ れ る 。 リ ア ル タ イ ム メ ッ セ ー ジ は 接 続 さ れ た 機 器 を う ま く同 期 さ せ る た め に 使 わ れ る 。 よ く使 わ れ る も の と して 次 の よ う な も の が あ る 。 OxFAス タ ー ト OxFCス ト ッ プ OxFFシ ス テ ム リ セ ッ ト こ の よ う に,本 論 文 で は16進 数 を 表 わ す の に"Ox"を 頭 に 付 け る 。 リ ア ル タ イ ム メ ッ セ ー ジ は1バ イ トの ス テ ータ ス だ け で あ り,デ ー タ バ イ トを 伴 わ な い 。 エ ク ス ク ル ー シ ブ メ ッ セ ー ジ はMIDIの 統 一 規 格 に 乗 り切 ら な い,メ ー カ ー 毎 に 異 な る 機 器 の 設 定 等 に 利 用 さ れ る 。 そ の た め に メ ー カ ー はID番 号 をMIDI規 格 協 議 会 か ら も ら う 必 要 が あ る 。 デ ー タ フ ォ ー マ ッ ト は,最 初 にOxFOが 来 て エ ク ス ク ル ー シ ブ メ ッ セ ー ジ の 始 ま り を 示 す 。 そ の 直 後 の1バ イ ト はID番 号 を 表 わ す 。 そ の あ と に 任 意 個 数 の デ ー タ バ イ トが 続 き, 最 後 にOxF7(EOX)が 来 て エ ク ス ク ル ー シ ブ メ ッ セ ー ジ の 終 わ り を 示 す 。OxFOと OxF7の 間 の バ イ トのMSBは 全 て0と す る 。 2.3チ ャ ン ネ ル メ ッ セ ー ジ チ ャ ン ネ ル メ ッ セ ー ジ に は ボ イ ス メ ッ セ ー ジ と モ ー ド メ ッ セ ー ジ が あ る 。 先 に モ ー ド メ ッ セ ー ジ に つ い て 述 べ る 。 モ ー ド に は1∼4が あ り,そ れ ぞ れOMNI モ ー ドのon/offとpoly/Monoモ ー ド を 指 定 す る 。 Mode 1 2 3 4 Omni on on off off
Poly/mono
Poly
mono Poly monoOmniモ
ー ドがonと
言 う こ と は 全 て の
チ ャ ン ネ ル 番 号 の ボ イス メ ッセ ー ジ に反 応 す
る と言 う こ とで,チ
ャ ン ネ ル の 概 念 が 普 及 し
て い な い 時 に電 源 を入 れ れ ば と りあ え ず 音 が
出 る よ う にす るた め に設 け られ た もの で あ る。
現 代 で は 電 源 投 入 時 に モ ー ド3に な る機 器 が
一 般 的 で あ る
。
次 に ボ イ ス メ ッセ ー ジ につ い て述 べ る。 ボ
イ ス メ ッセ ー ジ は 実 際 に 楽 器 の 音 を コ ン ト
ロ ー ル す る も ので あ る 。 ス テ ー タス の 下 位4
ビ ッ ト(Xで
表 わす)は
チ ャ ンネ ル 番 号 か ら
1を 引 い た 数 を表 わ す 。 以 下 に お い て ノ ー ト
ナ ンバ ー が 使 わ れ る が,こ
れ は 中 央 のCの
音 を60と して 半 音 毎 につ け られ た 番 号 で あ る。
つ ま り ハ 長 調 で ト音 記 号 の 下 の 下 線 の ドが60 で あ り,そ の1音 上 の レ は62と な る 。 以 下 に メ ッ セ ー ジ の 名 前,ス テ ー タ ス バ イ トの 値, デ ー タ バ イ ト数,の 順 に 記 し,説 明 を 加 え る 。 (1)ノ ー ト オ フOx8×2 音 を 止 め る も の で あ り,最 初 の デ ー タ バ イ トで ノ ー トナ ン バ ー を 表 わ す 。2番 目 の デ ー タ バ イ トは ノ ー ト オ フ ベ ロ シ テ ィ と呼 ば れ る が 通 常 は 意 味 を 持 た な い 。 (2)ノ ー トオ ンOx9×2 最 初 の デ ー タ バ イ トは ノ ー トナ ン バ ー を 表 わ し,2番 目 の デ ー タ バ イ トは ベ ロ シ テ ィ を 表 わ す 。 ベ ロ シ テ ィ は 音 の 強 さ を 表 わ す 。 こ の メ ッ セ ー ジ は 指 定 さ れ た 音 を 指 定 さ れ た 強 さ で 発 音 す る こ と を 意 味 す る 。 普 通 の 強 さ は 64で 表 わ さ れ る 。 ベ ロ シ テ ィ が0の ノ ー ト オ ン は ノ ー ト オ フ の 代 わ り に 使 わ れ る 。 ノ ー ト ナ ン バ ー は1∼127で 表 わ す 。C4 と 呼 ば れ る 中 央 の ドは60と な る 。 ノ ー トナ ン バ ー1は#C-1で あ り,127はG9で あ る 。 (3)ポ リ フ ォ ニ ッ ク キ ー プ レ ッ シ ャ OxAX2 こ れ は 特 定 の キ ー を 発 音 し た 後 で そ の 強 さ を 変 え る も の で あ る 。 最 初 の デ ー タ バ イ トは ノ ー トナ ン バ ー を 指 定 し,2番 目 の デ ー タ バ イ トは プ レ ッ シ ャ を 表 わ す 。 (4)コ ン ト ロ ー ル チ ェ ン ジ OxBX2 最 初 の デ ー タ バ イ トは 制 御 番 号 を 表 わ し2 番 目 の デ ー タ バ イ トは 制 御 値 を 表 わ す 。 制 御 番 号 が122か ら127ま で は 決 め ら れ た 内 容 が あ る 。 制 御 番 号 が122の 時 は 制 御 値 が0な らLo-calControloffで あ り,制 御 値 が127な らLo-calControlOnで あ る 。Localcontroloffと は シ ン セ サ イ ザ 等 に お い て,キ ー ボ ー ド と 音 源 と の 結 合 を 切 る も の で あ る 。 制 御 番 号 が123の 時 はAllNotesOffで あ り, 全 て の 音 を 停 止 す る 。 制 御 値 は0と す る 。 制 御 番 号124か ら127ま で はOmnimodeとpoly/monoモ ー ドの 指 定 に 使 わ れ る 。 こ れ 以 外 の 制 御 番 号 に つ い て は さ ら に い くつ か の デ ー タ バ イ トを 送 れ る もの も あ る 。 ピ ア ノ の ソ フ トペ ダ ル や ソ ス テ ヌ ー ト,ダ ン パ ー 等 の ペ ダ ル や,ボ ル タ メ ン ト,メ イ ン ボ リ ュ ー ム 等 の 制 御 が こ れ ら に 含 ま れ る 。 (5)プ ロ グ ラ ム チ ェ ン ジ OxCX1 こ こ で い う プ ロ グ ラ ム と は シ ン セ サ イ ザ の 音 色 に 対 応 す る も の で あ る 。 デ ー タ バ イ トは そ の プ ロ グ ラ ム を 指 定 す る 。 (6)チ ャ ン ネ ル プ レ ッ シ ャ OxDX1 こ れ は 特 定 の 音 で は な く,そ の チ ャ ン ネ ル 全 体 の プ レ ッ シ ャ を 変 え る も の で あ る 。 (7)ピ ッチ ベ ン ダ チ ェ ン ジ OxEX2 こ れ は 楽 器 全 体 の 音 を上 下 に 修 正 す る も の で あ る 。2つ の デ ー タ バ イ トで そ の 修 正 量 を 指 定 す る 。Ox2000の と き は 修 正 量0と な る 。 3.イ ン タ ー フ ェ ー ス ボ ー ド
MIDIイ
ン タ ー フ ェ ー ス ボ ー ドを パ ソ コ ン
に接 続 す る こ と に よ り,MIDI規
格 に 従 う任
意 の 楽 器 を 制御 す る こ とが で き る。 しか し な
が ら,そ の 制御 をす べ てパ ソ コ ンで 行 な う こ
とは か な り重 大 な 負 荷 とな る 。
中 で も特 に 問 題 に な る の が タイ ミ ング の 制
御 で あ る。MIDI信
号 は ど の 高 さ の 音 を どの
強 さ で 出 す か を指 定 す る こ とが で き る。 しか
しそ の タ イ ミ ン グ はデ ー タ の 内容 で は な く,
そ の信 号 が 出 され るそ の タ イ ミ ン グ に依 存 し
て い る の で あ る 。 この タ イ ミ ング は少 な く と
も ミ リセ ック単 位 で 制 御 す る必 要 が あ る。 し
か し なが ら市 販 の パ ソ コ ン例 え ばPC9801シ
リ ーズ で は秒 単 位 の 時 間 しか知 る こ とが で き
な い 。
そ の た め 実 際 に は,タ イ ミ ング の 制 御 等 を
代 行 して くれ る イ ン タ ー フ ェ ー ス ボ ー ドを使
用 す る こ と に な る 。 こ こ で は ロ ー ラ ン ド社 の MPU-PC9813)と い う ボ ー ド を 使 う こ と に す る(以 下MPUと 呼 ぶ)。 3.1CPUと の 接 続 MPUはPC98シ リ ー ズ の 拡 張 ス ロ ッ トに 挿 入 す る 。 プ ロ グ ラ ム か ら は 以 下 の3つ の バ イ ト単 位 の ポ ー ト を 介 して ア ク セ ス す る こ と が で き る 。 ス テ ー タ ス ポ ー ト デ ー タ ポ ー ト コ マ ン ド ポ ー ト 通 常 は デ ー タ バ ポ ー トは1/0空 間 のOxEODO 番 地 に 設 定 さ れ,ス テ ー タ ス ポ ー ト と コ マ ン ド ポ ー ト は 同 じ 番 地 のOxEOD2番 地 に 設 定 さ れ る 。 し た が っ て こ れ ら に ア ク セ ス す る に はC言 語 な ら ばinp関 数 やoutp関 数 を 使 う 。 ス テ ー タ ス ポ ー トは デ ー タ や コ マ ン ド を 呼 ん だ り書 い た りで き る か ど う か を 示 す フ ラ グ を保 持 し て い る ポ ー トで,こ れ は 読 み 取 ら れ る だ け で あ る 。 特 に ス テ ー タ ス バ イ トの ビ ッ ト7を デ ー タ セ ッ ト レ デ ィDSRと い い,こ れ が0の と き に は デ ー タ ポ ー トを 読 み 取 る こ と が で き る 。 同 様 に ス テ ー タ ス バ イ トの ビ ッ ト6を デ ー タ レ シ ー ブ レ デ ィDRRと い い,こ れ が0の と き は デ ー タ ポ ー トに デ ー タ を 書 く こ と が で き る 。 以 上 をCの 関 数 と し て ま と め る と 以 下 の よ う に な る 。 デ ー タ を 読 む 関 数 intgetdata() {inti; while(inp(STATPORT)&OX801=0) kbhitO; i=inp(DATAPORT)&Oxff return(i) } デ ー タ を 書 く 関 数 voidsda(ic)intis; {charch; ch=ic; while(inp(STATPORT)&Ox40!=0) kbit(); outp(DATAPORT,ch); } こ れ ら を 使 っ て,コ マ ン ド をMPUに 送 る 関 数 を書 く こ と が で き る 。 コ マ ン ド と は,こ れ をMPUに 送 る と そ の 処 理 が 終 了 し た と き に 何 ら か の 応 答 デ ー タ が 返 っ て 来 る も の で あ る 。 応 答 デ ー タ が 返 さ れ る と き,割 り込 み を か け る よ う で あ る が,こ れ は 必 ず し も 使 う 必 要 は な い 。 こ こ で は 割 り込 み を 禁 止 す る 関 数 .disableと,元 に 戻 す 関 数.enableを 使 う 。 以 下 に コ マ ン ド をMPUに 送 っ てACK (Oxfe)が 返 る の を待 つ 関 数 を 示 す 。
voidsendcom(ic)
intic;
{charch;ch=is;
printf("Sendcom%2x",ch);
while((inp(STATPORT)&Ox40)!=0)
kbhit();
_disable();
outp(COMDPORT,ch);
ch=getdata();
if(ch==(char)ACK)
printf("AckReturn¥n");
elseprintf("NONAckReturn%x¥n",ch);
_enable();
}
3.2MPUの 機 能 MPUで は ト ラ ッ ク と い う 概 念 を 用 い て い る が,こ れ はMIDI規 格 と は 関 係 の な い も の で あ る 。 こ れ は 例 え ば テ ー プ レ コ ー ダ の ト ラ ッ ク に 似 た 概 念 で あ り,1∼8の トラ ッ ク 番 号 を 用 い る 。 最 初 に ア ク テ ィ ブ ト ラ ッ ク を 指 定 す る こ と に よ っ て 演 奏 や 記 録 時 の トラ ッ ク を 選 択 す る こ と が で き る 。 こ れ に よ っ て パ ー ト別 の 演 奏 や 全 体 の 演 奏 な ど を 試 す こ と が で き る 。 パ ソ コ ン(以 下 ホ ス ト と い う)とMPUの 問 の や り取 り は バ イ トデ ー タ を 基 本 と して 行 な わ れ る 。 MPUの 主 な 使 い 方 は,演 奏 と記 録 で あ る 。 こ の 他 に あ る ト ラ ッ ク の デ ー タ を 演 奏 し な が ら 別 の トラ ッ ク に 記 録 を 行 な う オ ー バ ー ダ ビ ン グ も 可 能 で あ る 。 ま た,MPUを 単 な る 31.25Kボ ー のUARTと す る こ と も で き る 。 こ こ で は 演 奏 と記 録 の 方 法 を 述 べ る 。 3.3演 奏 MPUを 用 い た 演 奏 を 開 始 す る に は 演 奏 開 始 コ マ ン ドOxOAをMPUに 送 り,停 止 す る に は 演 奏 停 止 コ マ ン ドOxO5を 送 る 。 演 奏 開 始 コ マ ン ドを 送 る 前 に,諸 条 件 を セ ッ トす る た め に 以 下 の よ う な い く つ か の コ マ ン ド を 送 る の が 普 通 で あ る 。 [コ マ ン ドバ イ ト(デ ー タ バ イ ト数)名 前] の 順 で 示 す 。 [Ox8E(0)コ ン ダ ク タ ーoff] [Ox8F(0)コ ン ダ ク タ ーon] コ ン ダ ク タ ー は 演 奏 中 に テ ン ポ 等 を 変 え る た め に 用 い る も の で あ り,詳 し く は 後 述 す る 。 [OxEC(1)ア ク テ ィ ブ ト ラ ッ クon/off] ど の ト ラ ッ ク を ア ク テ ィ ブ と す る か を デ ー タ バ イ トで 指 定 す る 。 デ ー タ バ イ トの 最 下 位 の ビ ッ トか ら0,1,… と 数 え る と ビ ッ ト0, 1,2,… は そ れ ぞ れ ト ラ ッ ク1,2,3… に 対 応 す る 。 [OxB8(0)ク リ ア ・プ レ イ ・カ ウ ン タ] す べ て の トラ ッ ク の プ レ イ ・カ ウ ン タ を ク リ ア す る 。 演 奏 開 始 前 に 必 ず 実 行 す る 必 要 が あ る 。 以 上 の よ う な 設 定 を 行 な っ た 後 に 演 奏 開 始 コ マ ン ド を 送 る と,MPUは ス タ ー トOxFA をMIDIア ウ ト に 出 し,CPUに 対 し て ト ラ ッ ク デ ー タ リ ク エ ス トOxFTを ホ ス トに 送 る 。こ こ で 下 位4ビ ッ トTは ト ラ ッ ク 番 号 一1 の 値 で あ る 。 こ れ に 対 し て ホ ス トは 直 ち に,対 応 す る ト ラ ッ ク の 演 奏 デ ー タ を 送 る 必 要 が あ る 。 こ の 演 奏 デ ー タ は 最 初 に タ イ ミ ン グ バ イ トが 存 在 し,次 に 一 つ のMIDIメ ッ セ ー ジ が 続 く 。 MPUは そ の タ イ ミ ン グ バ イ トの 値 を そ の ト ラ ッ ク の プ レ イ ・カ ウ ン タ に セ ッ ト し,そ のMIDIメ ッ セ ー ジ を も そ の ト ラ ッ ク に 対 応 す る バ ッ フ ァ に 記 録 す る 。MPUは 内 部 ク ロ ッ ク で カ ウ ン タ を デ ク リ メ ン ト し,値 が0 に な る と バ ッ フ ァ に 記 録 し たMIDIメ ッ セ ー ジ をMIDIケ ー ブ ル に 送 り 出 す 。 こ の よ う に し て 複 数 の ト ラ ッ ク の デ ー タ を 並 行 し て 演 奏 す る こ と が で き る 。 演 奏 上 同 時 に 鳴 る 音 に つ い て は,実 際 に は 一 つ ず つ ノ ー ト オ ン 情 報 をMPUに 送 る が , 2番 目 以 降 の タ イ ミ ン グ バ イ ト を0に す る の で 実 質 的 に は 同 時 に 発 音 す る の で あ る 。 ま た,240ク ロ ッ ク 以 上 の 待 ち 時 間 を と り た い と き は ト ラ ッ ク デ ー タ リ ク エ ス トに 対 し て1バ イ トのMPUメ ッ セ ー ジ で あ る タ イ ミ ン グ オ ー バ ー フ ロ ーOxF8を 送 る 。 す る と MPUは こ の ト ラ ッ ク に つ い て240ク ロ ッ ク 数 え て か ら 次 の デ ー タ リ ク エ ス ト を 出 す 。 ホ ス ト側 は こ の 方 法 で 任 意 の 長 さ の 音 符 や 休 符 を 実 現 で き る 。 但 し電 源 投 入 時 は4分 音 符 一 つ の 長 さ は24ク ロ ッ ク と な る 。 以 上 の よ う に し て 演 奏 を 行 な い 。 あ る ト ラ ッ ク の 演 奏 デ ー タ が 使 い 終 わ っ た らMPU か ら の 次 の トラ ック デ ー タ リ ク エ ス トに 対 し て ホ ス ト は 一 つ の タ イ ミ ン グ バ イ トの 後 に 続 け て デ ー タ エ ン ドOxFCを 送 る 。 そ の トラ ッ ク はoffと な り,以 後 そ の ト ラ ッ ク デ ー タ ・ リ ク エ ス ト は 出 さ れ な い 。 MPUは す べ て の トラ ッ ク がoffに な る と, オ ー ル エ ン ドOxFCを ホ ス ト に 送 る 。 こ れ に 対 し て ホ ス トは ス ト ッ プ プ レ イ ン グOxO5を MPUに 送 っ て 演 奏 を 終 了 す る 。MPUは ス ト ッ プOxFCをMIDIア ウ トに 出 す 。 3.4コ ン ダ ク タ ー と テ ン ポ 前 に も触 れ た よ う に,曲 を 演 奏 し て い る 間 に,適 当 な タ イ ミ ン グ で テ ン ポ を 変 え る 等 の 操 作 を し た い 。 こ れ を 実 現 す る た め に コ ン ダ ク タ ー の 機 能 が 使 わ れ る 。 コ ン ダ ク タ ー の 機 能 を オ ン に し て 演 奏 を 開 始 す る と,MPUは トラ ッ ク の 一 つ と 同 様 に コ ン ダ ク タ デ ー タ リ ク エ ス トを ホ ス トに 送 る 。 ホ ス ト は こ れ に 対 して,タ イ ミ ン グ バ イ トの あ と にMPUコ マ ン ド を デ ー タ と し て 送 ら な け れ ば な ら な い 。 ま た テ ン ポ に 関 す る コ マ ン ド と し て 次 の よ う な も の が あ る 。 [OxEO(1)セ ッ ト ・テ ン ポ] デ ー タバ イ トで テ ン ポ を 設 定 す る 。 [OxE1(1)レ ラ テ ィ ブ ・テ ン ポ] デ ー タバ イ トで,現 在 の テ ン ポ と の 相 対 的 な テ ン ポ を 以 下 の よ う に 設 定 す る 。 デ ー タ ノマイ ト 比率 0 0 Ox20 0.5 Ox40 1 1:1 2 OxCO 3 OxFF 4 [OxE2(1)グ ラ デ ュ エ ー シ ョ ン] デ ー タ バ イ トで,現 在 の テ ン ポ か ら 相 対 的 な テ ン ポ に 移 る 速 さ を 決 め る 。OxO1が 遅 く OxFFが 速 い 。OxOOは 瞬 時 に 変 化 す る 。 [OxB1(1)リ セ ッ ト ・ レ ラ テ ィ ブ ・テ ン ポ] 相 対 テ ン ポ を1に 戻 す 。 3.5レ コ ー ド 演 奏 と は 逆 に,MIDI楽 器 の 演 奏 を し て い る 間 に そ の デ ー タ を 記 録(レ コ ー ド)す る こ とが で き る 。 そ の た め に はOx22ス タ ー ト ・ レ コ ー デ ィ ン グ を ホ ス トか らMPUに 送 る が,や は りそ の 前 に い くつ か 設 定 の た め の コ マ ン ド を 送 る 必 要 が あ る 。 [Ox86(0)ベ ン ダ ーoff] [Ox87(0)ベ ン ダ ーon] こ れ ら に よ っ て ピ ッ チ ホ イ ー ル と コ ン テ ィ ニ ュ ア ス ・コ ン トロ ー ル メ ッ セ ー ジ を ホ ス ト に 送 る か ど う か を 決 め る 。
[OxEE(1) セ ッ トチ ャ ン ネ ル ア ク セ ス セ プ タ ン ス1-8] [OxEF(1) セ ッ トチ ャ ン ネ ル ア ク セ ス セ プ タ ン スm 16] そ れ ぞ れ デ ー タバ イ トの ビ ッ トに 対 応 す る チ ャ ン ネ ル の ボ イ ス メ ッセ ー ジ を ホ ス ト に 送 る か ど う か を 指 定 す る 。 [Ox85(1)メ ト ロ ノ ー ムon(4拍 子)] [Ox83(0)メ ト ロ ノ ー ムon(3拍 子)] [Ox84(0)メ ト ロ ノ ー ムoff] メ ト ロ ノ ー ム は 記 録 の と き に 拍 子 を 表 わ す 音 を 出 す も の で あ る 。 [Ox88(0)MIDIス ル ーoff] [Ox89(0)MIDIス ル ーon] 例 え ば ピ ア ノ を 弾 い て そ の 演 奏 デ ー タ を記 録 す る と き,ス ル ーonに な っ て い る と,ピ ァ ノ か ら 出 た ボ イ ス メ ッ セ ー ジ はMPUを 経 由 し て 再 び ピ ア ノ に 入 り,同 じ 音 を 再 び ト リ ガ ー す る こ と に な る 。 こ れ を 防 ぐ た め に は ス ル ーoffと す る 必 要 が あ る 。 以 上 の よ う な 設 定 の あ と に,ス タ ー ト ・ レ コ ー デ ィ ン グOx22を ホ ス トはMPUに 送 る 。 MPUは ス タ ー トOxFAをMIDIア ウ ト に 出 し,レ コ ー ドカ ウ ン タ を リ セ ッ ト して イ ン ク リ メ ン ト を 始 め る 。 MIDIイ ン に メ ッ セ ー ジ が 入 る とMPUは タ イ ミ ン グ バ イ ト を付 け て ホ ス ト に 送 る 。 タ イ ミ ン グ が240以 上 の 時 はMPUは タ イ ミ ン グ オ ー バ ー フ ロ ー を 表 わ すMPUメ ッ セ ー ジ OxF8を ホ ス トに 送 る 。 レ コ ー ド を 終 了 す る に は,ホ ス ト か ら MPUに ス ト ッ プ ・ レ コ ー デ ィ ン グOx11を 送 る 。 こ れ に 対 し てMPUは ス ト ッ プOxFC をMIDIア ウ ト に 出 し,タ イ ミ ン グ バ イ ト と デ ー タ エ ン ドマ ー クOxFCを ホ ス トに 送 る 。
4.音
楽 記 述 言 語
音 楽 の デ ー タ を記 述 す る に は い ろ い ろ な レ
ベ ル が 考 え ら れ る 。 最 も低 い レベ ル で は,演
奏 さ れ る音 楽 の一 つ 一 つ の 音 の周 波 数 や 音 色,
強 さ の 記 述 が 考 え られ る。 従 来 最 も よ く使 わ
れ て きた の が 楽 譜 の レベ ル で あ るが,こ
れ よ
り高 位 の レベ ル と して は,こ の よ う な楽 譜 を
作 り出 す プ ロ グ ラ ム や 自然 言 語 で 書 い た構 想
の よ う な もの が 考 え られ る。
こ こ で は 具 体 的 な 曲 の構 造 を分 析 した り,
ま た そ れ を演 奏 に結 び付 け るた め に便 利 と考
え ら れ る楽 譜 の レベ ル で の 記 述 を考 え る。
4.1言
語 の 設 計 目標
音 楽 デ ー タ を コ ン ピ ュ ー タ に入 力 す る方 法
は,お
お よ そ 以 下 の3つ
に わ け られ る 。
(1)数値 に よ る 入 力
(2)テキ ス トベ ー ス の 言 語
(3)グラ フ ィ ッ クイ ン タ ー フ ェ ー ス
(4)演奏 デ ー タ の リ ア ル ダ イ ム レ コ ー ド
(5)楽譜 の 自動 認 識
(1)は もっ と も古 くか ら行 な わ れ て い る が 問
題 は そ の 能 率 の 悪 さ と読 み に くさで あ る 。
(4)は楽 譜 を見 て 演 奏 で きる 人 間 が い な い と
不 可 能 と な る 。 最 近 で は(3)の方 法 が 普 及 して
きて い るが,グ
ラ フ ィ ック イ ン タ ー フ ェ ー ス
の使 い 勝 手 の 善 し悪 しの 問 題 が あ る し,大 量
の デ ー タ を入 力 す る に は能 率 が 悪 い 。(5)は一
部 実 用 化 され て い るが 信 頼 性 が低 い 。
以 上 の よ う な理 由 か ら こ こ で は(2)の方 法 を
取 り上 げ る。 こ の 方 法 の 利 点 は少 し慣 れ る だ
けで 比 較 的 容 易 に 入 力 で き,あ る 程 度 解 読 す
る こ とが で き る こ とで あ る。
テ キ ス トベ ー ス の 言 語 は基 本 的 に 直 線 的 な
つ なが り を持 つ 宿 命 が あ る。 こ れ に 対 して 楽
譜 の 場 合 は複 数 の旋 律 の 流 れ を並 行 に記 述 す
る た め に2次 元 的 な広 が りを持 つ もの で あ る 。
従 っ て こ の並 行 性 を テ キ ス トベ ー ス の 言 語 で
如 何 に して表 現 す る か が 問 題 と な る 。 他 に も
い くつ か 問 題 点 が あ る の で,以 下 に こ こで 設
計 す る音 楽 記 述 言 語 の設 計 目標 を列 挙 す る。
(1)ある程 度 音 楽 の 知 識 の あ る もの に と って
自然 な 記 述 で あ る こ と。
(2)複数 の 直列 な流 れ が並 行 した り,直 列 な
流 れ の 中 に並 列 な流 れ が 混 入 す る等 の 関 係 が
容 易 に かつ 理解 しや す く記 述 で きる こ と。
(3)基本 的 に は表 現 法 を除 い た,骨 格 とな る
デ ー タ が入 力 で きる よ う にす る が,演 奏 上 の
詳 細 な ど を記 述 で き る可 能 性 を持 た せ る。
以 上 の よ う な設 計 目標 に基 づ き,こ こ で は
以 下 の よ う な言 語 を設 計 した 。
4.2音 符 の 表 現 最 初 に 音 の 高 さ の 表 現 を考 え る 。 こ れ に つ い て は 少 し音 楽 を か じ っ た こ と の あ る 人 間 に はA,B,C,D,E,F,Gと い う 表 現 が 自 然 な も の で あ る 。 つ ま りハ 長 調 で 言 う ドがC で あ り,レ,ミ,フ ァ,ソ,ラ,シ が そ れ ぞ れD,E,F, ,G,A,Bに 相 当 す る の で あ る 。 但 し こ れ で は7音 階 し か 表 現 で き な い 。 さ ら に オ ク タ ー ブ の 区 別 を す る た め に こ れ に 数 字 を 付 け 加 え る 。 こ れ に つ い て はMIDI規 格 で の 習 慣 が あ る の で そ れ に 従 う 。 つ ま り ト音 記 号 の 第1下 線 の ド をC4と す る 。 こ の オ ク タ ー ブ 上 の ド をC5と す る 。 こ の 間 の レ か ら シ ま で は そ れ ぞ れD4,E4,F4,G4,B 4と す る の で あ る(図4.1)。 派 生 音 に つ い て は 次 の よ う に す る 。 シ ャ ー プ は`+'を,フ ラ ッ ト は`一'を,ナ チ ュ ラ ル は `n'を 前 に つ け て 表 わ す。 次 に 長 さ の 表 現 を 考 え る 。 最 も基 本 的 な 長 さ を4分 音 符 と す る 。 こ れ に ス ラ ッ シ ュ/を つ け る こ と で 半 分 の 長 さ と す る 。 従 っ て16分 音 符 は 二 つ ス ラ ッ シ ュ が つ く。 逆 に ア ス テ リ ス ク*を つ け る こ と で2倍 の 長 さ を 表 わ す 。 ま た 付 点 は ピ リ オ ド.で 表 わ す 。 一 つ で 1.5倍 の 長 さ を 表 わ し 二 つ で1.75倍 の 長 さ を 表 わ す 。 休 符 は4分 休 符 をPで 表 わ し,/,*,.が 使 え る もの とす る 。
4.3直
列 と並 列 の 表 現
音 符 を小 括 弧()の
中 に コ ンマ で 区切 っ
て並 べ る こ とで 直列 に演 奏 す る こ と を表 わ す 。
ま た 大 括 弧{}の
中 に 音 符 を コ ン マ で 区
切 って 並 べ る こ とで 並 列 に演 奏 す る こ と を表
わ す 。
さ ら に こ れ らの記 述 が 互 い に ネ ス ト化 す る
こ とが で きる 。
4.4例 こ こ で,い くつ か の 例 に よ っ て 音 楽 記 述 言 語 の 書 き方 を 示 す 。 最 初 に 図4.2の 楽 譜 の 記 述 を 示 す 。 こ れ は 単 旋 律 の 例 で あ る 。 (G4/,E4/,E4/;P/;F4/,D4/,D4/,P/) で は 次 に 二 つ の 旋 律 を含 む 例 を 示 そ う 。 バ ッ ハ の2声 の イ ン ベ ン シ ョ ン1番 の 最 初 の2小 節 を示 す(図4.3)。 但 し装 飾 音 は 省 略 し て あ る 。 {[右 手] (P//,C4//,D4//,E4//, F4//,D4//,E4//,C4//, G4/,C5/,B4/,C5/, D5//G4//,A4//,B4//, C5//,A4//,B4//,G4//, D5/,G5/,F5/,G5/ ), [左 手] (P*,P//,C3//,D3//,E3//, F3//,D3//,E3//,C3//, G3/,G2/;P, P//,G3//,A3//,B3//, C4//;A3//,B3//,G3// ) } 以 上 に お い て[]の 中 は 注 釈 で 何 を 書 い て も 構 わ な い 。 こ の よ う に 右 手 パ ー ト と左 手 パ ー トを 並 行 し て 記 述 す る こ と が で き る 。 ま図4.2
図4.3
た,こ こ で は 二 つ の 小 説 を 一 つ の 直 列 に つ な げ て 書 き,そ れ を 並 列 に 記 述 し た が,こ れ は 別 の 書 き 方 も可 能 で あ る 。 例 え ば1小 節 つ つ 並 列 に ま と め て こ れ を 直 列 に 記 述 す る の で あ る 。 ({ (P//,C4//,D4//,E4//, F4//,D4//,E4//,C4//, G4/,C5/,B4/,C5/, ), (P*P//,C3//,D3//,E3//, F3//,D3//,E3//,C3//, ) } ,
{
(
D5//,G4//,A4//,B4//,
C5//;A4//,B4//,G4//,
D5/,G5/,F5/,G5/,
)
, (G3/;G2/,P, P//,G3//,A3//,B3//, C4//,A3//,B3//,G3// ), } ) ま た 以 上 に お い て 対 応 す る 左 括 弧 と 右 括 弧 を 同 じ列 に 合 わ せ て 書 き,こ れ に 含 ま れ る 内 容 は 少 し右 に ず ら し て 記 述 し て い る 。 こ れ は 字 下 げ(indentation)と 言 っ て コ ン ピ ュ ー タ の プ ロ グ ラ ム 言 語 で よ く用 い ら れ る 手 法 で あ る 。 こ の よ う に 書 か な く て も処 理 系 は 正 し く 解 釈 す る が,人 間 が 理 解 し や す い よ う に 字 下 げ を す る の で あ る 。 ま た 次 の よ う に 声 部 の 数 が 変 化 す る よ う な 場 合 も記 述 で き る(図4.4)。 ( ({D4/,C4/,A3/},{E4/,D4/,B3/,)
G3/},{G4/;D4/,B3/,F3/} ), {({G4.,C4.},A4/, {A4/,F4/,C4/},B4/,C5/,F4/ 〉, (E3*,{A3*,D3*}, ) }4.5そ
の 他 の 記 述
現 在 こ こ まで 示 した よ う に,い わ ば音 楽 の
骨 格 の 部 分 を記 述 で き る範 囲 を処 理 系 と して
実 現 し た。 しか し これ だ けで は タイ や ス ラ ー
等 の 記 述 が で きな い だ けで な く,強 弱 や テ ン
ポ の 変 化 な ど を記 述 で き ない た め,演 奏 す る
た め の デ ー タ と して は 不 十 分 で あ る。
また,調 声 の記 述 方 法 を も付 け加 え るべ き
で あ る。 こ れ は絶 対 音 で 記 述 す る の で,な
く
て も記 述 はで きる こ と に な る。 しか し入 力 を
容 易 とす る た め に は あ った 方 が よい 。 こ こで
は これ らの 考 え られ る 記 述 法 につ い て 述 べ て
お く。
調 声 は フ ラ ッ トまた は シ ャ ー プ の 数 を示 す 。
フ ラ ッ トな ら ば負 の 数 で シ ャー プ な ら正 の 数
で そ の 個 数 を表 わ す 。
例 え ば フ ラ ッ トが3個
あ れ ば
scale=‐3
の よ う に表 わす 。
3連 符 や5連 符 に付 い て は直 列 記 述 の 最 初
に":3"や":5"な
どの よ うに指 示 す る こ
とで そ の 直 列 記 述 の 中 の 音 符 の長 さ をそ れ ぞ
れ2/3や2/5と
す る 。 例 え ば次 の よ う にす
るQ
(:3,C5/,D5/,E5/)
も っ と一 般 的 な記 述 を考 え る と,4分
音 符
の 長 さ は デ フ ォ ー ル トで は120で あ る が,こ
れ を一 時 的 に変 更 す る 必 要 が 生 じ るか も知 れ
な い 。 そ の た め に次 の よ う に して指 定 で き る
よ う にす る。
quarter=125 次 に,小 節 間 で 同 じ音 が 続 く場 合 が あ る 。 こ の 場 合,一 つ の 直 列 な つ な が り と し て 記 述 す れ ば よ い の で あ る が,他 の 事 情(理 解 しや す さ な ど)か ら そ う し た くな い と き が あ る 。 こ の よ う な 場 合,前 後 の 音 を 止 め ず に 続 け る 記 述 法 が 必 要 と な る 。 例 え ばC4の 音 が 次 の 小 節 のC4と つ な が る 場 合,こ れ を 次 の よ う に 記 述 す る こ と が 考 え ら れ る 。 ((P*,P,{C4=,E4,G4}), ({=C4,F4,A4},P,P*) ) 音 の 強 さ に つ い て は,絶 対 的 な 強 さ を 指 定 す る 場 合 と,ク レ ッ シ ェ ン ド や デ ク レ ッ シ ェ ン ドの よ う に 強 さ が 変 化 す る 場 合 が あ る 。 ま た 一 時 的 に 強 い 音 を 出 し て 元 の 強 さ に 戻 る 場 合 等 も あ る 。 ま た,全 体 の 強 さ を 表 現 す る 場 合 と 特 定 の 旋 律 だ け の 強 さ を 指 定 す る 場 合 と が あ る 。 そ の 区 別 は{}と()の 包 含 関 係 を 利 用 し て 記 述 す る こ と が 考 え ら れ る 。 つ ま り あ る 括 弧 の 中 に 入 っ て,強 さ の 指 定 が な け れ ば,そ の 外 部 の 指 定 を そ の ま ま 使 い,も し指 定 が あ れ ば 内 部 で の 指 定 を優 先 す る 。 具 体 的 に 全 体 の 強 さ を 指 定 す る に は 例 え ば velocity=70 と い う よ う に0∼127の 数 で 指 定 す る 。 特 定 の 音 の 強 さ を 指 定 す る に は 音 符 デ ー タ の 前 に コ ロ ン で 区 切 っ て ベ ロ シ テ ィ を 書 く 120:C3/ ク レ ッ シ ェ ン ドや デ ク レ ッ シ ェ ン ドに つ い て は4分 音 符 の 長 さ に つ い て ど れ だ け ベ ロ シ テ ィ を 変 え る か を 指 定 す る 。 例 え ば4分 音 符 当 た り1つ つ ベ ロ シ テ ィ を増 や す の は cresc=1 逆 に4分 音 符 当 た り2つ つ 減 ら す の は cresc=‐2 と書 く。 し た が っ て ベ ロ シ テ ィ の 変 化 を 停 止 す る に Gまcresc=0 と 書 け ば よ い 。 こ れ に つ い て も 括 弧 毎 に 異 な る 指 定 が で き る も の と す る 。 次 に テ ン ポ の 指 定 で あ る が,こ れ は パ ー ト 毎 に 異 な る 指 定 を す る 訳 に は 行 か な い 。 つ ま り ど こ に 書 い て あ っ て も全 体 に 関 わ る 指 定 と 見 な す 必 要 が あ る 。 こ れ ら は 全 てMPU-PC 98の 機 能 を 直 接 利 用 す る も の とす る 。 ま ず 定 常 的 な テ ン ポ の 指 定 に つ い て は tempo=100 の よ う に0∼255の 数 で 指 定 す る 。 さ ら に ア ク セ ル や リ タ ル ダ ン ドの た め に 以 下 の 機 能 を使 う 。 relative=0 の よ う に,0,0.5,1,2,3,4の ど れ か を 指 定 す る 。 こ れ は 現 在 の テ ン ポ に 対 す る 相 対 テ ン ポ を 指 定 す る も の で あ る 。 gradient=5 こ れ は 現 在 の テ ン ポ か ら 相 対 テ ン ポ に 移 る と き の 速 さ を0∼255の 数 で 指 定 す る 。 0の 時 は 瞬 時 に 変 化 す る が,そ れ 以 外 は 数 値 が 小 さ い ほ ど ゆ っ く り変 化 し,大 き い ほ ど 早 く変 化 す る 。 少 な く と も ピ ア ノ に つ い て は 完 全 な 演 奏 が で き る よ う に し た い 。 そ の た め,サ ス テ イ ン ペ ダ ル のon/offを 次 の よ う に 記 述 す る 。 s_ons_off 最 後 に 次 の 問 題 を 考 え る 。 実 際 の 演 奏 で は, 楽 譜 に 音 符 が 書 い て あ っ て も,そ の 長 さ の 間 ず っ と 音 を 出 して い る 訳 で は な い 。 次 の 音 に 移 る 前 に わ ず か だ が 音 の 無 い 時 間 が あ る 。 こ れ が 短 け れ ば レ ガ ー トに 聞 こ え,長 け れ ば マ ル カ ー トに 聞 こ え る 。 こ の 音 の 無 い 時 間 を こ こ で は ギ ャ ッ プ と呼 ぶ こ と に す る 。 こ れ を 表 わ す た め に gap=12 な ど と書 く こ と に す る 。 た だ し ス タ ッ カ ー トな ど の よ う に 実 際 の 音 が 音 符 よ り極 端 に 短 い 場 合 は 音 符 と 休 符 に 分 け て コ ー デ ィ ン グ す る も の と す る 。
5.オ
ブ ジ ェ ク ト ・コ ー ド と 演 奏 プ ロ グ
ラ ム
5.1オ ブ ジ ェ ク ト ・コ ー ド 前 章 ま で で 提 示 し た 音 楽 記 述 言 語 で 書 か れ た 音 楽 を 処 理 し て,ど の よ う な 目 的 コ ー ド を 出 力 す る べ き か を 考 え る 。 こ こ で は こ の よ う な 音 楽 記 述 言 語 の 記 述 能 力 を確 認 す る た め に,実 際 に 演 奏 で き る コ ー ド を 出 力 す る こ と を 考 え る 。 こ の よ う に 実 際 に 演 奏 で き る こ と は,実 際 に コ ー デ ィ ン グ す る 過 程 に お い て,デ バ ッ グ の た め に も重 要 で あ る 。 つ ま り コ ー デ ィ ン グ し て は こ れ を コ ン パ イ ル し,実 際 に 演 奏 を 行 な う こ と に よ っ て 正 し く コ ー ド化 で き た こ と を確 認 す る こ と が 可 能 と な る 。 オ ブ ジ ェ ク トコ ー ド は 二 つ の フ ァ イ ル に 出 力 す る 。 一 つ は 基 本 的 な 演 奏 デ ー タ で あ り, も う一 つ は コ ン ダ ク タ ー に 与 え る デ ー タ で あ る 。 そ し て ソ ー ス コ ー ド の フ ァ イ ル 名 は8文 字 以 内 の 英 数 字(XXXXと す る)に 拡 張 子 " SCO"を つ け た も の と す る 。 そ れ を コ ン パ イ ル し て 出 力 す る デ ー タ はxxxx.intと い う フ ァ イ ル に 出 力 し, コ ン ダ ク タ へ の デ ー タ はxxxx.conと い う フ ァ イ ル に 出 力 す る 。 説 明 の 都 合 上,両 方 と も十 進 数 を 空 白 ま た は 改 行 で 区 切 っ た テ キ ス トデ ー タ と す る(バ イ ナ リ ー フ ァ イ ル に す る こ と は 容 易 で あ る)。 各 数 は0∼255の1バ イ トで 表 現 で き る 値 と す る 。 基 本 デ ー タ の フ ァ イ ル は,タ イ ミ ン グ バ イ ト の 後 に 続 く コ マ ン ドバ イ ト と そ れ に 応 じ た 数 の デ ー タ バ イ トか ら な る 。 最 も 頻 繁 に 使 わ れ る の が ノ ー トonで あ り, こ の 後 に ノ ー トナ ン バ ー を表 わ す バ イ ト と, ベ ロ シ テ ィ を 表 わ す バ イ トが 続 く。 音 を 消 す の は ベ ロ シ テ ィ を0に す る 。 こ れ 以 外 に は,ペ ダ ル 等 の コ ン ト ロ ー ル チ ェ ン ジ 情 報 が あ る 。 こ れ ら は タ イ ミ ン グ バ イ トの 後 に3つ の バ イ トが 続 く 。 タ イ ミ ン グ が240以 上 に な る と き に は タ イ ミ ン グ オ ー バ ー フ ロ ーOxF8つ ま り248が 単 独 の バ イ トで 現 れ る 。 コ ン ダ ク タ ー へ の デ ー タ は 基 本 デ ー タ と は 切 り離 し て 考 え る 必 要 が あ る 。 な ぜ な ら,実 際 の 演 奏 プ ロ グ ラ ム に お い て,基 本 デ ー タ と は 別 の カ ウ ン タ に よ っ て 制 御 さ れ る か ら で あ る 。 タ イ ミ ン グ オ ー バ ー フ ロ ー の 扱 い は 基 本 デ ー タ と 同 様 で あ る 。 5.2並 列 と 直 列 の 表 現 こ こ で,如 何 に し て 基 本 デ ー タ に お い て, 並 列 ま た は 直 列 な 音 が 表 現 さ れ る か を示 し て お く。 最 初 に 例 え ば 次 の よ う な 直 列 な 音 の列 を 取 り上 げ る 。E4,D4,C4,B3た だ し チ ャ ン ネ ル は1と す る 。 す る と こ れ は4分 音 符 の 長 さ を120単 位 と す る と,次 の よ う な デ ー タ の 列 と な る 。 最 初 に タ イ ミ ン グ バ イ トが0で E4の 音 を ノ ー トon(十 六 進Ox90は 十 進 で144)と す る 。 ノ ー トナ ン バ ー は64,ベ ロ シ テ ィ は60と す る 。 0,144,64,60, 次 に4分 音 符 の 長 さ だ け 待 っ て こ の 音 を 消 す 必 要 が あ る 。 120,144,64,0, そ して 直 ち に 次 のD4音 を 出 す 。 0,144,.62,60, さ ら に4分 音 符 の 長 さ だ け 待 っ て こ の 音 を 止 め,次 のC4の 音 を 出 す 。 120,144,-62,0,0,144,60,60 4分 音 符 の 長 さ だ け 待 っ てC4の 音 を 止 め, B3の 音 を 出 す 。 120,144,60,0,0,144,59,60 最 後 にB3の 音 を 止 め て 終 了 す る 。 120,144,59,0 以 上 の よ う に も と も と シ ー ケ ン シ ャ ル な 音 の 流 れ の 表 現 は 自 明 か も知 れ な い 。 で は,図5.1の よ う な 和 音 の 表 現 を 見 る 。
最 初 にC4,E4,G4の 音 を 同 時 に 出 す た め に 次 の よ う な デ ー タ の 系 列 が 来 る 。 0,144,60,60,0,144,64,60,0, 144,67,60, こ の よ う に 実 際 に は シ ー ケ ン シ ャ ル な 列 と し て 表 現 さ れ る が,演 奏 時 に待 ち 時 間0で 次 々 に 音 が 出 さ れ る の で,人 間 の 耳 に は 問 題 な く 同 時 に 音 が 出 さ れ る よ う に 聞 こ え る 。 次 に4分 音 符 の 長 さ だ け 待 っ て 以 上 の3つ の 音 を 消 す 。 120,144,60,0,0,144,64,0,0, 144,67,0, こ こ で 最 初 の タ イ ミ ン グ バ イ ト は120で あ る が,次 の 二 つ は0で あ る 。 そ し て 直 ち に 次 の 和 音 が 出 さ れ る 。 0,144,62,60,0,144,65,60,0, 144,69,60, 次 に120だ け 待 っ て こ れ ら の 音 を 消 し, 120, .144,62,0,0,144,65,0,0, 144,69,0, 次 の 音 を 出 す 。 0,144,67,60,0,144,71,60,0, 144,74,60, 最 後 に こ れ ら の 音 を 止 め る 。 120,144, .67,0,0,144,71,0,0, 144,74,0, 以 上 の よ う に,オ ブ ジ ェ ク ト コ ー ド に 於 け る 並 列 性 の 表 現 を 人 間 が 理 解 す る こ と は 困 難 で あ る 。 こ の こ と か ら,前 章 で 示 し た よ う な 並 列 性 の 表 現 が 有 用 で あ る こ とが 理 解 で き る 。 5.3演 奏 プ ロ グ ラ ム 演 奏 プ ロ グ ラ ム は,以 上 の よ う な 二 つ の デ ー タ を 読 み 込 ん で,演 奏 を 行 な う 。 基 本 デ ー タ と コ ン ダ ク タ ー へ の デ ー タ と は 別 の 配 列 に 読 み 込 ま れ る 。 最 初 に テ ン ポ を コ ン ピ ュ ー タ の コ ン ソ ー ル か ら読 み 取 り,そ の テ ン ポ を セ ッ トす る 。 そ う し て 必 要 な 初 期 操 作 を行 な っ て 演 奏 を 開 始 す る 。 そ の あ と はMPUか ら の トラ ッ ク デ ー タ リ ク エ ス ト に 応 え て,基 本 デ ー タ を MPUに 送 る 。 こ の と き コ マ ン ドの 種 類 に 応 じ て 送 る バ イ ト数 を 決 め る 必 要 が あ る 。 ま た,ト ラ ッ ク デ ー タ リ ク エ ス トに 混 在 し てMPUか ら 出 さ れ る コ ン ダ ク タ ・デ ー タ ・ リ ク エ ス トOxF9に 応 え て 次 の コ ン ダ ク タ ・ デ ー タ を 送 っ て や る 。 従 っ て 演 奏 プ ロ グ ラ ム は,MPUか ら の デ ー タ が ト ラ ッ ク ・ デ ー タ ・ リ ク エ ス ト (OxFO∼OxF7)か コ ン ダ ク タ ・デ ー タ ・ リ ク エ ス ト(OxF9)か に よ っ て 異 な る 処 理 を す る 。
6.デ
ー タ 構 造 と処 理
以 上 で 述 べ た よ う な形 式 の オ ブ ジ ェ ク トを
生 成 す る た め に,コ ンパ イ ラ内 部 で どの よ う
な デ ー タ構 造 を ど の よ うに使 用 す る か 検 討 す
る 。
6.1デ ー タ 構 造 オ ブ ジ ェ ク ト に 出 力 す る デ ー タ の 基 本 単 位 は,必 ず タ イ ミ ン グ バ イ ト を 伴 っ て い る 。 従 っ て こ の タ イ ミ ン グ バ イ トを 伴 う デ ー タ の 集 ま り を 一 つ の ま と ま り(チ ャ ン ク)と し て 扱 う必 要 が あ る 。 そ し て デ ー タ 構 造 で は こ の タ イ ミ ン グ デ ー タ は 必 ず し もバ イ トで あ る必 要 は な い 。 つ ま り内 部 で は 非 常 に 長 い タ イ ミ ン グ を 表 現 し て よ い の で あ る 。 そ し て オ ブ ジ ェ ク ト と し て 出 力 す る と き に バ イ ト と し, バ イ ト で 表 現 で き な い と き に は タ イ ミ ン グ オ ー バ ー フ ロ ー を 使 用 す る の で あ る 。 で は 最 大 ど の 程 度 の 長 さ を 表 現 で き れ ば よ い で あ ろ う か 。4分 音 符 が120と し て,1小 節 が480と な り,長 い 曲 な ら 数 百 小 節 あ る の で す く な く と も16ビ ッ トで は 不 十 分 で あ る 。 こ こ で は32ビ ッ トの 長 さ を も つ,長 い 整 数 型 を 使 う こ と に す る 。 以 上 の よ う な い くつ か の デ ー タ を 表 わ す た め に 次 の よ う なcell型 の デ ー タ を 宣 言 し て 使う こ と に す る 。 structcell{ StrUCtCell*neXt; longintt; intbl,b2,b3; }; こ れ を 以 下 の よ う な 図 で 表 わ す 。
L
t bl b2 b3 Dこ こ で は 一 つ の メ ッセ ー ジが タイ ミン グバ イ
トの他 に は 高 々3バ イ トで 表 現 で き る こ とを
前 提 と して い る。
最 初 に ポ イ ン タ型 が あ るの は,こ の よ うな
セ ル 型 の デ ー タ を ポ イ ン タで 線 形 に つ な ぐた
め で あ る。
新 し く この よ う な記 憶 構 造 が 必 要 に な る度
にmalloc()関
数 で 主 記 憶 領 域 を 割 り付 け
て も ら う。 この 関数 は そ の 先 頭 番 地 を返 す も
の で あ る。 も し何 らか の エ ラ ーで 割 り付 けが
で き な い と き はNULLを
返 す 。
6.2音 符 の 処 理 次 に,具 体 的 な 音 符 の 処 理 を 考 え る 。 例 え ばC3/.と い う よ う な 音 符 デ ー タ が あ れ ば, こ れ は 通 常 三 つ のcellで 表 現 す る 。 最 初 の cellは ノ ー トonで あ り,こ の 高 さ の 音 を 出 し始 め る こ と を 表 わ す 。 そ して そ の タ イ ミ ン グ デ ー タ は0で あ る 。 次 のcellは 逆 に こ の 音 を 止 め る も の で あ る 。 そ の タ イ ミ ン グ デ ー タ は,8分 音 符 の 長 さ か ら そ の 文 脈 で の ギ ャ ッ プ の 長 さ を 引 い た も の で あ る 。 そ し て 最 後 の cellは ギ ャ ッ プ の 長 さ だ け 時 間 を待 つ ダ ミ ー デ ー タ で あ る 。b1が0の デ ー タ で ダ ミ ー を 表 わ す 。 休 符 は 一 つ の ダ ミ ーcellで 表 現 す る 。 ど の よ う な 音 の 系 列 で あ っ て も 全 て こ の よ う なcellを 線 形 に つ な い だ リ ス ト構 造 で 表 現 す る 。6.3直
列 シ ー ケ ン スの 処 理
直 列 な シ ー ケ ン ス を 表 わ す 括 弧()の
な
か に,い
くつ か の 要 素 が あ る とす る 。 そ れ は
単 純 な音 符 か,ま た は さ らに 直 列 な シ ーケ ン
ス か あ る い は並 列 な表 現 か も知 れ な い 。
ど の よ う な 場 合 で も そ れ ら の 意 味 は 全 て
cellを つ な い だ 線 形 リス トで 表 現 され て い る
とす る。 各 々 の要 素 の デ ー タ構 造 が 与 え られ
て い る と き,こ の 直 列 な シ ー ケ ンス で は,前
の 要 素 を表 わす リス ト構 造 の 後 に次 の要 素 を
表 わ す リス ト構 造 を接 続 して や る。 こ う して
得 られ る のが,現 在 の 直 列 シ ー ケ ン ス の意 味
を表 わ す リス ト構 造 で あ る 。
この こ と に よ って,前
の デ ー タが 演 奏 さ れ
て か ら次 の デ ー タが 演 奏 さ れ る こ とが 保 証 さ
れ る。
6.4並 列 シ ー ケ ン ス の 処 理 並 列 な 関 係 を 表 わ す{}の 中 に い くつ か の 要 素 が あ っ て,そ れ ら の 意 味 が そ れ ぞ れ リ ス ト構 造 で 表 現 さ れ て い る と す る 。 各 々 の 要 素 は,同 様 に 単 純 な 音 符 か も知 れ な い し,直 列 な シ ー ケ ン ス か あ る い は 並 列 な シ ー ケ ン ス で あ る 。 こ の 場 合,単 純 に リ ス ト構 造 を つ な ぐ と い う 訳 に は 行 か な い 。 そ れ で は 直 列 な 演 奏 を 意 味 す る か ら で あ る 。 そ う で は な く,一 つ 一 つ のcellの タ イ ミ ン グ デ ー タ を 見 て 正 し い 順 序 に 併 合 す る 必 要 が あ る 。 例 え ば 二 つ の リ ス ト構 造AとBが あ っ て, こ れ ら を 一 つ の リ ス ト構 造Cに 併 合 す る も の と す る 。AとBの そ れ ぞ れ の 先 頭 のcell の タ イ ミ ン グ デ ー タ が そ れ ぞ れ120と90で あ っ た とす る 。 こ の と き 先 に 実 行 さ れ る べ き デ ー タ は タ イ ミ ン グ デ ー タ90の も の で あ る 。 そ こ でBの 先 頭 のcellをBか ら 外 し てCの 末 尾 に つ な ぐ 。 こ こ で 注 意 し な け れ ば な ら な い の は,こ の ま ま 次 の 処 理 に 移 る と タ イ ミ ング デ ー タ の 処 理 を 誤 る こ とで あ る 。 と い う の は,最 初 の 状 況 に お い て,Aの 先 頭 のcellは 120単 位 数 え て か ら実 行 す る べ き 内 容 を 表 わ し,Bの 先 頭 のcellは90単 位 だ け 数 え て か ら 実 行 す る べ き 内 容 を 表 わ し て い た の で あ る 。 い ま,Bの 先 頭 に あ っ たcellがCの 末 尾 に 移 さ れ た の で,Aの 先 頭 のcellの 内 容 は さ ら に 120-90=30単 位 だ け 数 え て か ら実 行 す る べ き こ と に な る 。 こ の こ と か ら,二 つ の リス ト を 併 合 す る ア ル ゴ リ ズ ム は 以 下 の よ う に な る 。 併 合 ア ル ゴ リ ズ ム: 入 力:二 つ の 線 形 リ ス トAとB 出 力:一 つ の 線 形 リ ス トC 初 期 化:Cを 空 リ ス ト とす る (1)Aが 空 リ ス ト な ら ば(lz)へ行 く。 (2)Bが 空 リ ス ト な ら ば(13)へ行 く。
(3)Aの 先 頭 のCellの タ イ ミ ン グ デ ー タ をta に 代 入 。 (4)Bの 先 頭 のcellの タ イ ミ ン グ デ ー タ をtb に 代 入 。 (5)ta<tbな ら ば(6)に 行 き,そ う で な け れ ば(9) に 行 く。 (6)Aの 先 頭 のcellを と っ てCの 末 尾 に つ な ぐ。 (7)Bの 先 頭 のcellの タ イ ミ ン グ デ ー タ か ら taを 引 く 。 (8)(1)に彳于 く。 (9)Bの 先 頭 のcellを と っ てCの 末 尾 に つ な ぐ 。 (10)Aの 先 頭 のcellの タ イ ミ ン グ デ ー タ か ら tbを 引 く。 (1])(1)レこ彳于 くo (lz)cの 末 尾 にBを 接 続 し て(14)に行 く 。 (13)Cの 末 尾 にAを 接 続 し て(14)に行 く 。 (14)終了 以 上 の 併 合 ア ル ゴ リ ズ ム は あ る キ ー で ソ ー トさ れ た 二 つ の デ ー タ を 併 合 す る ア ル ゴ リ ズ ム に 似 て い る 。 異 な る の は,そ の キ ー 値 が そ の ま ま 表 現 さ れ ず に,前 の デ ー タ と の キ ー 値 の 差 で 表 わ さ れ て い る こ と で あ る 。 そ の た め,
一 方 を選 択 す る と
,他 方 の タ イ ミ ン グ デ ー タ
を修 正 す る必 要 が 生 じるの で あ る。
6.5コ ン ダ ク タ ・デ ー タ の 分 離 前 章 で 述 べ た よ う に,コ ン パ イ ル 結 果 は 二 つ の フ ァ イ ル に 出 力 す る 。 一 つ は 基 本 的 な 演 奏 デ ー タ で あ り,も う 一 つ は コ ン ダ ク タ ・ デ ー タ で あ る 。 こ こ ま で は 全 て の デ ー タ を 一 つ の 線 形 リ ス ト に ま と め て き た 。 こ の な か か ら テ ン ポ に 関 す る も の だ け を 別 の デ ー タ と し て 出 力 す る 必 要 が あ る 。 そ の た め の ア ル ゴ リ ズ ム を 以 下 に 示 す 。 分 離 ア ル ゴ リ ズ ム: 入 力:線 形 リ ス トC 出 力:基 本 デ ー タ の 線 形 リ ス トAと コ ン ダ ク タ ・デ ー タ の 線 形 リ ス トB 初 期 化:AとBを 空 リ ス ト とす る 。 変 数t=0と す る 。 (1)Cの 先 頭 のcellが 基 本 デ ー タ な ら(2)に 行 く。 そ う で な け れ ば(8)に 行 く。 (2)Cの 先 頭 のcellを と っ て,Aの 末 尾 に つ な ぐ 。 そ の 際tの 値 を そ のcellの タ イ ミ ン グ デ ー タ に 加 え る 。 (3)t=0と す る 。 (4)Cが 空 な ら(14)に行 く 。 (5)Cの 先 頭 のcellが 基 本 デ ー タ な ら(6)に 行 き,コ ン ダ ク タ ・デ ー タ な ら(8)に 行 く。 (6)Cの 先 頭 のcellを と っ てAの 末 尾 に つ な ぎ,そ の タ イ ミ ン グ デ ー タ をtに 加 え る 。 (7)(4)レこ彳テ くo (8)Cの 先 頭 のcellを と っ て,Bの 末 尾 に つ な ぐ。 そ の 際tの 値 を そ のcellの タ イ ミ ン グ デ ー タ に 加 え る 。 (9)t=0と す る 。 ⑩Cが 空 な ら(1のに 行 く。 ⑪Cの 先 頭 のcel1が コ ン ダ ク タ ・デ ー タ な ら(12)にゆ き,基 本 デ ー タ な ら(2)に 行 く。 (12)cの 先 頭 のcellを と っ てBの 末 尾 に つ な ぎ,そ の タ イ ミ ン グ デ ー タ をtに 加 え る 。 (13)(io)Gこ彳于 く。(14)終
了
変 数tは 例 え ば コ ンダク タデ ータか ら基 本 デ
ー タに種 類 が 切 り替 わ った と きに コ ンダクタデ
ー タで あ っ た 問 の経 過 時 問 を積 算 す る も ので
あ る。 これ に よ っ て基 本 デー タだ け を 分 離 し
た と き に正 しい タイ ミングデ ータを計 算 で きる。
(13)終了 す る 。 こ こ で は 具 体 的 な ス テ ー タ ス と し て ノ ー ト ・ onと コ ン ト ロ ー チ ェ ン ジ し か 扱 っ て い な い 。 こ れ ら は 全 て3バ イ トか ら な る が こ れ ら 以 外 の ス テ ー タ ス を 処 理 す る に は そ の 長 さ に 応 じ た 処 理 が 必 要 と な る 。 コ 6.6オ ブ ジ ェ ク トの 出 力 以 上 の よ う な 方 法 で 形 成 さ れ た リ ス トか ら, 基 本 デ ー タ と コ ン ダ ク タ デ ー タ を そ れ ぞ れ フ ァ イ ル に 出 力 す る 。 そ の た め に は タ イ ミ ン グ デ ー タ が240を 超 え る 時 に は タ イ ミ ン グ オ ー バ ー フ ロ ー の 処 理 を 行 な い,コ マ ン ドの 内 容 に よ っ て 出 力 す る バ イ ト数 を 制 御 す る 必 要 が あ る 。 さ ら に,休 符 な ど の と き に ダ ミー デ ー タ とb1が0のcellを 使 っ て い る の で そ の 処 理 も必 要 と な る 。 以 下 に 基 本 デ ー タ の 出 力 手 順 を 示 す 。 基 本 デ ー タ の 出 力 手 順 入 力:基 本 デ ー タ の リ ス トA 出 力 フ ァ イ ル 名 の 文 字 列 型 変 数kihon 出 力:基 本 デ ー タ の フ ァ イ ル 初 期 化t=oと す る (1)出力 フ ァ イ ル を オ ー プ ン す る 。 (2)Aが 空 な ら(12)に行 く。 (3)変 数tにAの 先 頭 のcellの タ イ ミ ン グ デ ー タ を 加 え る 。 (4)も しb1・=0な ら 先 頭 のcellを 取 り 除 き, (2)`こ彳于 くQ (5)も しt≧240な ら(6)に 行 き,そ う で な け れ ば(7)に 彳于 くo (6)t=t-240を 行 な い,タ イ ミ ン グ オ ー バ ー フ ロ ー を 表 わ す デ ー タ248(つ ま りOxF8)を フ ァ イ ル に 書 い て(5)に 行 く。 (7)tの 値 を フ ァ イ ル に 書 く 。 (8)b1の 値 を フ ァ イ ル に 書 く。 (9)b2の 値 を フ ァ イ ル に 書 く。 (10)b3の 値 を フ ァ イ ル に 書 く。 ⑳t=oと し て(2)に 行 く。 ⑫ フ ァ イ ル を ク ロ ー ズ す る 。7.字
句 解 析
次 章 に お い て は,ト
ップ ダ ウ ン の決 定 的 な
構 文 解 析 を 行 な う。 そ の た め に単 な る文 字 の
列 か ら記 号 つ ま りシ ンボ ル を取 り出す 機 能 が
必 要 とな る 。 この よ う な作 業 を字 句 解 析 とい
い,一 つ の 関 数getsym()で
こ れ を行 な う。
7.1字
句 解 析 と意 味 処 理
関 数getsymは,次
の 一 つ の 記 号 を 読 み
と って 対 応 す る番 号 を 関数 値 と して 返 す こ と
が基 本 的 な機 能 で あ る。 そ れ と同 時 に あ る 程
度 の 意 味 処 理 を行 な う こ とが 必 要 と な る 。
どの 程 度 の 意 味 処 理 を行 な うか は い ろ い ろ
な選 択 肢 が あ る が,こ
こで は例 え ば一 つ の音
符 に対 応 す る リス ト構 造 を構 成 して そ の先 頭
へ の ポ イ ン タを 返 す こ とにす る 。
音 符 以 外 の調 声 の 指 定 や テ ンポ,強 弱 の指
定 な ど につ い て は,キ
ー ワ ー ドまた はそ れ に
`='を つ け た もの
,整 数 な どが そ れ ぞ れ 一 つ
の シ ンボ ル とす る 。
以 下 に記 号 とそ れ を表 わす 番 号 の対 応 表 を
示 す 。
表7.1記 号 と 番 号 の 対 応 表 番号 記 号毒
茸
盞
s 9 101蹇
援
捻
17 18 19 0葆籌
チ
{ }塗数
s_°n soff tempo= ref= grad= scale= V= cresc= gap= quarter= 記 号 で な い も の以 上 のscale=な ど に お い て'='も 記 号 の 一 部 と し て い る 。 独 立 し た'='は 記 号 と し て は 存 在 し な い 。 こ こ で 音 符 を 表 わ す 文 字 列 を構 文 図 で 表 わ す (図7.1)。 音 高 は 次 の よ う に 計 算 す る 。 最 初 に 変 数 modiの 値 を,'+','一','n'が あ る 場 合 に は そ れ ぞ れ1,2,3,に セ ッ トす る 。 ど れ も な い 場 合 に はmodi=0と す る 。 そ し て 次 の 文 字 が 入 っ た 変 数chと,引 き 数 で 渡 さ れ た scaleの 値 に よ っ て 次 の よ う に 場 合 分 け し て hの 値 を 与 え る 。 最 初 にchの 値 に よ っ て 次 の よ う に基 本 的 なhの 値 を 与 え る 。 if(ch=='A')h=21; elseif(ch=='B')h=23; 図7.1音 符 と休 符 の構 文 図 elseif(ch=='C')h=12; elseif(ch=='D')h=14; elseif(ch=='E')h=16; elseif(ch=='F')h=17; elseifh=19; 次 に,modi==1な らhの 値 を1増 や し, modi==2な らhの 値 を1減 ず る 。 そ し て modi==0の 時 に は 次 の よ う に し てhの 値 を 調 整 す る 。 if(ch=='A'){ if(scale〈_‐3)h.‐ ‐; elseif(scale>:=5)h十 一ト; } elseif(ch=='B'){ if(scale<=‐1)h-‐;
elseif(scale>=7)h十 一1-; } elseif(ch=='C'){ if(scale〈==-6)h-一; elseif(scale>=2)h十 十; } elseif(ch=='D'){ if(scale〈=-4)h-一; elseif(scale>==4)h十 十; } elseif(ch=='E'){ if(scale〈=-2)h-一; elseif(scale>=6)h-f-一 一f-} elseif(ch=='F'){ if(scale〈=-7)h-一; elseif(scale>=1)h十 十; } elseif(ch=='G')f if(scale〈e-5)h-一; elseif(scale>e3)h十 →一; } modi==3の と き に はscaleに よ る 調 整 を 行 な わ な い 。 次 に オ ク タ ー ブ の 調 整 を 行 な う 。 整 数 の 値 が 変 数nに 入 っ て い る と し て h=h十n*12; と す る 。 そ し て こ の 値 が1∼127の 範 囲 に 入 っ て い な け れ ば エ ラ ー と す る 。 こ の と きhの 内 容 が 音 の 高 さ を 表 わ す 。 音 長 は 次 の よ う に し て 変 数tに 求 め る こ と が で き る 。 最 初 にt=120と す る 。 そ し て'*'が 現 れ る 度 に t=t*2; を 行 な い,'/'が 現 れ る 度 に t=t/2; を 行 な う 。 次 に ∵ が1つ だ け あ れ ばt=t*1.5;を2 つ あ れ ばt=t*1.75;を 行 な う 。 7.2リ ス ト構 造 音 符 ま た は 休 符 の 場 合 は,リ ス ト構 造 を構 成 し て そ の 先 頭 を 指 す ポ イ ン タ を 引 き 数 と し て 返 す こ と に す る 。 こ こ で い くつ か の 場 合 に ど の よ う な リ ス ト構 造 を 返 す か を 見 る 。 た だ し こ の 文 脈 でgapの 値 は5で あ り,ベ ロ シ テ ィ は70で あ る と仮 定 す る 。 最 初 に 普 通 の 音 符 十B5*. の 場 合 を 見 る 。 こ の 場 合,音 の 高 さ は 前 節 の 計 算 を 行 な っ て23+60+1=84と な る 。 音 の 長 さ は120*2*1.5=360と な る 。 こ の と き次 の よ う な リ ス トが 作 ら れ る 。