🥁

【個人開発】ドラムパターン生成サービス「どんどん」をリリースしました

2023/02/22に公開

このプロダクトは、株式会社mofmofの「水曜日の個人開発」にサポートされています。
https://indie-dev.mof-mof.co.jp

はじめに

あなた誰?
Railsエンジニアでーす✌️

何を作ったの?
ドラムパターン生成サービス「どんどん」を作りました。

ドラムパターンって何?
楽器のドラムってあるじゃないですか、あれのリズムです。

「どんどん」って書いてるけど、ロゴは「丼」3つだし「どんどんどん」では?
いいの。「どんどん」なの。

なんで作ったの?
ドラム叩いたことないし、作曲するときにドラムパターン作るの面倒くさくて「あ!作ろ!」ってなって作りました。

何ができるの?
ドラムパターンの生成と再生、生成したパターンをMIDIファイル形式でダウンロードできます。

やるじゃん。
でしょ。

使った技術

実装について

RubyでMIDIファイルを生成して、それをブラウザ上で再生するようにしてます。

  1. 以下の4つのパートをどのように叩くか画面上で選択し、選択した情報をサーバーにpostします
    • キック
    • ハイハット
    • クラッシュシンバル
    • チャイニーズシンバル
  2. それぞれのパートをFormオブジェクト内でパターン化します。
  3. パターン化したパートを、時系列順に「音を鳴らす」「音を止める」でMIDIファイルに書き込んでいきます。midilib の仕様(もしかしたらMIDIの仕様)が独特で頭がこんがらがりながら実装しました。。。
  4. MIDIファイルが完成したら、Hotwireを使って画面上にプレイヤーを表示します。

そして、スネアをカスタマイズできるようにするのを忘れていたことに今気づきましたね。

エディターでは、視覚的に音のオンオフを操作できるようにしました。

現在、以下の3つのパートを操作できます。

  • キック
  • ハイハット
  • スネア

オンの時は 1 オフの時は 0 で配列を作ってます。

patterns = {
  hihat: [ 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  snare: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
  kick:  [ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 ],
}

true false じゃないなんて、なんだかRubyっぽくないね。」
これには理由があります。ハイハットには、「オープンで叩く」「クローズで叩く」「叩かない」 の3パターンが存在するからです。
別々の配列で管理するのも考えましたが、「オープンで叩く」「クローズで叩く」が同時に起きてはいけないので(ハイハット2つ用意するんか??ってなるから)同じ配列で管理するのが一番効率的だし、整合性が取れると思ったのです。

苦労した点

  1. midilib の日本語記事がほとんど世に出回っていない!
    別記事でその辺りも触れられたらいいなーと思ってます!
  2. MIDIファイルで、ドラムのチャンネル数がわからなかった
    MuseScoreでドラムパートをMIDIファイルにエクスポートして、それを midilib で分解して確認しました・・・骨が折れる
  3. MIDIファイルで、各パートが何番かわからなかった
    MuseScoreで各パートをMIDIファイルにエクスポートして、それを midilib で分解して確認しました・・・骨が折れる
  4. 音を鳴らす、音を止めるを時系列順に入れていく。しかも、同時に鳴らす場合は2つ目以降の length0 にする(1つ目は0以外を指定する必要がある。。。)必要があった
    その辺りをクリアにするために、配列で管理することにしました。
    最初は、音の始まる位置とパートをハッシュで管理してたのですが、もはや無理になった・・・
  5. 週1日しか開発に時間をとっていないので、何やってたかすぐ忘れる
    ログをNotionに残していたので、それを見ながら思い出していました。
    1週間前の自分へ。バグが残ってるならその旨書いておいて欲しかったなー。

最後に

これで作曲活動が捗りますね!
是非、作曲の際には「どんどん」を使ってみてください!

そして、どんどん改善していきたいので、フィードバックお待ちしてます!

あと、もっと個人開発していきたいです!

Discussion