Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ja] chat #14

Open
mohayonao opened this issue Oct 28, 2013 · 35 comments
Open

[ja] chat #14

mohayonao opened this issue Oct 28, 2013 · 35 comments

Comments

@mohayonao
Copy link
Owner

雑談用です

@moxuse
Copy link

moxuse commented Nov 2, 2013

すばらしいと思います。

@mohayonao
Copy link
Owner Author

ありがとうございます。最低限欲しいUGenやメソッド等あればぜひ教えていただきたいです。

@moxuse
Copy link

moxuse commented Nov 6, 2013

すみません、感想になってました...。

フィルター系のUGenがあると音作りの幅が出そうですね>UGen
(またMultiOutUGenが実装されているので特に必要ないかもしれませんが、個人的にMixというUGenがとても重宝しています)

ところで、今シンセを生成するとInstanceManagerがNodeのインスタンスをタイムラインにpushする(と言う理解でいいのでしょうか、まちがってたらすみませn)構成のようですが、単にSynthDefファイルを吐き出すという構想はあるでしょうか。また、将来的にSynthDefオブジェクトをDBなどで管理するような機能は予定していますか。

@mohayonao
Copy link
Owner Author

シンセの生成ですが若干修正していて、以下のような流れになっています。

  • SynthDef で SynthDef のテンプレートが作られる
  • template.buid() で SynthDefファイルに相当する JSONオブジェクト を生成してサーバーに送信 (省略可)
    . builded.play で先に送った JSON からシンセノード生成してノードグラフに追加する (サーバー側の処理)

ファイル書き出しはブラウザの制約上むずかしいので考えていなかったですが、
確かになんらかの方法で外部にデータを置いたり読み込める仕組みは便利ですね。

@sarigama
Copy link

i wanted to take advantage of your .js by directly pulling them from github
and the test looks like this:
http://sarigama.namaste.jp/cc.html
but the result is
"SecurityError: The operation is insecure. @
http://mohayonao.github.com/CoffeeCollider/build/coffee-collider.js:1"
couldn't it be this easy?

@mohayonao
Copy link
Owner Author

It's impossible.
CoffeeCollider use a WebWorker, and it requires same-origin policy.
You should put coffee-collider.js into same place as html files.

@sarigama
Copy link

o i c!
would love to know which files i've got to ftp to my site...
well will try anyway by putting the whole dir made by unzip ;p

@sarigama
Copy link

ここjaなんすねw で、取り急ぎ(?)unzipしたものを丸ごとftpして、http://sarigama.namaste.jp/cc/cc.htmlにしてみましたが、SinOSCがcoffee-colliderの中でnot definedになってるかのように言われます。試しに指定パスを調整してhttp://sarigama.namaste.jp/cc/build/cc.html にしてみても、結果は同じですね
ブートボタンとか無しに、そこくらいシンプルに鳴らせると、やりたいことは山ほど有るんだけど・・

@mohayonao
Copy link
Owner Author

var cc = new CoffeeCollider();
cc.execute(code).play();

こう書いた場合、確かにエラーでますね。サンプルコードとして書いてあるのに、、
new CoffeeCollider が(内部的に)終わる前に execute しているのが原因で、
とりあえずの解決方法としてはユーザーイベントや setTimeout などでワンクッションはさむ方法があります。

var cc = new CoffeeCollider();
button.onclick = function() {
  cc.execute(code).play();
};

#39

@sarigama
Copy link

おお! でも、基本的な扱い方は、自分でも「そんな安易な・・」って思ってた方向で、実用出来そうなんですね! iPhoneにはロリポップftp用アプリが有るので、一旦セットアップが済んだら、coffeescriptを埋めた.htmlを編集するだけで、鳴るサイトが作れますね。そうなったら、ほとんどの音響アプリは捨てることになる気がする。制作と発表が直結するし・・ああ、サンプル・ページに既にtweetボタン有るから、素直にソレ使いなよ・・でもあるワケか・・
取り敢えず、coffeescriptの調整で鳴るまでをやって、報告します

@mohayonao
Copy link
Owner Author

修正しましたPCでなら v0.1.3 で上記コードは実行できます。

しかし iOS の場合はユーザーイベント経由で再生を開始する必要あります。

https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html

Note: On iOS, the Web Audio API requires sounds to be triggered from an explicit user action, such as a tap. Calling noteOn() from an onload event will not play sound.

