[DRUMSOFT 旧BBS][全部]

文字から音を作るスレ

utaは最近pythonに凝っているらしいので、その過程を実況中継します。巷ではcircuit bending なんていうそこらへんの安い楽器の電子回路をメクラ滅法弄って、ステキな音を出すっていうプロジェクトが流行っているらしい。http://www.youtube.com/results
36 hrk 2011-08-25 17:45 permalink
で、文字から音を作る試みは
https://github.com/drumsoft/OtoPerl
で続けてまーす。
35 hrk 2011-08-25 17:43 permalink
>>13
訂正: FM はこうでした。

sine_phase = 0

def generate_sine(generate_time):
mod_phase = 2.0 * pi * generate_time * mod_freq / samp_rate
modwave = sin( mod_phase )
sine_phase += 2.0 * pi * (freq + fm_rate * modwave) / samp_rate
sinwave = amp * sin( sine_phase )
return sinwave

8 とか 13 のコードだと modwave の変化に対する sine_phase の変化量(Δsine_phase/Δmodwave)が
8: Δsine_phase/Δmodwave = 2.0 * pi * generate_time * freq * fm_rate / samp_rate
13: Δsine_phase/Δmodwave = 2.0 * pi * generate_time * fm_rate / samp_rate
なので、 generate_time が大きくなると変調が効き過ぎておかしくなるね。

というわけで、
Δsine_phase/Δgenerate_time = 2.0 * pi * (freq + fm_rate * modwave) / samp_rate
を毎フレーム毎に sine_phase に加算してあげるのが正しい計算かと。

この場合 sine_phase を generate_sine 用に保持する必要があるので、オブジェクトとかクロージャにするといいですね。
34 hrk 2009-06-25 03:30 permalink
ライブコーディング…そういうの作ろうと思ってたんだよなあ…
ChucKやってみよう。
strongly-timed ってダジャレが好きです!
33 uta 2009-06-25 00:35 permalink
業者からのSPAM書き込みをbeep音の1bitサンプリングで変換して歌うスクリプトとかあれば、とりあえず少なくともたにくんの好きそうな物スレに関してはスレ違いじゃなくなるのに!っと思った。
32 uta 2009-06-25 00:31 permalink
>>31
Haskellってのがまたgeekっぽいね!

ちょっと前に話題になってた
ChucKっての思い出した。
On-the-flyとかいって音を出しながら
ライブでコーディングできる言語を目指したらしい?
http://chuck.cs.princeton.edu/

これ音とか制御の時間指定に、
標準で、dayとかweekとか、
思い切った値を用意してるところが気に入ってた。
http://chuck.cs.princeton.edu/doc/language/time.html

デモ
http://www.youtube.com/watch?v=hFAh-pgxGyc

講演、長い。
http://www.youtube.com/watch?v=2rpk461T6l4




31 hrk 2009-06-19 01:30 permalink
ブログのサブタイトルに「文字から音を作る」って書いてある!

http://yaxu.org/more-hackery/

内容は、MMLの様なシーケンサーの様なものをHaskellで実装しました的な感じ?
30 hrk 2007-10-24 22:31 permalink
beep音の1bitサンプリングで歌うワームとか流行ればいいのに(危険思想)。サーバーとか、普通サウンドカードついてないけどbeep音は鳴る様になってるから。
・ある日サーバールームから聴こえる「デイジー、デイジー」という歌声。「気が狂いそうなほど、きみが好き」
・年末に鳴るとサーバールームから第九の大合唱が…
とか
夢がひろがるなあ。
29 hrk 2007-10-24 22:24 permalink
MMLやっててようやくbeep音使った1bit samplingの仕組みが分かった。beep音の波形を前半半分だけ使って、 [-1.0,1.0] で振動するスピーカーを、 0.5 を中心に [0,1.0] の範囲で振動させればいいんだ。
これなら職場で使ってる業務用のハンディターミナルとかにも喋らせられちゃうな。
28 hrk 2007-10-24 02:11 permalink
http://d.hatena.ne.jp/leapfrog/ utaも参戦して下さい!はてなMMLで文字から音大会。
27 hrk 2006-05-20 01:41 permalink
いや、僕も2.3.5だよ。os10.4入れたまんまで。そして同じ警告が出ています。

1個目は「パイソン2.4以降では 0x7fffffff より大きい8進数/16進数リテラルの最初の1ビットは符号として扱われなくなる予定だよ(今は符号だけど)」という警告で、今回のコードではどっちでも問題ない筈なので無視。
2個目は「パイソン2.4以降ではintを左ビットシフトして桁を落としたり符号を変えたりしている部分で、longが返されちゃうよ(今は桁が落ちたり符号が変わったりしてるけど)」という警告。これもどっちでも問題ない筈なので無視です。

