メニュー
ブログ更新履歴
コンテンツ更新履歴
リンク
  • rlib-MML WebApp
  • MML (Music Macro Language) をコンパイルし、再生やファイル出力(MP4、標準MIDIファイル)をブラウザ上で行えます。
  • Magome
  • クラウドベースのMIDIシーケンサ
    音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています。
twitter
  カテゴリー ‘C++’ のアーカイブ
Thinkridge スタッフ 雑感を綴る

rlib-MML を npm packageで公開しました

rlib-MML アプリの MML のパース処理は C++ で書かれており OSS としてGitHub で 公開していますが、このたび JavaScript からも簡単に利用できるよう npm package を公開しました。
C++ の段階で Wasm へのコンパイルが可能な形でしたが、さらに扱いやすい形にしました。
@thinkridge/rlib-mml

npm package 化のコードも GitHub で公開しております。
サウンドフォントのデコード処理と同じレポジトリにて、サンプルコードも含めたモノレポ構成になっています。
https://github.com/thinkridge/rlib-Sounds

これにサウンドフォントデコーダーである @thinkridge/rlib-soundfont も合わせれば、ブラウザだけで MML → MIDI → SoundFont 再生まで完結します。

簡素ですが React を使ったサンプルアプリも前述のレポに含まれています。

react-demo
rlib-Sounds_demo

@thinkridger/lib-mml、@thinkridge/rlib-soundfont どちらもビルドに Emscripten / Boost を使用していますが、利用者は npm パッケージとしてそのまま使用でき、特別な知識は不要です。

サウンドフォント、MML、MIDI などにご興味ある方はぜひお試しください。
問題の報告や改善案、御助言などありましたらご一報いただけますと幸いです。

なお rlib-MML アプリ 及び WebApp 版は、FM音源サポートやサーバーによるC++ネイティブ処理といった特徴が付加されています。
こちらもぜひお試しください。
https://rlib-mml.thinkridge.jp

サウンドフォントデコーダーをGitHub及びnpm packageで公開しました

rlib-MML アプリではサウンドフォントを利用した音声出力を行っています。
このたび、その部分のソースコード一式を GitHub にて公開しました。
https://github.com/thinkridge/rlib-Sounds

サウンドフォントのデコード処理は C++ で記述していますが、Emscripten を用いて WebAssembly としてビルドすることも可能です。
そこで、このデコーダーを JavaScript から簡単に利用できるよう、npm package としても公開しました。ブラウザおよびnode.jsのどちらでも利用できます。
@thinkridge/rlib-soundfont

npm package では、標準MIDIファイルからWAVファイルへ変換するというシンプルなインターフェースのみを提供していますが、C++ レイヤでは波形データを直接扱える形にしています。
ただし、現時点では親切なドキュメントを用意できていない点はご容赦いただければと思います。

サウンドフォントにご興味ある方はぜひお試しください。
問題の報告や改善案、御助言などありましたらご一報いただけますと幸いです。

なお、rlib-MML アプリではFM音源のレンダリングも実装していますが今回の公開には含まれていません。(ymfm に手を加えて利用しているためどう扱うべきか検討中です)

rlib-MML アプリ FineTune,CoarseTuneをサポートしました

MML で FineTune,CoarseTune をサポートしました。

FineTune はチャンネルのチューニングを行います。
半音を100としたセントという単位で指定します。

たとえば、標準のA(ラ)=440Hzではなく442Hzで再生させたい場合は

FineTune(7.85)   // 1200 * log2(442.0 / 440.0) = 7.8514・・・ 

とすればそれっぽく再生されます。
他にも、ピッチを少しズラしてディレイっていう昔ながらのテクにも使えると思います。

CoarseTune はチャンネルの半音単位のチューニング(キーの上げ下げ)です。

CoarseTune(-2)     // 例:全音下げ

さらに、FM音源で未実装だったピッチベンドの対応を行いました。前述のFineTune、CoarseTuneも機能します。

rlib-MML アプリ、rlib-MML WebApp はテキスト入力だけで曲が作れます。ぜひお気軽にお試しください。

rlib-MML WebApp はブラウザでご利用いただけます。
https://rlib-mml.thinkridge.jp

rlib-MML アプリ はiOS、macOS、Android に対応しています。

rlib-MML アプリ FM音源による再生をサポートしました