@sarigama
Copy link

鳴りました!
ディレクトリのトップかbuildの下かは、関係ナイですね!
テスト環境はhpのdm1の最安構成に
64ubuntu13.10をインストールしたのの
firefox25.0.1とchrome31.0.1650.57です
しかし、やはりiPhoneで鳴らないのはイタいので
画像クリックなり・・を追加してみます!
今度のwebaudio(midi)ハッカソンに殴り込む準備が出来た感じです!
waitが嫌いなので、tweetからキッカケをもらう仕組みを考えたいです
多謝!

@sarigama
Copy link

jsに直接、文字列としてccのコードを埋め込んでページにするのは
http:///sarigama.namaste.jp/nipples/cctmp.html
に、エラー出しまくりながらも出来
iPhoneでも内側の丸クリックで鳴るようになりました
か、左右同時に走らせると音が割れますね
単にvolの合計値の影響なのか
これから調べるところ

課題として
走らせた後に、外側丸クリックで変数のメッセージ送信したり
クリック以前にもTask的な自動遷移もさせたいので
もっとデカイ(複数行)文字列にしたいのだけど
js的にどう書くのか悩んでいます

というのの解決と
さらに
気が付いたら相手がccコード更新してた
な、時間差インタープレイを実現するには
任意の外部urlの.coffeeを読むのが必須と思うのですが
やっぱsame origin系の壁が有るので
xmlHttpRequestなのかFileReaderなのか、jQueryの力を借りるのか
頭を抱えています

@mohayonao
Copy link
Owner Author

もっとデカイ(複数行)文字列にしたいのだけど
js的にどう書くのか悩んでいます

JavaScriptで大きな文字列を作るときは

a = "";
a += "line1\n";
a += "line2\n";

b = [
  "line1",
  "line2"
].join("\n");

CoffeeScriptだと

a = """
line1
line2
"""

こういう書き方があります。

たしかにJavaScriptだと書きにくいので cc.load("test.coffee") のような感じのファイル読み込み機能があったほうが便利そうですね。ただし、same-origin-policy に関してはウェブのセキュリティの問題なので、JavaScriptだけでは解決することはできません。基本的に同じドメイン下のファイルを読みにいく形になります。

http://gihyo.jp/dev/serial/01/web20sec/0002

デモページでは Gist から読み込みができるようになっていますが、これは GitHub の提供する API を利用することで実現しています。

@sarigama
Copy link

有難うございます!
これでjsでの埋め込み方式は目処が立ちました。
cc.load()にも、激しく期待ですw
「新しい.coffeeアップしたよー」なツイート見たら、
それを所定ディレクトリにwgetでもして、
ダクのリストに追加すれば、
逆に、404系になる危険も無く、
どの道そっちの方式に落ち着くかもですしね。
前回ドタ・キャンしたハッカソン、
参加資格取れたら、是非ともccで殴り込みたしw

@tn800
Copy link

tn800 commented Dec 22, 2013

UGen実装リクエストを出してみます。ReplaceOutがあれば良いなと思います。なくても大丈夫....

@mohayonao
Copy link
Owner Author

SuperCollider の examples を見ていると Klank, ReplaceOut, XOut, LeakDC, AudioIn あたりが抜けているようなので早めに実装するようにします。

@mohayonao
Copy link
Owner Author

@sarigama
Copy link

さっそくcc.load()を使い、御thinking.coffeeをまんまパクって http://sarigama.namaste.jp/iDoze/2013122401.html にしてみましたが、chromeとfirefoxで鳴るもmobilesafariで鳴らなくなってしまいましたorz 原因の見当がつかないので、アレコレやってみます。まだまだ、最もシンプルな再生だけなのですがw

@mohayonao
Copy link
Owner Author

あー、load した後に run だとユーザーイベントが外れて下記の制約で動かないのかも..

https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html

Note: On iOS, the Web Audio API requires sounds to be triggered from an explicit user action, such as a tap. Calling noteOn() from an onload event will not play sound.

これだとうまくいくと思うけど、ちょっと気持ち悪いなぁ..

button.onclick = function() {
  cc.play().load("code.coffee", function(code) {
    cc.run(code);
  });
};

@sarigama
Copy link