でも本当にどっちでも問題ないか心配になって来たよ。ヽ(´ω`)ノ
2.3.xまでは基本的に整数は32bitで、それ以上は特殊な扱いだったのが、64bitのlong型が標準で導入されるという理解でOKかな?
26 wta 2006-05-19 23:26 permalink
ロートルぶろうとしていまさらUNIXプログラミング環境を古本屋でゲットした俺が来たよ。ヽ(´ー`)ノ(←これもロートル?)

なんかwarningが出てるとおもったらバージョン2.4で挙動が変わるのか、多分hrkunはversion2.4か。
俺は事情により2.3.5なのです。一回まっさらにして淹れなおすかな。

gensineAIFF.py:88: FutureWarning: hex/oct constants > sys.maxint will return pos
itive values in Python 2.4 and up
if value & 0x80000000:
gensineAIFF.py:91: FutureWarning: x<<y losing bits or changing sign will return
a long in Python 2.4 and up
value <<= 1

25 hrk 2006-05-19 22:36 permalink
idleってideなのか。TkのUIとかもビュジュアルぽい感じで作れるのかな。でもCotEditor+Terminalが使い慣れてていいなあ。makeで(←この辺がロートル)出力したファイルを聴いたり変換したりもできるし。
Numericのインストールはちょっと待つことにしました。utaの次バージョンで使用されているライブラリを入れよう。
ちなみにノイズが混じったりパンしなかったバージョンの.pyが残っていたら欲しいです。直したいから。行列演算モジュール使うのもいいんだけど、できれば配列に波形を全部入れないでちょっとづつディスクに出力したい(←この辺もロートル)し…。packのフォーマットにちゃんとエンディアン指定も入れたんだけどなあ。
24 uta 2006-05-17 01:28 permalink
了解です。というか下のはまだ
途中のものというかんじだったので新エントリ立てるまでもないとおもったら寝れなくなって収集がつかなくなたのでした。

いまはidleという実行環境を使っています。OSXにもあるはず。
改行コードがLFってひぇー、
改行コードが崩れると実行できなくなるのか、まずいね。
気をつけます。
開発実行環境としてはこのipythonが使いよいみたいです。
http://ipython.scipy.org/

python専用のCPAN shellみたいな統合したモジュールのレポジトリみたいなのはないみたいだけど、
OSXだとFinkでpythonモジュールもインストールできるみたい。
http://pdb.finkproject.org/pdb/search.php?summary=python

というかNumeric(配列、行列数値演算モジュール)も
Numeric -> numarray -> numpy
といういくつかの種類があって
けっこう混沌としてるみたいです。
今後は、Numericではなくてnumpy とscypyを使おうと思っています。理由は、グラフのplotやFFT演算あたりが充実してそうだから。
http://numeric.scipy.org/
http://www.scipy.org/Download

変換のバグは、詳しく切り分けてないんですが、
エンディアン達が叛乱を起こしてるのかも。
症状としては、ノイズが混じる、パンしない、などです。
今週ちょっとこれから忙しくなるので次回の更新は土曜以降を予定。
23 hrk 2006-05-16 22:42 permalink
コメントなげ〜
uta君新しい.py上げた時とか、1日毎くらいに新エントリにしてくれると読み易くなって僕は嬉しい!
22 hrk 2006-05-16 22:41 permalink
utaってdosプロンプトからpython実行してるの?
改行コードがLFでプログラムの最初に
#!/usr/bin/python
# -*- coding: 文字コード名 -*-
が入ってる方がすぐに動かせて嬉しいなあ。
今んとこ一回エディタで開いて上の2行書いて、(1行目は無くても python って打てばいいけど)改行をLFに換えてから実行してる。

で、結局 Numeric モジュールが無いって言われる…(perl の CPAN shell とか PPM とか ruby の rubygem みたいなツールはないの?)
ちなみに float → 16bit signed int 変換のバグってどの辺が変になのでしょうか… int で切り捨ててる所?
21 wta 2006-05-15 05:25 permalink
というわけで
なんかリバーブがかったような妙な音の原因は
りんぐモジュレーション+オーバー浮浪による畳み込みと推測しています。こういうのが車輪の再発明の醍醐味だよね!

ほとんどメモ化してごめんなさい。最初が肝心なの。

リングモジュレーション
http://www.shonan.ne.jp/~hiro-s/pages/MSP2_Doc/tutorial_08.html
FM
http://www.shonan.ne.jp/~hiro-s/pages/MSP2_Doc/tutorial_08.html
20 wta 2006-05-15 05:04 permalink
寝れなくなりついでに、PDで検証。同じ音がでるかな?
http://drumsoft.no-ip.org/up/src/up0111.png

