
sedが奏でるプレリュード 35
ストーリー by hylom
中身が簡潔なことにびっくり 部門より
中身が簡潔なことにびっくり 部門より
route127曰く、
sedでバッハの平均律クラヴィーア曲集第1巻(WTC Book I)前奏曲ハ長調(BWV846)を演奏するスクリプト「bash.sed」が発表された(github、はてなブックマーク)
Linux上での実行方法
echo | ./bach.sed | aplay -r44100
や、SoXを利用した方法
echo | ./bach.sed | play -r 44100 -e unsigned -b 8 -c 1 -t raw -
が紹介されている。
WindowsでもChocolatey経由でGNU sed 4.8(sed)やSoX(sox.portable)をインストールできるが、そもそもechoの仕様が違うのか実行に失敗した。
cygwin上なら
echo | ./bach.sed > /dev/dsp
とすれば一応音が出るが、録音版と聞き比べるまでもなくおかしい。おそらく低音部しか再生できていない。
# sedの分岐一度も使ったことないな。
試しました (スコア:3, 参考になる)
手元の激遅PC(Cerelon3865U+4GB Debian Sid)で3分近く、CPUパワーを90%前後喰い続けてようやく鳴り始めました。
それでもいきなりBeepでバッハ、はびっくりです。
Re: (スコア:0)
昔のMZの音楽みたいでワラタ。
ひどすぎる (スコア:2, すばらしい洞察)
さすがにbachとbashは……
Re: (スコア:0)
直してやれよhylom…。
Re: (スコア:0)
全部間違ってるならまだしも1つ間違ったくらいでそんなにひどいか?
Re: (スコア:0)
途中のひとつならともかく、最初のひとつだからなぁ。
しかも当該サイトへのリンク部分。そこ一番大切なとこでしょ、っていう。
Re:ひどすぎる (スコア:2)
>しかも当該サイトへのリンク部分。そこ一番大切なとこでしょ、っていう。
あまりにもピンポイントすぎますね
狙ってやったのなら酷い
狙ってやってないのなら、もっと酷い。
Re: (スコア:0)
バッチってなんだ? バッシュだよね。と思ったのではと想像。
Re: (スコア:0)
親父ギャグかと思った。
解説please (スコア:0)
どこが面白いか教えて下さい。
Re:解説please (スコア:2, すばらしい洞察)
こんな「一部の人にしか興味がなさそうな話題だらけ」な場所で、自分が理解できないものを気にするのは時間の無駄ですよ。
Re: (スコア:0)
アレゲはアレゲ以外のなにものでもなさげ
Re: (スコア:0)
なにか旬の時事ネタなのかな?
まあ伸びない記事はいくらでもあるけど、あまり唐突だと気になりますね。
Re: (スコア:0)
まず試せ。
話はそれからだ。
Re: (スコア:0)
CUI環境を使用する事に対してキチガイじみた非難を浴びせてくる勢力が増えてきた
市民権得たと思ってんのか自分が使わないだけでなく話題に上るだけで騒ぎ出す
先のexcel変数話なんかもマウス操作で出来るようになんなきゃ本道じゃ無いみたいなポジ
(変数でなくsedのホールドスペースとタプルを組み合わせた方がイイとも思ったけど見えない部分を人間様の脳内スペースでガッツリ補完するのはいまふうじゃないんだろうな
Re: (スコア:0)
目的外使用っぽいところ
どういうこと? (スコア:0)
手元に実行環境ないんで分かんないんだけど
何がすごいの???
適当なコマンドの組み合わせで偶然音が奏でたの??
それとも単に”bach.sed”に仕込んである音楽データを再生しているだけ???
前者ならすごい話ですが!
何が話題に上がるのか意味わかりません!
Re:どういうこと? (スコア:1)
// しばらく眺めて理解できたが、やっぱりアレゲとしかいいようがない
Re:どういうこと? (スコア:2)
いったいどうやってバイナリデータを出力してるんだろうとソースを見ましたが、
' '(スペース、32)と、'~'(チルダ、127)の繰り返しの矩形波を生成してました。
確かにこれなら、テキスト処理で生成可能ですね。
これだと思いっきりオフセットが出まくりですが、まあ、普通のオーディオ出力ならDC除去用のコンデンサは入ってるだろうしまあ問題ないかな?
で、私の手元には音が聞けるLinux環境がないので、
でmp3に変換したところ、問題なく聞けました。プアなVM環境で実行したせいもありますが、生成にかかった時間は23分… こんなのオンザフライで再生したくないです…
Re:どういうこと? (スコア:1)
文字コードを選べばもっと振幅を稼げるな。
シフトJISで '~' の代わりに '゚' を使うとか?
Re: (スコア:0)
野暮なツッコミですがチルダは126。
Re:どういうこと? (スコア:4, 参考になる)
はい、書き込みボタン押した直後に「違う、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データの変換される、という流れ。
Re: (スコア:0)
どうせならMMLから変換してくれれば使いようが無くもないネタになりそうなのに……
# シェルスクリプトで作ろうとした事はあったけど飽きて書きかけで捨ててしまったなぁ……
Re: (スコア:0)
sedの教材にはよいかもしれない。
8分音符しか再生できない中で,最後の2分音符の再生にチャレンジしてみましたが,8分音符×4個では,位相が連続せずに'プッ'音が挟まる。これ、大昔のPC-8801mkIIのCMD SINGに不満を訴えていた知人を思い出しました。最後の11025を最終音のy103(9)の倍数の11004に変えると音がつながった。そうすると前小説との切れ目もなくなるので,新たな音'F 02'(少しピッチ狂うが)とか作って置き換えたり,色々遊びました。別の曲を組み込むには,休符や温長の処理を組み込むには等もっと正規表現の勉強しなくては。
Re:どういうこと?…遊んでみました. (スコア:0)
単音のBEEP音源で思い出したのが、NECのPC-8801mkIIのデモプログラム.単音で無理やり和音ぽい音を出している.それは、2音の繰り返しなので、sedで展開するにはもってこい.ということで作ってみました.
なお、オリジナルの展開部分に少し変更(改良のつもり)を加えています.音長処理の代わりに同じ音を連続して指定すると'プッ'のノイズが入るため、オリジナルで言う11025文字で切る所を位相が繋がるように切るように変更、また極端に高い音を指定したとき不具合があった(11025文字まで増えるのが遅いため先にセパレータ'Z'を取り除かれた音が一緒に消去される)ので
Re:どういうこと?…遊んでみました.スペースが化けるため'#'に変えて貼り付けなおしです. (スコア:0)
#!/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/$/;A485H460B436C4#4I383D363J344E327F3##K284G270L255a242h230b2#8
Re: (スコア:0)
真似してみて感じたが矩形波の圧縮は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
Re: (スコア:0)
> それとも単に”bach.sed”に仕込んである音楽データを再生しているだけ???
おっしゃるとおりです
bach.sed のソースコードを見て、びっくりしている人は
パソコン初心者とか、自称パソコンに詳しい人、程度の人達です
bach.sed を試してみたら本当に音がでた。びっくり!。フシギダね!って言ってるだけ。
プログラムが書ける人なら、まずソースコードを読みます。そしてすぐに「ツマンネ」と感じるはずです
ソースコードbach.sed には
まず文字列とて音楽データが埋め込まれていています。この時点で興ざめです。
あとはそれを sed で文字置換を繰り返して音のデータに復元しているだけです
Re:どういうこと? (スコア:2)
そらー一発ネタでしょ
バリエーション作って受けると思うなら作ればいいんじゃないでしょうか
Re:どういうこと? (スコア:1)
MMLを演奏できるくらいはんようかされたら素敵
Re: (スコア:0)
なんで自演までしてつまらないって叫ばないといけないのか謎。
Re: (スコア:0)
メガデモ系の作品作っているけど全く評価されてないとかいう人かもね
Re: (スコア:0)
何年か前、某イベントのブースでぼんやりしてたら、見知らぬお兄さんが、「ちょっと端末叩かせて」と言ってきた。
見ていると、telnet(1)で某ホストの某ポートにアクセス。
ターミナルエミュレータに迷彩色の動画が。
彼はデモを披露すると静かに立ち去り、二度と姿を見せなかった。
Re: (スコア:0)
> という類の処理の劣化版でしかありません
劣化させるのに用いた手段が面白いと思います。
あなたがあげたバリエーションは少しも面白くないです。
Re: (スコア:0)
コロンブスが卵を立てたのことをつまらないというのは全然OKと思いますが、その発言のあとに同じような方法で卵を立て始めるのはどうかと思います。
生成された音声データをawkで逆変換する方法を示唆したりすれば、スラド民もアルフレッド・エイホもほめてくれるんじゃないでしょうか。