« 2017年度版カリキュラムマップ | トップページ | タイ・ モンクット王工科大学・ギフト先生による1年生向け特別講義 »

シーケンサを作る

2017年7月27日 (木) 投稿者: メディア技術コース

みなさん、こんにちは、

 
メディア専門演習は20種類もの専門的な演習から好きなものを2種選んで履修できるメディア学部独特の演習です。その中の1つ「音・音声インタフェース」の13回目ではシーケンサを作りました。12回までで、楽器音を発音するしくみであるシンセサイザや人の声好みの高さで発声させることができるボコーダを作ってきました。これらは、すべてプログラムで作るのです。そして、楽譜に合わせてそのような音や音声を合成するプログラムを動かしてメロディを奏でる部分がシーケンサです。
1つのパートの時系列をトラックと言います。演習ではメロディと伴奏が演奏できるように、2つのトラックを扱えるものを作りました。このトラック情報を記録するため「構造体」と呼ばれるデータ表現を用います。構造体は
親変数名.子変数名
の形式で表され、複数の子変数を親変数に所属させることができます。
から信号処理のフリーソフトをダウンロード・インストールして試してみてください。
例えば、猫の名前と年齢を一緒に管理したいとします。1匹目の猫は名前が「ミケ」で2歳、2匹目の猫は名前が「たま」で5歳とします。
 
--> neko.name = 'ミケ'
--> neko(1).age = 2
--> neko(2).name = 'たま'
--> neko(2).age = 5
 
のようにすると、nekoという親変数の配列ができます。親変数の各要素には name と age という2つの子変数がついていて、neko(1)には1匹目の猫の名前と年、neko(2)には2匹目の猫の名前と年がはいります。
中身はscilabのコンソールから変数名を打ち込むの表示されます。例えば、次のようになります。
 
--> neko.name
ans  =
       ans(1)
ミケ
       ans(2)
たま
--> neko.age
ans  =
       ans(1)
   2.
       ans(2)
   5.
 
この例では1匹の猫のデータは名前と年齢だけですが、好きな食べ物や、毛の特徴などいろいろあっても neko(1) で扱えて便利ですね。
 

さて、ここまで書けば、どのように音楽のトラック情報を構造体で表現できるか想像できると思います。

 
トラック1(1番目の音符).周波数 = ドの周波数
トラック1(1番目の音符).長さ = 四分音符の長さ
トラック1(2番目の音符).周波数 = ラの周波数
トラック1(2番目の音符).長さ = 四分音符の長さ
 
のように作成すればいいわけです。実際は日本語の変数名は使えませんから
 
tra1 ( 1 ) . freq = 523
tra1 ( 1 ) . dur = 0.25
tra1 ( 2 ) . freq = 880
tra1 ( 2 ) . dur = 0.25
 
のようにします。
実際のシーケンサはMIDI (Musical Instrument Digital Interface) という規格に従った書き方をしますが、この演習では、構造体の使い方を学ぶ目的も兼ねて、このようなプログラミングを行いました。
 
相川 清明

在学生向け」カテゴリの記事

授業紹介」カテゴリの記事

高校生向け」カテゴリの記事

« 2017年度版カリキュラムマップ | トップページ | タイ・ モンクット王工科大学・ギフト先生による1年生向け特別講義 »