FM音源による再生をサポートしました。
実験的な機能追加です。
OPN(YM2203)のFM音源部の実装です。OPNの同時発音数3音という制限はなく実装しており、パンも可能としています。

CreatePort(name:tr1, channel:1, instrument:fm)   // nameとchannelは何でもOK

と記述することでFM音源を扱うトラックになります。

音色の定義を行うには、このFM音源トラックにて以下のように記述します。

DefinePresetFM(no:0, name:"piano",   // noがProgramNo、nameは何でもOK
// AR  DR  SR  RR  SL  TL KS ML DT
   28,  8,  0,  8,  3, 31, 2, 1, 2,
   26,  3,  1,  6, 10,  0, 0, 2, 7,
   27, 20,  0,  9,  2, 44, 0, 5, 2,
   28,  7,  2,  6,  6,  0, 0, 1, 5,
// AL  FB
    4,  7,
)

で、MMLを記述すると再生です。

@0 cde   // ProgramNo:0 で ドレミ

サンプルとしてFM音源を使うテンプレートを用意しています。参考にしてください。

FM音源エンジンは ymfm を利用しています。開発者の方に感謝です。
https://github.com/aaronsgiles/ymfm

制限事項

  • FM音源はサーバーレンダリングでのみ有効です。
  • 処理はかなり重いです。高速化が課題です。
  • ピッチベンドはまだ未実装です。すみません。
  • OPNのPSG部は未サポートです。

問題の報告、改善案や御助言など何かありましたら御一報頂けますと幸いです。よろしくお願いします。

rlib-MML アプリ、rlib-MML WebApp はテキスト入力だけで曲が作れます。ぜひお気軽にお試しください。

rlib-MML WebApp はブラウザでご利用いただけます。
https://rlib-mml.thinkridge.jp

rlib-MML アプリ はiOS、macOS、Android に対応しています。

rlib-MML 機能追加しました

rlib-MML アプリ自体の更新ではなく、MMLエンジンのみの更新です。

サブシーケンス機能を追加しました。楽曲を部品として楽曲の中で利用することが可能です。
https://github.com/tr-takatsuka/rlib-MML/releases/tag/v1.2.0

webアプリ版でも使えます。
https://rlib-mml.thinkridge.jp/

rlib-MML アプリ はテキスト入力だけで曲が作れます。
登録などは不要で無料でお使いいただけます。ぜひお気軽にお試しください。

iOS、macOS、Android に対応しています。

Download on the App Store
Google Play で手に入れよう

rlib-MML アプリ ver1.0.6 公開しました

標準MIDIファイルをインポートする機能を追加しました

  • プロジェクト新規作成で、ローカルにある標準MIDIファイル(*.mid)を指定することで、MMLに変換したプロジェクトが作成されます。
  • 既存の標準MIDIファイルをMMLに変換すること、および再生することが可能です。お試しください。

その他

  • Flutter 3.16 を採用しました。
  • 気が付いた箇所の不具合修正しました

rlib-MML アプリ はテキスト入力だけで曲が作れます。
登録などは不要で無料でお使いいただけます。ぜひお気軽にお試しください。

iOS、macOS、Android に対応しています。

Download on the App Store
Google Play で手に入れよう

rlib-MML 機能追加しました

rlib-MML アプリ自体の更新ではなく、MMLエンジンのみの更新です。

和音を表現する記述方法を追加しました。
https://github.com/tr-takatsuka/rlib-MML/releases/tag/v1.1.0

さらにweb版には、標準MIDIファイルをインポートする機能を追加しました。
https://rlib-mml.thinkridge.jp/

rlib-MML アプリ はテキスト入力だけで曲が作れます。
登録などは不要で無料でお使いいただけます。ぜひお気軽にお試しください。

MMLコンパイラをGitHubとウェブサイトで公開しました

MMLコンパイラ(クラスライブラリ&コマンドラインアプリ)を GitHub で公開してみました。C++17 での実装です。

rlib-MML

MML とは、演奏データをテキストで書くというもので、80年代頃からゲームソフトの音楽や効果音制作で使われてた言語(って言っていいのかな)です。
が、特に決められた規格があるわけでもなく、各々(ゲーム会社さんやプログラマさん)がよかれと思った文法を取り入れていた気がします。
そんな中でも、”cdefgab”はドレミファソラシ、”r”は休符。など、どんな音源ドライバであっても通用する暗黙の標準仕様のような文法があり、今回のMMLコンパイラもそのあたりに沿っているつもりです。

