MIDIについて
MIDIは、Musical Instrument Digital Interfaceを略した言葉です。この形式は、音楽に関する情報、つまり音符を表現した情報を記録し、それを電子楽器の間で送受信できるようにする規格です。
ランダムに音符を設定しMIDIファイルとして出力するアプリケーションを制作します。
MIDIファイルをゼロから作成するため、MIDIファイルの形式と知識、2進数と16進数のデータを確認しながらファイルを作っていく方法をご紹介します。
また、制作手段はC++でアプリケーションのコアを作り、Webアプリとして公開するためWebAssemblyを使用します。
MIDIファイルとは何かを簡単にご説明します。
MIDIは、Musical Instrument Digital Interfaceを略した言葉です。この形式は、音楽に関する情報、つまり音符を表現した情報を記録し、それを電子楽器の間で送受信できるようにする規格です。

上の写真は、筆者が使用するCubase(バージョン12)という音楽制作ソフトウェアです。ほとんどの音楽制作ソフトウェアは、画面下のピアノロールという領域に、音符を表現した「横の棒」を書き入れることで音を記録します。
横の棒は、音程(音の高さ)と長さを持ち、鍵盤でいうならどれほど強く押したかに当たるVelocityという強さが記録できます。そのような情報をたくさん用意し、画面右に見えている楽器ソフトウェアに送ることで、最終的な音を作り出します。

このプロジェクトの最終形は、以下のリンクで確認できます。書き出されたMIDIファイルは音楽ソフトウェアで使用でき、基本設定のピアノ音色でもプレイヤによっては聴くことができます。
こちらでご確認くださいプロジェクトの構成をイメージを中心にラフな形で考えます。
それでは、まずはプログラミングでファイルにデータを書きこむことから始めましょう。C++言語で、ファイルに何らかのデータを書き込むには、C++が提供するofstreamという道具を使用します。
下のコードの最初に、
#include < iostream >
#include < fstream >
を入れましょう。
そうすることで、InputとOutput(io)を流れるデータのように?(Stream?)扱える道具を使えるようになり、また、ファイル(f)に関しても扱えるようになります。
//
#include < iostream >
#include < fstream >
int main () {
// 入力を受け付けるための空間を準備
char inputData[100];
// OFSTREAMのオブジェクトを生成
std::ofstream outputFile;
// ファイル名を指定して開く
outputFile.open("書き出したファイル.dat");
// ユーザに指示を見せる
std::cout << "何か入力してEnter!(100文字)" << std::endl;
std::cout << ">> ";
// ユーザの入力を受け付ける
// 一行分入力される、つまり改行文字が入っている箇所まで入力となる
// または、
// 区切り用の文字を指定して別の行にすることも可能
std::cin.getline(inputData, 100);
// 保存されたデータをファイルとして入れる
outputFile << inputData << std::endl;
// 書き込み用として開かれている
// ファイルオブジェクトを閉じる
outputFile.close();
return 0;
}
g++ main.cpp -o main
は、main.cppファイルを、mainという名前の実行できるファイルに変換する命令です。
それで出来たmainというファイルを、./mainで実行しています。
実行ができるファイルは、WindowsやMac、Linuxなど、実行をする環境によって異なります。
例えば、Windowsでは実行できるファイルをEXEという拡張子をつけますし、MacやLinuxには拡張子がありません。