パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

sedが奏でるプレリュード」記事へのコメント

  • by Anonymous Coward

    手元に実行環境ないんで分かんないんだけど
    何がすごいの???

    適当なコマンドの組み合わせで偶然音が奏でたの??
    それとも単に”bach.sed”に仕込んである音楽データを再生しているだけ???
    前者ならすごい話ですが!

    何が話題に上がるのか意味わかりません!

    • by nekopon (1483) on 2020年03月25日 11時30分 (#3785108) 日記
      メロディラインについてはbach.sedの頭のほうにテキストで書いてあるのだが、これをsed一本でwave formに展開しちゃってるのがアレゲ。
      // しばらく眺めて理解できたが、やっぱりアレゲとしかいいようがない
      親コメント
      • いったいどうやってバイナリデータを出力してるんだろうとソースを見ましたが、
        ' '(スペース、32)と、'~'(チルダ、127)の繰り返しの矩形波を生成してました。
        確かにこれなら、テキスト処理で生成可能ですね。
        これだと思いっきりオフセットが出まくりですが、まあ、普通のオーディオ出力ならDC除去用のコンデンサは入ってるだろうしまあ問題ないかな?

        で、私の手元には音が聞けるLinux環境がないので、

        $ echo | ./bach.sed | ffmpeg -f u8 -ar 44.1k -ac 1 -i - bach.mp3

        でmp3に変換したところ、問題なく聞けました。プアなVM環境で実行したせいもありますが、生成にかかった時間は23分… こんなのオンザフライで再生したくないです…

        親コメント
        • by minet (45149) on 2020年03月25日 14時45分 (#3785230) 日記

          文字コードを選べばもっと振幅を稼げるな。
          シフトJISで '~' の代わりに '゚' を使うとか?

          親コメント
        • by Anonymous Coward

          野暮なツッコミですがチルダは126。

          • by taka2 (14791) on 2020年03月25日 15時14分 (#3785249) ホームページ 日記

            はい、書き込みボタン押した直後に「違う、127はDELだー」って気づきました。
            黙ってればバレないかと思ったんですが無理でしたか…
            って、それだけじゃアレなので、コード解説

            譜面は「psvyBpqwACoqvAC…」という音階に対応するアルファベット列の形で、初期値として持たせています。音長データなし。
            そこから、

            ・音階文字ごとの /~ の連続回数(=周波数の逆数)のテーブルをもとに、音階データを回数データに置換(たとえば「p」は「207」に。これは9進数表記なので10進数で169。44100/169=261Hz)
            これにより、「psvy…」が「Z207Z 58Z 35Z 03Z…」になる。(Zは区切り文字。9進数ですが1の代わりにスペースで、「s」は「 58」に置換されていますがこれは158(9)の意。以後読みやすさのためスペースは_で表記します。)

            ・回数を、その個数のスペースに置換
            処理内容だけ書くとシンプルですが、sedには回数指定ループなんて概念がありません。「置換に成功する間は繰り返し」はできるので、それをうまく使ってます。
            8→44、7→43、6→33、5→32、4→22、3→21、2→__
            という置換テーブルにより、たとえば「7」は、「7→43→2221→_______」のように、その個数のスペースに展開。

            あとは、9進数3桁については3倍コピー処理。
            「abc」を「a!!!!b!!c」に変換。ここからを「( +)!」を「\1\1\1」に3倍コピー。1桁目は!4個で3倍コピーが4回の81倍、2桁目は9倍。
            これにより「207」は、先頭2は「__!!!!」から81倍コピーされてスペース162個になり、計「スペース169個」になる。

            ・スペースの後ろ半分を~に置換して、矩形波音素完成。(スペース169個は、スペース84個・チルダ85個に)

            ・出来た音素を、11025文字になるまでコピーして増やす(3倍コピーを繰り返して、11025文字を超えたら、11026文字目以降を削除)。
            これで、「p」から、「261Hz 0.25秒のPCMデータ」に変換完了。

            以上の処理により、音階データがPCMデータの変換される、という流れ。

            親コメント
            • by Anonymous Coward

              どうせならMMLから変換してくれれば使いようが無くもないネタになりそうなのに……
              # シェルスクリプトで作ろうとした事はあったけど飽きて書きかけで捨ててしまったなぁ……

            • by Anonymous Coward

              sedの教材にはよいかもしれない。

              8分音符しか再生できない中で,最後の2分音符の再生にチャレンジしてみましたが,8分音符×4個では,位相が連続せずに'プッ'音が挟まる。これ、大昔のPC-8801mkIIのCMD SINGに不満を訴えていた知人を思い出しました。最後の11025を最終音のy103(9)の倍数の11004に変えると音がつながった。そうすると前小説との切れ目もなくなるので,新たな音'F 02'(少しピッチ狂うが)とか作って置き換えたり,色々遊びました。別の曲を組み込むには,休符や温長の処理を組み込むには等もっと正規表現の勉強しなくては。

            • 単音のBEEP音源で思い出したのが、NECのPC-8801mkIIのデモプログラム.単音で無理やり和音ぽい音を出している.それは、2音の繰り返しなので、sedで展開するにはもってこい.ということで作ってみました.

              なお、オリジナルの展開部分に少し変更(改良のつもり)を加えています.音長処理の代わりに同じ音を連続して指定すると'プッ'のノイズが入るため、オリジナルで言う11025文字で切る所を位相が繋がるように切るように変更、また極端に高い音を指定したとき不具合があった(11025文字まで増えるのが遅いため先にセパレータ'Z'を取り除かれた音が一緒に消去される)ので

        • by Anonymous Coward

          真似してみて感じたが矩形波の圧縮はmp3はとても苦手。矩形波は様々な周波数成分を含んでいるため、ファイルサイズも小さくならず、ノイズだらけ.この様なデータは可逆圧縮が徳井とするなど当たり前だが実感した.

          -rw-r--r-- 1 1100504 3月 25 20:54 bach.mp3
          -rwxr-xr-x 1 3962 3月 25 20:39 bach.sed
          -rw-r--r-- 1 6064092 3月 25 20:59 bach.raw 生成される波形データ( ~の羅列)
          -rw-r--r-- 1 65579 3月 25 20:59 bach.raw.zip

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

処理中...