/*
“音源ドライバ”というのは、曲や効果音を再生するアプリの当時の総称です。
*/

というわけで MML 自体は目新しいものではありませんが、自分への課題ということで C++17 でコードを焼き直しました。
さらに、作ったMMLコンパイラをお手軽に試すという目的も兼ねた自分への課題として、ウェブサイトも構築してみました。

https://rlib-mml.thinkridge.jp/

MML の記述から再生、標準MIDIファイル出力まで、ブラウザ上で一通りのことが出来ます。
ご興味あればぜひ触ってみて頂きたいです。

最後に。
色々な OSS やツ-ル開発者様、ネットに情報を載せてくれてる方々などに大変感謝です。ありがとうございます。

JSONパーサーをGitHubで公開しました

JSONパーサーを GitHub で公開してみました。C++11 での実装です。

rlib-Json

とはいえ、世には沢山のJSONパーサーが存在している上に Boost.JSON も出来たようですし、いまさら? というご感想ごもっともだと思います。

なので現実的には既存のものを採用すればよいと思うのですが、JSON の仕様は比較的シンプルなので自前実装もアリかなと思いました。

JSON にコメントを書きたいし、配列&連想配列の末項のカンマ記述を許したい。という付加機能あたりと、JSON Pointer なる仕様も(緩く)実装しています。
C++11未満とストリーム入力のパースは切り捨てているので、コード量は少な目だと思います。
昨今のライセンス事情よくわかっておりませんが、いちばん緩い条件と思われる CC0 にしています。

Boost.JSON が出来たことで、C++界隈でJSONを扱う場合はコレが本命になるのかなーと漠然と思っています。
となると Boost.property_tree のほうの JSONはどうするんだろという疑問もわきます。
property_tree には XML の実装もありますが、どちらも property_tree っていうデータ構造に対するちょっと便利な付加機能っぽい印象だったので、用途が違うのかなとも思いました。

自動アップデータ兼ランチャー

自動アップデータ兼ランチャーを GitHub で公開してみました。

magome で作った自動アップデート機能を、目的や内側のアルゴリズムはそのままに、VisualStudio2017、boost など今のテクノロジでコマンドラインツールとして焼き直したものです。

そもそもはその当時スマホアプリとか、PCアプリの chrome とかもそうですが、ユーザーが意識することなく自動でアップデートして常に最新を利用出来る!ってイイネと思ったのが始まりです。

当時のPCアプリは(今もそうかもですが)、アップデートするときはユーザーが能動的にダウンロードしてインストーラを起動して指示に従う。というのが主流でした。

が、そんなことを意識しなくても勝手に最新になってほしいなと。(勝手にアップデートされたら困るケースがあることも承知しています・・)

Windows には ClickOnce というのもあったけど使い勝手も悪くイマイチ流行らなかった(ような気がする)し・・。

で、アプリの自動アップデートです。

差分を配信する為に配信専用データを作るための専用ツールとか、サーバーに配信用アプリをインストールとか、そういうケースを見てきました。
が、ものぐさな自分的には敷居高すぎます。なので、
手間なく!ミスなく!お手がるに!ってことを重視して以下の感じにしました。

・アップデータ作成は、アプリのファイル群を一般的なツールで ZIP に固めるだけで完成!
・配信サーバーは最低限の web サーバーで可。サーバー側に配信アプリをインストールとかは不要。
・アプリは起動時にサーバーをチェックしてアップデータがあれば勝手にアップデート。
・ダウンロードするのは更新に必要な最低限のファイルのみ。

です。
作ってみたら結構便利で他でも使ってました。
特に業務アプリでは、勝手にアップデートして常に最新、全ユーザーが同じバージョンを使うってことを有難がる場合は多いです。
これはオンラインゲームとかでもありがちな要求な気がします。

 

というわけで使えるケースがあれば使ってみて欲しいなと思います。
が、込み入った状況など、そのままじゃ使えない場合も多いと思いますので、そんな場合はお気軽にご相談頂ければと思います。

最後に。
C++ の仕様を作ってる方々、boost などのライブラリを開発している方々に感謝です。


アーカイブ