http://drumsoft.no-ip.org/up/src/up0112.mp3
19 wta 2006-05-15 04:22 permalink
http://drumsoft.no-ip.org/up/src/up0110.wav 寝ようと思ったけどなんかいい音が出た。とういか多分アルゴリズムどっかおかしいと思う。
18 wta 2006-05-15 03:57 permalink
あ、あと恒例出力結果
http://drumsoft.no-ip.org/up/src/up0108.wav
http://drumsoft.no-ip.org/up/src/up0109.wav

py2exeでだれでも実行可能にしたいなぁ。
http://www.python.jp/Zope/articles/tips/py2exe

17 wta 2006-05-15 03:54 permalink
自分なりに、
モジュールの助けを借りながらwav吐けるようにしてみました。
現在、WAV出力、波形生成VCOをクラス化にしてまとめる途中。
あとArgvでwav出力とか選べるようにしたい。第三回はここら辺がかっちり固まってからにしよう。
http://drumsoft.no-ip.org/up/src/up0107.py

参考にしたページ
AIFFの読み書き
PYTHONPATH/Lib/aifc.py がソースコードここにも詳細なaiffフォーマットについての解説が
http://www.python.jp/doc/release/lib/module-aifc.html
WAVEの読み書き
PYTHONPATH/Lib/wave.py がソースコード
http://www.python.jp/doc/release/lib/module-wave.html

千葉大の授業
http://66.102.7.104/search?q=cache:q0CEMnFv1-4J:www10.plala.or.jp/katofmly/chiba-u/ics/Chiba-u-2006-05-23.ppt+writeframesraw&hl=ja&gl=jp&ct=clnk&cd=8&lr=lang_ja&client=firefox-a
これをベースに波形生成とWAV出力を切り分けた。
が、下のhrkバージョンでもすこしバグって居るようにfloatで演算したものをWAVの16bit signed int へ変換するのに手間取った。

結局Numericモジュールを使ってarray全体をキャストしている。これを使うとarray同士の演算が出来てとても便利。
http://ymasuda.jp/python/numarray/

いま手元のマシンにはNumericが入っていたけれども
これからいれるならScipyをいれたほうがいいかもしれない。
http://www.nasuinfo.or.jp/FreeSpace/kenji/sf/fastTour/pyLinear.htm
16 wta 2006-05-14 04:45 permalink
ワーイ、整理された。というか次回からはもうすこし整理してから書こうと思います。やったー。
15 hrk 2006-05-14 04:18 permalink
直接aiffを吐ける様にした。あと、標準出力を使う様にした。
http://drumsoft.no-ip.org/up/src/up0105.py
os x の open コマンドで realplayer 辺りに渡す様にするとコマンドラインだけで生成→再生できてよい。コンパイル→実行って感覚?
14 wta 2006-05-14 00:33 permalink
ああそうだった、掛けるのはリングモジュレーションだったけか
13 hrk 2006-05-14 00:24 permalink

def generate_sine(generate_time):
mod_phase = 2.0 * pi * generate_time * mod_freq / samp_rate
modwave = sin( mod_phase )
phase = 2.0 * pi * generate_time * (freq + fm_rate * mod_phase) / samp_rate
sinwave = amp * sin( phase )
return sinwave

fm変調は、 frequency に変調分を足し算するんだったと思うよ。
正弦波を録音したカセットテープの再生中に、テープの走行速度を modwave で振動させてるみたいな感じ?
12 wta 2006-05-14 00:01 permalink
可読性がすごく高いとは思うよ。好き嫌いはありそう、あとモジュールが強力なので普段使いに便利そう。
11 hrk 2006-05-13 23:55 permalink
じつはpythonのコードちゃんと読んだの初めてなんだけど、「タブとかスペースで階層構造を入力する言語」って最初聴いた時完全にネタだと思ったのが懐かしいなあ…。
10 wta 2006-05-13 23:53 permalink
なるほど、そうか、名前がかぎなのね。
9 wta 2006-05-13 23:48 permalink
一応音ネタもあげておこう、実はこれやったの昨日なんだけどもうパラメーター忘れてる。ちゃんと目もっとかないとだめだね。記録重要。http://drumsoft.no-ip.org/up/src/up0103.wav http://drumsoft.no-ip.org/up/src/up0104.wav
8 uta 2006-05-13 23:41 permalink
さて5分とおかず二回目。

昨日の
sinwave = amplitude*sin(freq*2*pi*phase/samp_rate)
ここ、
なんかすごくまちがってそうだけど
このsinの引数にもう一個sinをくべてやると、いわゆる
フリケーンシーモジュレーションFMというのができるはずなのでやってみる。大学二年生のときに課題やったのをうろおぼえで書いてみよう!
http://drumsoft.no-ip.org/up/src/up0099.txt
def generate_sine(generate_time):
phase = generate_time/samp_rate
modwave = 0.8*sin(mod_freq*2*pi*generate_time/samp_rate)
sinwave = 0.5*sin(modwave*freq*2*pi*generate_time/samp_rate)
return sinwave