鳴りました!
iPhoneでも、まだまだ処理パワーに余裕有りそうですね。
firefoxでも。しょっぱなの音の始まり方がスムーズになったよーな気がします。
単純な頭の者としては、
cc.load(code.coffee);
cc.run() or cc.play();
だとモロモロと組み立て易いのだけど、
function()が続くのには、
何かjs流儀のワケが有るのでしょうねー。

次はメッセージ送信を含めてみます。

@sarigama
Copy link

曖昧な表現に、なってしまいました
cc.load("code.coffee");
func4click() {
cc.play(); // or cc.run();
};
のイメージです

@sarigama
Copy link

むむ! .play() はcc側を目覚ましてる.standby()みたいな意味なのかな?
で.pause()して.reset()して、やっと再度.play()してから.load()で.run()かな?

@sarigama
Copy link

連投すいません!
メッセージ周りを開始しましたが
(-> ).play() の中にいる$saに、js側からメッセージ送ったら
Message.on "message", ({sa, ri, ga, ma, pa, da, ni})->
では
$sa = sa
なのでしようか?
.set()みたいなのが有るバスですか?

@mohayonao
Copy link
Owner Author

質問がよく分からないですが、

https://github.com/mohayonao/CoffeeCollider/wiki/21-Message

このように動作します。

@sarigama
Copy link

ダメだ、イロイロ試したのだけどmessage送信周りが上手く行きません

.coffee側で

synth = SynthDef (sa=0.5, ri=0.5, ga=0.5, ma=0.5, pa=0.5, da=0.5, ni=0.5)->
Out.ar(0, SinOsc.ar([50 + ri * 111 + ga * 123 + ma * 135, 50 + pa * 111 + da * 123 + ni * 135]) * (0.3 + 0.4 * sa))
.add()

noiz = Synth(synth).play()

Message.on "message", ({a1, a2, a3, a4, a5, a6, a7})->
noiz.set sa:a1 ri:a2 ga:a3 ma:a4 pa:a5 da:a6 ni:a7

と待機し、.js側から

function two_thang() {
  ri = ((ga + ma) * 87654) % 1.0;
  ppl.send("message", {a1:sa, a2:ri, a3:ga, a4:ma, a5:pa, a6:da, a7:ni});
}

とかすると

Uncaught TypeError: number is not a function

と、なってしまいます。
エラー内容からしてjsの基礎をハズしてるだけのようにも・・ですが
音は鳴ってます
ここを通過できると.coffee側に集中できるので
なんとも残念

@mohayonao
Copy link
Owner Author

引数はカンマで区切る必要があります。

Message.on "message", ({a1, a2, a3, a4, a5, a6, a7})->
   noiz.set sa:a1, ri:a2, ga:a3, ma:a4, pa:a5, da:a6, ni:a7

CoffeeScript は a b と書くと b を引数に a 関数を呼びますので、a:1 b:2 となっている場合 a: 1({b:2}) と解釈されて "number is not a function" が出ていると思います。

@sarigama
Copy link

お恥ずかしい!
その修正でクリックによる周波数変更、出来るようになりました
(-> ).play()の中で宣言した$sa-$niを
Message.on "message"の中で
$sa = a1
$ri = a2
とする方式でもエラー出ないも伝わらなかったので
お手上げかと思いましたが
当面SynthDef方式で遊んでみます
有難うございました!

@sarigama
Copy link

1/18のハッカソンにccで臨むべくマッシュアップ連携的なjsライブラリを探り始めてます。twitterからのプッシュをSynthDefの引数setに利用するのとかヤリたいものの、api1.1からは認証工程要みたいで、難しそうですね。プッシュされるコンテンツを単純表示更新しながらcoffeeの味も変わって行けばイイので、他のsnsでもイイんですけど・・って独り言を書いてるのは、何かそーゆーメソッドを作ってくれ・・催促してるワケではナイですよw 有ったらweb開発でのcc活用例が大爆発だなぁと・・思ってるだけです

@mohayonao
Copy link
Owner Author

Twitterとの連携のようなものはアプリケーションの例としては面白いかもしれませんが、本体の機能として追加されることはありません。

@sarigama
Copy link

ま、そうですよねw 頑張って何かやってみます!

@tn800
Copy link

tn800 commented Jan 16, 2014

そいえば、SCの本家MLでお気に入りUGen投票がありました。参考までに以下に挙げておきます。
個人的には、DyKlangとDyKlank、Demand系があればいいなぁと思いました。

