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

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

  • by Anonymous Coward

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

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

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

    • メロディラインについては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 Anonymous Coward

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

          • Re: (スコア:4, 参考になる)

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

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

            ・音階文字ごとの /~ の連続回数(=周波数の逆数)のテーブルをもとに、音階データを回数データに置換(たとえば「p」は「207」に。これは9進数表記なので10進数で169。44100/169=261Hz)
            これにより、「psvy…」が「Z207Z 58Z 35Z 03Z…」になる。(Zは区切り文字。9進

            • by Anonymous Coward on 2020年04月02日 22時51分 (#3790239)

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

              なお、オリジナルの展開部分に少し変更(改良のつもり)を加えています.音長処理の代わりに同じ音を連続して指定すると'プッ'のノイズが入るため、オリジナルで言う11025文字で切る所を位相が繋がるように切るように変更、また極端に高い音を指定したとき不具合があった(11025文字まで増えるのが遅いため先にセパレータ'Z'を取り除かれた音が一緒に消去される)のでセパレータを変更など.
              位相を揃える処理の副作用で、32分音符を基本とするこのデータでは音長の誤差が無視できない感がある.
              休符は、使わない音(サンプリング周期の3倍)で定義しておき、後で全て' 'に変換する事で実現しています.高齢の方なら後処理が無くても良いかもしれませんが、14.7kHzは一応可聴域のため後処理で取り除いています.この周期3のデータが処理できる様に' +'を' *'に変えています.

              前半の演奏データの圧縮はまだ改良の余地が沢山ありそうですが切りがないのでこの辺で勘弁といった感じです.又使用していない音の定義はは削除していません.基本的に演奏データと音の定義は表計算で作成(変換)しています.元になった演奏データは、まだプログラミング技術が未熟な頃にほとんど手作業で一旦Hu-BASICの演奏データに変換しているため、変換ミスが残っているかもしれませんが、大元のデータが見つからないため確認ができません.sedや正規表現はほとんど初心者なので、勉強させてもらいました.

              #!/bin/sed -Ef
              s/.*/GGFFhhcfddcfddhhccGGFFggffNNPVSSPVSSNNPPggffFFGGDDFGCCGaFFVVSSPNffFFGGDDFGJJhcLLYYVVTQllLLhhLLhcjhLLijflkfjkfijjLLhhLLhcjhccddccdfgdccfgMPNMgNMfggMeffMMddaaDDFCDDFFDDfcddccaahhPPMMNSPPMMPPVVTSPNPPSSVVXnVVXXVVTSPNPPSSVVXnVVXXVVGGFFXnVVXXVV/
              s/(.)/\1\1/g
              s/$/gjgjfcfcNdNdPfVfShShPaVaSGSGNGNGPePegUgUfVfVXhXhVaVanGnGpFuFrhrhnGnGZ1sCsCZ5Z3pFpFpFZ2nhnhnhnhnhnhnhZ5/
              s/(..)/\1\1\1\1/g
              s/(..)(Z1)+/\1/
              s/(Z2)+/RR/
              s/Z3/RR/g
              s/(..)(Z5)+/\1\1/g
              s/$/nhnh;A485H460B436C4 4I383D363J344E327F3 K284G270L255a242h230b2 8c207i 86d 76j 67e 58f 50k 42g 35l 27M 2 N 5O 08P 03Q088S083T078U074V070W066X062Y058m055n052o050p046q044r042s038t036u035v033w03 x030y027z026R00384473463352342232 2 /
              :a
                      s/([a-zA-Y])(.*\1(...))/Z\3\2/
              ta
              s/(Z.)(.)(.)/\1!!!!\2!!\3Z/g
              :b
                      s/([2-8])(.*\1(..))/\3\2/
              tb
              :c
                      s/( +)!/\1\1\1/g
              tc
              s/[^ Z]//g
              s/( *) ( ?\1)/\1~\2/g
              :d
                      s/~ /~~/g
              td
              :e
                      s/Z([ ~]{1438}~*)\W*Z/\1Y/g
                      s/Z(\W+)Z/Z\1\1\1\1Z/g
              te
              s/ *Y//g
              :f
              s/ ~~ / /g
              tf

              親コメント

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

処理中...