で出てきたのがこんな音

http://drumsoft.no-ip.org/up/src/up00100.wav

あれ?おかしいな? 雑音しかでないぞ!!
どうもモジュレーションがかかりすぎてるのかなあ?
というわけでモジュレーションの掛け算を0.08にして、ついでにサンプリングレートも下げてみよう。すればなにか起こるかもしれない!
理系の人はきっとここで大笑いだ!なんて莫迦な奴だってね!

そんなことにはかかわらず。
サンプリングレートをさげてみたのがこちら。
http://drumsoft.no-ip.org/up/src/up0101.wav
うん、なんかFMぽっくないけど、一昔前の音響実験ぽいよね!

そして他にもいろいろパラメーターいじくってみて出した音で
hipなループらしきものをつくってみたよ。録音レベル失敗してるけどそのままアップ、ヒドイネ。

http://drumsoft.no-ip.org/up/src/up0102.mp3
7 hrk 2006-05-13 23:30 permalink
http://www.drumsoft.com/cgi-bin/t_bbs/t_bbs.cgi?1028&mbhrk&55
これとおんなじ感じだ!さらに前に、これと同じ事がExcelでできるとutaが教えてくれていましたのだ。
perldeaiff.pl の Raw2Aiff パッケージ移植すれば直接AIFFが吐けるよ。
6 hrk 2006-05-13 23:22 permalink
コメントつくよ!自分でつけたい場合 uta+ とかに名前を変えよう。
5 uta 2006-05-13 22:55 permalink
うーんコ、メントつかないや。
4 uta 2006-05-13 22:55 permalink
ほんとに素人っぽいプログラムですがhttp://drumsoft.no-ip.org/up/src/up0097.txt まだCっぽい書き方だけどたぶん配列などを効果的に使ったほうがpython的
3 uta 2006-05-13 22:50 permalink
コメントをつけていただきたいいので以降はhttp://drumsoft.com/cgi-bin/t_bbs/t_bbs.cgi?1044&mbuta
2 uta 2006-05-13 22:47 permalink
すみません下の文章からして壊れてますね。
でも間違っちゃったっていいじゃないか!
すぐ直せば!!カッタントライ!
まずpythonのインストールとかその辺は省いちゃうよ、
この文章の対象であるhrkunのOSXではデフォルトで入ってるはずだぜ。

というわけで第1回、まずはsin波を出してみようの会。
こんなもん巷のソフトシンセつかえばすぐできるのに
あえてテキストで書き出して見ようの段。


import os
from math import *
from struct import *
filename = "sine.txt"

samples = 441000
samp_rate = 44100
amplitude = 0.5
freq = 440

f = open(filename,'wb')
def generate_sine(phase):
sinwave = amplitude*sin(freq*2*pi*phase/samp_rate)
return sinwave

for i in range(samples):
f.write(pack("f",generate_sine(i)))

f.close()

これを実行するとsine.txtというファイルが同一フォルダ
に出来上がるのでこれを生データを読み込める波形ソフトで読み込んでお好きな形式に変換するとよいでしょう。
audacityだとプロジェクトファイル->ロ-(raw)データの読み込みというところでファイルを読んで32bit floatを選んでやればよいのでないかな?
スクリプト自体でwavデータなどへの変換はそのうちやろう。そしてpythonの細かい説明は全部省いておもしろいところだけ注釈だ!
まずはココであるファイルをバイナリ書き込みモードで開いてやる。ファイル操作関連はosモジュールを使う。
f = open(filename,'wb')
そしてバイナリデータを書き込む際には
structモジュールのpackをつかうのだけれども、
このpackモジュールが結構おもしろい。
第一引数の文字によって変数のビット幅を変えられる。つまりこれの設定しだいで簡単にローファイにしたりハイファイにしたりできるわけだ!!!

次回はこれで遊んでみようの階。





1 uta 2006-05-13 22:13 permalink
utaは最近pythonに凝っているらしいので、
その過程を実況中継します。

巷ではcircuit bending なんていうそこらへんの安い楽器の電子回路をメクラ滅法弄って、
ステキな音を出すっていうプロジェクトが流行っているらしい。
http://www.youtube.com/results?search=circuit+bending&search_type=search_videos&search=Search

というわけでプログラミングは素人なので、"解っちゃった”人からすれば、めちゃくちゃだろうけど、出た音がおもしろければそれでいいやという方法でなんとか音を出してみようかとおもいます。
[DRUMSOFT 旧BBS][全部]