-
Notifications
You must be signed in to change notification settings - Fork 1
MIDIの再生
Ryo Suzuki edited this page Nov 6, 2017
·
5 revisions
# include <Siv3D.hpp>
void Main()
{
// MIDI をオープンする
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
// コンピュータ-が MIDI の再生に対応していないか、
// ファイルのオープンに失敗したら終了
return;
}
// オープンした MIDI を再生開始
Midi::Play();
while (System::Update())
{
}
}
※注意 (2017.11.6 アップデート)
Debug ビルドで MIDI を複数回 Open すると assert が発生するバグがあります。
この問題を避けるには Release ビルドで開発してください。
次期アップデート OpenSiv3D では修正されます。
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
while (System::Update())
{
// [P] キーがクリックされたら
if (Input::KeyP.clicked)
{
// 再生中だったら
if (Midi::IsPlaying())
{
// 一時停止
Midi::Pause();
}
else
{
// 再生
Midi::Play();
}
}
}
}
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
while (System::Update())
{
// [P] キーがクリックされたら
if (Input::KeyP.clicked)
{
// 再生中だったら
if (Midi::IsPlaying())
{
// 一時停止
Midi::Pause();
}
else
{
// 再生
Midi::Play();
}
}
}
}
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
while (System::Update())
{
if (Input::KeyP.clicked)
{
if (Midi::IsPlaying())
{
// 停止して曲の先頭に戻る
Midi::Stop();
}
else
{
// 再生
Midi::Play();
}
}
}
}
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
// デフォルトの音量は 1.0
Midi::Play();
while (System::Update())
{
if (Input::Key0.clicked)
{
// 音量 0(無音)
Midi::SetVolume(0.0);
}
if (Input::Key1.clicked)
{
Midi::SetVolume(0.2);
}
if (Input::Key2.clicked)
{
Midi::SetVolume(0.5);
}
if (Input::Key3.clicked)
{
// 音量 1.0 (デフォルト)
Midi::SetVolume(1.0);
}
}
}
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
Midi::Play();
while (System::Update())
{
if (Input::Key1.clicked)
{
// 0.5 倍速
Midi::SetTempo(0.5);
}
if (Input::Key2.clicked)
{
// 通常のテンポ
Midi::SetTempo(1.0);
}
if (Input::Key3.clicked)
{
// 1.5 倍速
Midi::SetTempo(1.5);
}
}
}
# include <Siv3D.hpp>
void Main()
{
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
Midi::Play();
while (System::Update())
{
if (Input::Key1.clicked)
{
// -6
Midi::SetPitch(-6.0);
}
if (Input::Key2.clicked)
{
// 通常のピッチ
Midi::SetPitch(0.0);
}
if (Input::Key3.clicked)
{
// +6
Midi::SetPitch(6.0);
}
}
}
# include <Siv3D.hpp>
void Main()
{
const Font font(30);
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
Midi::Play();
while (System::Update())
{
// 曲の長さ(秒)
const int32 length = static_cast<int32>(Midi::GetLengthSec());
// 現在の再生位置(秒)
const int32 pos = static_cast<int32>(Midi::GetPosSec());
// 再生位置を表示
font(pos, L" 秒 /", length, L" 秒").draw();
}
}
# include <Siv3D.hpp>
void Main()
{
const Font font(30);
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
Midi::Play();
while (System::Update())
{
const int32 length = static_cast<int32>(Midi::GetLengthSec());
const int32 pos = static_cast<int32>(Midi::GetPosSec());
font(pos, L" 秒 /", length, L" 秒").draw();
if (Input::Key0.clicked)
{
// 曲の先頭に移動
Midi::SetPosSec(0.0);
}
if (Input::Key1.clicked)
{
// 曲の 20 % の位置に移動
// 位置は 秒 で指定する
Midi::SetPosSec(Midi::GetLengthSec() * 0.2);
}
if (Input::Key2.clicked)
{
// 曲の真ん中に移動
Midi::SetPosSec(Midi::GetLengthSec() * 0.5);
}
}
}
# include <Siv3D.hpp>
void Main()
{
const Font font(30);
if (!Midi::Open(L"Example/Prokofiev.mid"))
{
return;
}
// ループ再生する
Midi::PlayLoop();
while (System::Update())
{
const int32 length = static_cast<int32>(Midi::GetLengthSec());
const int32 pos = static_cast<int32>(Midi::GetPosSec());
font(pos, L" 秒 /", length, L" 秒").draw();
}
}
MIDI 規格に沿ってメッセージを送信することで音楽を演奏できます。
# include <Siv3D.hpp>
void Main()
{
const Array<std::pair<Key, GMInstrument>> instruments
{
{ Input::Key1, GMInstrument::Piano1 },
{ Input::Key2, GMInstrument::Marimba },
{ Input::Key3, GMInstrument::Harmonica },
{ Input::Key4, GMInstrument::JazzGuitar },
{ Input::Key5, GMInstrument::Violin },
{ Input::Key6, GMInstrument::VoiceOohs },
{ Input::Key7, GMInstrument::FrenchHorn },
{ Input::Key8, GMInstrument::SquareWave },
};
const Array<std::pair<Key, PitchName>> keys
{
{ Input::KeyA, PitchName::C4 },
{ Input::KeyS, PitchName::D4 },
{ Input::KeyD, PitchName::E4 },
{ Input::KeyF, PitchName::F4 },
{ Input::KeyG, PitchName::G4 },
{ Input::KeyH, PitchName::A4 },
{ Input::KeyJ, PitchName::B4 },
{ Input::KeyK, PitchName::C5 },
};
while (System::Update())
{
for (const auto& instrument : instruments)
{
if (instrument.first.clicked)
{
Midi::SendMessage(MidiMessage::SetInstrument(0, instrument.second));
}
}
for (const auto& key : keys)
{
if (key.first.clicked)
{
Midi::SendMessage(MidiMessage::NoteOn(0, key.second));
}
else if (key.first.released)
{
Midi::SendMessage(MidiMessage::NoteOff(0, key.second));
}
}
}
}
- Siv3D の基本
- 図形を描く
- テクスチャを描く
- テキストを描く
- 文字列と数値の変換
- キーボード入力
- マウス入力
- サウンドの再生
- MIDI の再生
- ウィンドウと背景
- 図形のあたり判定
- 乱数
- ダイアログ
- ドラッグ & ドロップ
- アプリの状態
- テキストファイル
- INI, CSV, JSON
- バイナリファイル
- GUI
- アセット管理
- 画像編集
- Web カメラ
- マイク入力
- 経過時間の測定
- HSV カラー
- ファイルダウンロード
- 3D 描画
- 2D のレンダーステート
- 3D のレンダーステート
- パーティクル
- スクリーンショット
- アプリケーションの公開
- さらに学ぶには
- アプリランチャーを作ろう
- 音楽プレイヤーを作ろう
- 横スクロールゲームを作ろう
- ドット絵エディタを作ろう
- シーン遷移をサポートする SceneManager の使い方
- Siv3D ミニサンプル集
- タスクシステムを使う
- スケッチ
- 画像ビューアー
- オーディオスペクトラム
- マイク入力スペクトラム
- 文字色の反転
- 天気予報
- ドットお絵かき
- 15パズル
- ブロックくずし
- 時計
- 音楽プレイヤー
- ピアノ
- ライフゲーム
- シーン管理
- 地球
- 3Dシーン
- 3D交差判定
- Wooden Mirror
- シューティングゲーム
- Image to Polygon
- Sketch to Polygon
- 軌跡
- Plot3D
- テンポとピッチの変更
- 長方形の影
- Twitterクライアント
- Polygon to Mesh
- 3Dテキスト
- アプリ終了の確認
- 地形の生成
- アーカイブファイル
- GUIのアニメーション
- Aero Glassエフェクト
- Glitch
- リンクテキスト
- 付箋
- シーン切り替え(シルエット)
- MIDIシーケンサー
- 数つなぎ
- 画面を揺らす
- 対称定規
- aobench
- MIDIビジュアライザー
- 電卓
- 手書き文字認識
- 顔検出
- 音声合成
- Image to PhysicsBody