csoundメモ 目次
- csound概説
- csoundを使う
- ダウンロード
- コンパイル
- その他環境設定
- 環境変数、引数。ディレクトリ。
- ダウンロード
- csoundでサイショの楽器
- 楽器の概要
- 楽器の詳細説明
- 楽器の概要
- csoundの動き
- スコアの書き方
- スコアの概要
- スコアに出てくる色々な記号〜score statement
- スコアの概要
- midi, audio
- デバイスとcsoundのオプションパラメータ
- virtualKeyboardとリアルな楽器からの発音
- MIDI関連のオプコードについて
- デバイスとcsoundのオプションパラメータ
- csoundを使ってのワークフローや利用方法を考える
- Androidでcsoundを使う
- オプコードの使い方とTIPS
- include, User Defined Opcode
- zak
- 楽器からスコアイベントを発生させる(他の楽器の起動する方法)
- MIDIからcps(cycle per second)への変換
- global parameter
- delay比較
- reverb比較
- noiz比較
- include, User Defined Opcode
- synthesis
- granularシンセシス
- granularシンセシス
- morphing and analysis
- loris
- loris
- 楽器と楽曲の実例
- csound API
- csoundAPIとは
- APIの概要
- csoundAPIをrubyから利用する
- rubyからcsoundを呼び出す
- csoundAPIとは
- Appendix
機能面から見たcsound
csoundいくつかの側面を持っている。
- csoundの動作
- 楽器をオプコードで定義し、楽器を指定した時系列のスコアにより発音タイミングを決定し発音させる
- 楽器は音の強さ、発音時間、トーン以外にもユーザが自由に変数を定義できる。
- スコアでは楽器の全パラメータをすべて指定することができるので無限の可能性を秘めている。
- 楽器やスコアを動的に変更するためのいろいろな手段を要していてパフォーミング・アートにも利用できる
- 音響合成
- csoundの主目的。csoundの言語により生成した"音"をファイル(wav, aiff, ircamのフォーマットは選択可能)に落としたり、オーディオデバイスを通じて直接発音させたりすることができる。
- 加算・減算方式、各種変調の音声合成だけではなく、グラニュラー・シンセシス、ハイパーベクトリアル・シンセシス、スキャンド・シンセシス、ウェーブ・テレイン・シンセシス、導波管の物理モデリングによる音声合成など多様な方法が選択できる。moogなんていうmini-Moogのエミュレーションをするopcodeまである。当然、自分で新しい方法を作り出してそれを実装することもできる。
- フィルタ(ハイパスフィルタ、ローパスフィルタ、双二次フィルタ、バターワースフィルタ、レゾナントローパスだけで18種類あった*1、ポルタメントしてくれるフィルタもある)やエフェクタ(ディレイ、パン、リバーブ、ディストーション、フランジャー、フェイザー、ハーモニックス、パンニング関連だけを見てもその中には3次元音響など25個あった*2、モーフィングも数種類ある)、も一通り揃っている。
- 三次元音場、や高次元のスピーカーもサポートしている。
- 音響解析
- 音声サンプルを与えて解析。基本的にはリシンセサイズしたりモーフィングの目的で解析する。
- MIDI音源
- その他
入力
- オーケストラ
- 楽器を定義するのが主目的。楽器は音を出すものもあれば、信号処理つまりエフェクタとして働くものや制御だけをするもの、標準出力に表示だけをするものも定義できる。
- 楽器以外にはサンプルレート、コントロールレート、チャネル数、大域変数などの初期化、ZAKの初期化、MIDIチャネルと楽器の対応づけなど各種初期化を行う。
- スコア
- 楽譜を定義するのが主目的。ただし一般的な楽譜ではない。1行の英数字記号列が一つの音符やテンポ、スコアセクションの定義である。(実はそれ以外にファンクションテーブルの宣言行もあるがこれは別途説明する)その音符は楽器の発音だけでなく楽器の制御に対応することなどもできる。csoundにおいて音符に対応するスコアの1行は「楽器に指示を与える」という意味と解釈できる。一行の中に含まれるパラメータの数や意味を定義できる。
- オーケストラ、スコアに加えてcsoundのコマンドラインに与えるパラメータやライセンス情報などを加えたUnified File FormatもしくはCSDファイルという形式が定義されている。XMLもどきなファイル形式。
- 音声(ファイル)
- soundinやdiskinでオーディオファイルを取り込むことができる。
- insやZAKであればinzなどでステレオのオーディオストリームを読みこむことができる
- bbcuts/bbcutmで取り込んだオーディオファイルを自動でブレイクビーツの要領で切ることができる他、普通のサンプラーのように伸縮や逆方向の再生も可能。
- MIDI信号
- マウス、キーボード操作
- テキスト
- GUIのそうだけではなく、コマンドラインからパラメータとして渡したり、標準入力からテキストを渡すこともできる。
出力
- 音声(ファイル)
- 音声ファイルはモノラル、ステレオだけでなく4チャンネル、8チャンネルまでサポートしている。サンプリング周波数はオーケストラで設定できる。
- スペクトル解析
- 解析して音をモルフィングしたり、リシンセシスするためにサウンドファイルをフーリエ解析した結果をファイルに蓄えそれを読みこんで音声合成を行う。
- テキスト
- print系のコマンドで出力できる。楽器発音時、制御レート、任意の頻度での出力が可能
- コマンドライン引数(-m)でテキスト出力するメッセージを制御可能
- GUI
- FLTKを用いてスライダーやボタンなどを持つGUIが構築可能
- ファンクションテーブルの内容をWindowに出力することも可能
私的なcsoundへのオマージュ
csoundとは「音」をデザインするための文学的なシステムである。
Xeroxで生まれたWindowシステムのマウスによるポインティングやペン入力ではなく、スマートフォンで再発明された音声入力でもなく、キーボードとエディタでのテキストによる入力。これがあらゆる情報処理とそこから生み出される表現形のDNAである。0/1よりも人間的。音声入力や手書き表現よりも原始的。その原始性と結びついた音響システム。これがcsoundである。
感情を表現するためにopcodeを組み合わせてスコアを一行一行書き、積み重なったテキストが音の物語を紡ぎだす様子は共感覚的にすら通じるところがある。
csoundのコードを持って誰も聞いたことのない音響を生み出すことを夢見る。そんな想像を膨らますことを許してくれることが人をcsoundへと誘うのではないだろうか。文学も文字というありふれた記号を使って誰も聞いたことのない物語を作り出す営みだとすれば、それらはとても似ていると感じてしまう。
csoundは多様な音響技術一般(生成、解析、フィルタリング、、、)を貪欲に取り込み、多様な外部システム(MIDI, VST, DSSI, LADSPA, SoundFont2, PureData, Faust, TCP/IP, C, Java, Python, Lua, OSC, Android...)に触手を広げ続け拡張を続ける。
常に新しい技術と結合と変形を繰り返す一方、どこか旧式な、まるでテレタイプしかなかった太古の電脳世界を思わせる奇妙なレトロ感覚が潜んでいる。
それは隔絶された世界で脈々と生きつづける音響の原生命が独自に進化を遂げる見たこともない動物の姿を見てるようだ。
その意味でもcsoundは決して美しく洗練されたシステムではない。理解しがたいほどたくさんの演算子。独自の記法。原始的な言語体系。むしろ色々な無駄と奇妙な矛盾を含んだ実験的なシステムに見えてしまう。でもだからこそ、自分でも極めて非力な実験を細々と繰り返して何かを見つけることを期待してしまうのかもしれない。
こうして不思議な可能性を感じさせてくれるのがcsoundなのだ。それは商用のGUIや機能が優れたシステムとは異なり、UnixからLinuxに引き継がれた不完全で自由度の高いシステムが提示してくれるものと同じであるように感じる。
個人的に情報処理の根源がキーボード操作に根ざしている部分が大きいのでcsoundに共感を覚えるところがある。これは100年先には理解されない感覚なのかもしれない。100年先にもcsoundは残っているのだろうか。もっと自然な形でDAWと結合されて表現の仕方が広まっているのかもしれない。
android で csound
csound6のアンドロイド版もある。
<CsoundSynthesizer><CsOptions>-W -o studien1.wav</CsOptions><CsScore>f1 0 65536 10 1f2 0 65536 10 1 0.5
<CsoundSynthesizer><CsOptions>-W -o /mnt/sdcard/studien1.wav</CsOptions><CsScore>f1 0 65536 10 1f2 0 65536 10 1 0.5
csound6なにが新しいの?
まえおき
i 1 0 10 "A4"
evernote+druidbooks
Evernoteで書籍管理をする!!!
業務プロセスを考える
データマスタの位置
Evernoteでの更新作業
最低限のタグと評価などは?
最後に
乗り換え初投稿
- 基本的な仕組み
-
- ワイルドカードで指定してファイル名を取り込み
- ファイル対象からMIMEタイプを決める
- ファイル対象をBase64でエンコード
- さらに対象のハッシュ値を取得
- evernote-export2.dtdに沿ってevernote出力形式のenexファイル(XML形式)を生成する
-
- これはWindows版のツールでenexファイルとしてexportしたファイルの中身を見て、そこからURLを見て、そんでそれをダウンロードすれば分かるわけで、どこかに細かい仕様があるわけではない(いや、そういう風にあるのだが)
- 今、気がついたが、http://xml.evernote.com/pub/evernote-export3.dtdってファイルを見ていた!つまり、こいつは今後もどんどんアップグレードするというわけでしょうね。
- enexファイルを次々とインポートするために、evernote”付属”のenscriptを利用
-
- enscriptはWindowsであればevernoteのプログラムが置いてある場所に一緒に置いてある
- あとはほおっておけば勝手にSync
- バグ、今後の改造
-
- タグをまとめて入れたい
-
- -f filepattern1 filepattern2 -t tag1 tag2 のような感じ
- ノートブック指定は仕様上まだできないのかもしれないが対応したい。後から移動するのが面倒
- エラー対応したい
-
- 容量オーバー
- 同期失敗
- MIMEタイプの同定失敗
- など
- 対象ファイルのあるディレクトリと同じところにenexファイルを生成する。今はコード内を手動で切り替えてそれを削除する稼動するかを決めているが、これをアーギュメントで切り替えられるようにしたい
- 今はコマンドラインから叩くが、これを窓にファイルをDrag&Dropすれば、、という楽々形態にしたい
- テキストファイルは添付にせずに、展開して直接読めるようにしたい
- zipにはどう対応?
- tarは?
- 使い方
require 'base64'
require 'digest/md5'
require 'rexml/document'
require 'mime/types'
def genEnex(b64v,hasv,fn)
odoc = REXML::Document.new()
odoc.add(REXML::XMLDecl.new(version="1.0", encoding="UTF-8"))
doctype= REXML::DocType.new(<<EOS)
en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd"
EOS
odoc.add(doctype)
root = REXML::Element.new("en-export")
note = REXML::Element.new("note")
title = REXML::Element.new("title")
content = REXML::Element.new("content")
en_note = REXML::Element.new("en-note")
en_media = REXML::Element.new("en-media")
created = REXML::Element.new("created")
resource = REXML::Element.new("resource")
data = REXML::Element.new("data")
mime = REXML::Element.new("mime")
resource_attributes = REXML::Element.new("resource-attributes")
source_url = REXML::Element.new("source-url")
file_name = REXML::Element.new("file-name")
attachment = REXML::Element.new("attachment")
root.add_attribute("export-date","")
root.add_attribute("application","A9A9")
odoc.add_element(root)
root.add_element(note)
note.add_element(title)
title.add_text(File.basename(fn))
note.add_element(content)
note.add_element(created)
created.add_text(Time.now.gmtime.strftime("%Y%m%dT%H%M%SZ"))
note.add_element(resource)
resource.add_element(data)
data.add_attribute("encoding","base64")
data.add_text(b64v)
resource.add_element(mime)
mime.add_text(MIME::Types.type_for(fn).first.to_s)
resource.add_element(resource_attributes)
resource_attributes.add_element(source_url)
source_url.add_text("file://"+fn)
resource_attributes.add_element(file_name)
file_name.add_text(File.basename(fn))
resource_attributes.add_element(attachment)
attachment.add_text("true")
en_note.add_element(en_media)
en_media.add_attribute("hash",hasv)
en_media.add_attribute("type",MIME::Types.type_for(fn).first.to_s)
doctype= REXML::DocType.new(<<EOS)
en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"
EOS
istr=doctype.to_s+en_note.to_s
cdata=REXML::CData.new(<<EOS)
<?xml version="1.0" encoding="UTF-8"?>
#{istr}
EOS
content.add(cdata)
ofile=File.basename(fn,File.extname(fn))+".enex"
File.open(ofile,"w:UTF-8") do |outfile|
odoc.write(outfile, -1)
end
end
for arg in ARGV
p Dir.pwd+"/"+arg
for impFile in Dir.glob(Dir.pwd+"/"+arg)
b64 = Base64.encode64 File.open(impFile,'rb').read
has = Digest::MD5.hexdigest(File.open(impFile,'rb').read)
fullname=File.expand_path(impFile)
extname =File.extname(impFile)
basename=File.basename(impFile)
genEnex(b64,has,fullname)
#"enscript importNotes /s "+"\""+File.basename(fullname,extname)+".enex"+"\""
system("enscript importNotes /s "+"\""+File.basename(fullname,extname)+".enex"+"\"")
# system("rm "+"\""+File.basename(fullname,"."+extname)+".enex"+"\"")
end # end of for
end