複数票があったもの
SinOsc ... サイン波を生成(ウェーブテーブル型)
CombC ... コムフィルタ。ディレイやフランジャー効果、レゾネータ的な効果をつくる。
DFM1 ... サードパーティのフィルタ。Tony Hardie-BickのJava用のデジタルフィルタモジュールをSCに移植。
http://jeremah.co.uk/dfm1ugen.html
DynKlank ... レゾネータのバンクであるKlankの仲間だが、処理中にspecificationsArrayRefの値(周波数など)を変更可能。
Impulse ... インパルスオシレータ。尚、周波数の値が0の場合は、インパルスを一度だけ出力する。
LFNoise1, LFNoise2 … 0,1,2で波形の形が違う
PV_MagFreeze ... FFT。特定のタイミングで、マグニュチュードの値をフリーズさせる。

単票
Chaos series ... カオス、ノイズ系オシレータ
DC ... 振幅が定数のシグナルを出力。
Silent ... 無音を出力。
DelayN ...ディレイ。
Demand系 … シーケンスとか作るためのクラス群。
DynKlang ... サイン波のオシレータバンク、Klangのダイナミック版。
EnvGen ... エンヴェロープを実装する為のUGen.
FreeVerb ... リバーヴエフェクト用のUgen。ステレオ用にFreeVerb2がある。
FreqShift … Freqをシフト。
In ... 他のバスに出力されたシグナルを受け取り入力するためのUGen
Klank ... レゾネータのバング。金属的な音を作るのに便利。
LocalIn,LocalOut ... SynthDef内でのやり取りを可能にする。フィードバックさせたりとか。
PinkNoise .. ピンクノイズを生成。1オクターブ毎に3dB減衰。
PitchShift ... ピッチシフトを行う。
PlayBuf ...メモリ上のサンプルを再生。サウンドファイルの再生など。
Pluck ... 弦楽器の物理モデル。アコギとか。
Pulse ... 矩形波(パルス波)オシレータ。
Ringz ... Resonzの仲間。
RLPF ... レゾナント付きローパスフィルタ
Saw ... ノコギリ波
Shaper .... Performs waveshaping on the input signal by indexing into the table.
VarSaw ...ノコギリ波と三角波のあいだ。比率を変更可能。
// scope({VarSaw.ar(200, 0, Line.kr(0.1,0.5,5))});
Warp1 ... グラニュラのタイムストレッチとピッチシフト。
WhiteNoise ... ホワイトノイズを生成。

@mohayonao
Copy link
Owner Author

おお!こまかい説明までありがとうございます!
手元の分では Klank, Klang が動いていて、そのあたりの調整をしています。
DynKlank あたりは後回しにしようと思っていたのですが、近いうちに調査するようにします。
LocalIn, LocalOut も優先したほうが良さそうですね。

@sarigama
Copy link

hackathonを前に、cc.reset()周りを試してみています。.start()は前に教えて頂いたiPhoneでも使えるほうのを利用していますが、cc.pause()してからcc.reset()すると、何回かのcode.coffee読み直しの際に、無音に陥ってしまいます。なので、目下は.pause()はコメントアウトしてるのですが、コレで本来の用法なのでしょうか?
現況は、こんな感じ
http://sarigama.namaste.jp/coffeejukebox/jukebox.html
黒部分クリックでcode.coffeeをランダム読み込みし、左黄丸で引数シャッフル、右はprevious引数に戻す・・です

@mohayonao
Copy link
Owner Author

      var cc = new CoffeeCollider();
      var i = 0;
      function test() {
        var code = "(-> SinOsc.ar(" + (Math.random() * 200 + 400) + ")).play()";
        console.log(i++, code);
        cc.pause().reset().play().run(code);
      }
      setInterval(test, 250);

こういうコードで再現しました、しばらくすると止まるみたいですので原因を調査します。

メソッドの動作として

  • play はオーディオ処理(Audio API)を開始する
  • pause はオーディオ処理(Audio API)を終了する
  • run はコードを実行する (デフォルトでは実行前に前回実行分はリセットされる)
  • reset は実行中のシンセ等をリセットする

となっているので、pause の直後に play を呼ぶのは意味ないです。
メソッド名が悪かったかも知れません.. (play = boot, pause = quit という感じです)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants