いらないモノ、ひつようなモノ

書籍、音楽、そして若干のテクノロジー

csoundメモ 目次


  1. csound概説

    1. csoundとは?

      1. 私的なcsoundへのオマージュ
      2. 機能面から見たcsound
      3. 主たる動作環境
      4. 重要なcsound用語

    2. csoundの実例〜CSDファイルについて
    3. 音の鳴る仕組み

  2. csoundを使う

    1. ダウンロード
    2. コンパイル
    3. その他環境設定
    4. 環境変数、引数。ディレクトリ。

  3. csoundでサイショの楽器

    1. 楽器の概要
    2. 楽器の詳細説明

  4. csoundの動き

    1. スコアファイル、オーケストラファイルの動き
    2. csoundの型と変数とその動作について
    3. マニュアルエントリーの書かれ方
    4. sr、krの詳細
    5. i-time,k-timeについての実験

  5. スコアの書き方

    1. スコアの概要
    2. スコアに出てくる色々な記号〜score statement

  6. midi, audio

    1. デバイスとcsoundのオプションパラメータ
    2. virtualKeyboardとリアルな楽器からの発音
    3. MIDI関連のオプコードについて

  7. csoundを使ってのワークフローや利用方法を考える

    1. 典型的な使い方?
    2. MIDI+テキストエディタ+rubyによるスコアプロセッシングを利用したワークフロー

  8. Androidcsoundを使う

    1. Androidでcsound6.00を使う
    2. Android上で使えるセンサとUI
    3. ボタンを利用したサンプル
    4. 加速度センサを利用したサンプル
    5. 配列を使う

  9. オプコードの使い方とTIPS

    1. include, User Defined Opcode
    2. zak
    3. 楽器からスコアイベントを発生させる(他の楽器の起動する方法)
    4. MIDIからcps(cycle per second)への変換
    5. global parameter
    6. delay比較
    7. reverb比較
    8. noiz比較

  10. synthesis

    1. granularシンセシス


  11. morphing and analysis

    1. loris

  12. 楽器と楽曲の実例

    1. 平凡な音
    2. 回転する音
    3. 遠い波の音
    4. 銅鑼の音
    5. 捩れる音
    6. 霧の中を左右に動く音

  13. csound API

    1. csoundAPIとは
    2. APIの概要
    3. csoundAPIをrubyから利用する
    4. rubyからcsoundを呼び出す

  14. Appendix

    1. note/pch/cps/oct表

機能面から見たcsound

←csoundメモ 目次へ戻る

csoundいくつかの側面を持っている。

  • csoundの動作
    • 楽器をオプコードで定義し、楽器を指定した時系列のスコアにより発音タイミングを決定し発音させる
    • 楽器は音の強さ、発音時間、トーン以外にもユーザが自由に変数を定義できる。
    • スコアでは楽器の全パラメータをすべて指定することができるので無限の可能性を秘めている。
    • 楽器やスコアを動的に変更するためのいろいろな手段を要していてパフォーミング・アートにも利用できる
  • 音響合成
    • csoundの主目的。csoundの言語により生成した"音"をファイル(wav, aiff, ircamのフォーマットは選択可能)に落としたり、オーディオデバイスを通じて直接発音させたりすることができる。
    • 加算・減算方式、各種変調の音声合成だけではなく、グラニュラー・シンセシス、ハイパーベクトリアル・シンセシス、スキャンド・シンセシス、ウェーブ・テレイン・シンセシス、導波管の物理モデリングによる音声合成など多様な方法が選択できる。moogなんていうmini-Moogのエミュレーションをするopcodeまである。当然、自分で新しい方法を作り出してそれを実装することもできる。
    • フィルタ(ハイパスフィルタ、ローパスフィルタ、双二次フィルタ、バターワースフィルタ、レゾナントローパスだけで18種類あった*1ポルタメントしてくれるフィルタもある)やエフェクタ(ディレイ、パン、リバーブ、ディストーションフランジャーフェイザー、ハーモニックス、パンニング関連だけを見てもその中には3次元音響など25個あった*2、モーフィングも数種類ある)、も一通り揃っている。
    • 三次元音場、や高次元のスピーカーもサポートしている。
  • 音響解析
    • 音声サンプルを与えて解析。基本的にはリシンセサイズしたりモーフィングの目的で解析する。
  • MIDI音源
    • MIDIファイルを入力として音をレンダリングすることができる。トラックダウンするイメージ。
    • リアルタイムなMIDI入力に対してもリアルタイムなレンダリングは可能。しかしその目的で作られていないためlatencyが大きくなりがち。
  • その他
    • MIDIやOCSなどを受信してsystemというOPCODEでコマンドを実行するという変態的使い方も可能*3
    • イメージの処理もできる
入力
  • オーケストラ
    • 楽器を定義するのが主目的。楽器は音を出すものもあれば、信号処理つまりエフェクタとして働くものや制御だけをするもの、標準出力に表示だけをするものも定義できる。
    • 楽器以外にはサンプルレート、コントロールレート、チャネル数、大域変数などの初期化、ZAKの初期化、MIDIチャネルと楽器の対応づけなど各種初期化を行う。
  • スコア
    • 楽譜を定義するのが主目的。ただし一般的な楽譜ではない。1行の英数字記号列が一つの音符やテンポ、スコアセクションの定義である。(実はそれ以外にファンクションテーブルの宣言行もあるがこれは別途説明する)その音符は楽器の発音だけでなく楽器の制御に対応することなどもできる。csoundにおいて音符に対応するスコアの1行は「楽器に指示を与える」という意味と解釈できる。一行の中に含まれるパラメータの数や意味を定義できる。
    • オーケストラ、スコアに加えてcsoundのコマンドラインに与えるパラメータやライセンス情報などを加えたUnified File FormatもしくはCSDファイルという形式が定義されている。XMLもどきなファイル形式。
  • 音声(ファイル)
    • soundinやdiskinでオーディオファイルを取り込むことができる。
    • insやZAKであればinzなどでステレオのオーディオストリームを読みこむことができる
    • bbcuts/bbcutmで取り込んだオーディオファイルを自動でブレイクビーツの要領で切ることができる他、普通のサンプラーのように伸縮や逆方向の再生も可能。
  • MIDI信号
    • MIDI信号はすべての信号を読みこむことができる。スコアファイルとMIDI信号からの両方から使えるようにデザインされたOPCODEとMIDIからのみからしか使われることを想定していないOPCODEがある。MIDI信号は一つのチャネルからくる信号を一つの楽器にしか振り分けられない。
  • マウス、キーボード操作
    • csoundは各種ウィンドウを表示することができる。その操作のためのマウスやキーボード操作
    • GUIの入力だけではなくsensekeyというopcodeはキー入力したASCIIコードを返すし、xyinはWindowのカーソル位置のX、Y座標値を返す。これらを定義した楽器で活用することができる。
  • テキスト
    • GUIのそうだけではなく、コマンドラインからパラメータとして渡したり、標準入力からテキストを渡すこともできる。
出力
  • 音声(ファイル)
    • 音声ファイルはモノラル、ステレオだけでなく4チャンネル、8チャンネルまでサポートしている。サンプリング周波数はオーケストラで設定できる。
  • スペクトル解析
    • 解析して音をモルフィングしたり、リシンセシスするためにサウンドファイルをフーリエ解析した結果をファイルに蓄えそれを読みこんで音声合成を行う。
  • テキスト
    • print系のコマンドで出力できる。楽器発音時、制御レート、任意の頻度での出力が可能
    • コマンドライン引数(-m)でテキスト出力するメッセージを制御可能
  • GUI
    • FLTKを用いてスライダーやボタンなどを持つGUIが構築可能
    • ファンクションテーブルの内容をWindowに出力することも可能


←csoundメモ 目次へ戻る

*1:2013年9月 csound6.00マニュアル参考

*2:2013年9月 csound6.00マニュアル参考

*3:やったことないんだけどねー

私的なcsoundへのオマージュ

←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と結合されて表現の仕方が広まっているのかもしれない。


←csoundメモ 目次へ戻る

android で csound

csound6のアンドロイド版もある。

csound5.19のアンドロイド版と異なり、ちゃんとログが出たりする。
↓古いやつ

f:id:A9A9:20130912020923g:image

以前より、進化している。
↓csound6のAndroid

f:id:A9A9:20130912020921g:image

 
で、以前はファイル出力ができなくて、
作ったCSDの音を聞いたり、
リアルタイムに用いる
(用いている人がどれだけ居るのか?)
ことが主眼で作られていた(様な気がする)。
 
今度はどうかなと思ったがだめだった。
↑このログを見ると分かるが、
ファイルの書き込みに失敗している。
であれば、apktoolで勝手に書き込み権限を
与えちゃったらどうなるかを試してみた!*1
 
 
で、いきなり、、想像と異なる結果になる。。(腰砕け)
 
 
権限あるじゃん!
 
apktoolでManifestを取り出したら、
ちゃんとWrite権限持っている。
なんだ、だとするとこのエラーは
何で生じているんだ??
 
ということで、
 
<CsoundSynthesizer>
<CsOptions>
-W -o studien1.wav
</CsOptions>
<CsScore>
f1 0 65536 10 1
f2 0 65536 10 1 0.5
 
の部分を
 
<CsoundSynthesizer>
<CsOptions>
-W -o /mnt/sdcard/studien1.wav
</CsOptions>
<CsScore>
f1 0 65536 10 1
f2 0 65536 10 1 0.5
 
とフルパス書いてあげたら
あっけなくファイルを生成 (^^)/
いままでcsoundで出力していた
テキストのグラフなどもいつものとおり出力。
 

f:id:A9A9:20130912020925g:image

 
 
wavファイルは再生プログラムは選ぶけど、
ちゃんと聞ける(ESメディアプレーヤ、
Powerampは○、Zimlyと最初から入っている
サウンドプレーヤー、メディアプレーヤーは×)
 
よし。よーし、これでどこでも作曲できるっ!!
しかし、時間がない。。。(泣)
 
 
おまけ
 
ところで、、途中で血迷って、
Windows8版csound6をwindos7のマシンに
インストールしようとして
途中までその気で居たら、
なぜかBaidu IMSを
インストールされそうなことに気がついて
あわてて中止!!!!
 
なんだ!なんなんだ!!
絶対BaiduのIMSなんか入れない。
なにがあってもいれない。 
 
 

csound6なにが新しいの?

まえおき

 
最近MLもチェックしていなかったし、
にしっかりバージョンアップのお知らせが、
7月16日付けで掲載されている。
csound5はcsound5.19を最後に、
メジャーバージョンのアップであるけど、
一応csd/orc/scoファイル上の
バックワードコンパチビリティは
保った上でのバージョンアップらしい。
ただ、APIはずいぶん変わってこれは
コンパチじゃないらしい、が、
このAPI使っている人ってほとんど、
居ないんじゃないかぁ。っていうか、
ほとんどマニアックなのに、
続いているところが極めてすごい。
 
 
csound6の変更点をかいつまんで
 
o A --sample-accurate option provides sample-accurate timing
of score events. This breaks backward compatibility for plugin opcodes,
which require code changes for tracking current sample frame
position in audio type variables (see below for an example).
 
まず、--sample-accurateというコマンドラインオプションが増えたらしい。
が、マニュアルに書いていない気がする。csoundはサンプリングレート
とは別のk-rateという概念があって、この単位で信号処理の計算をする。
計算の粒度みたいなもの、k-rateを下げれば大雑把な単位で計算するから
当然発音タイミングもずれるけど、このオプションでそれだけは
正確に保たれるというもの「なんだろう」。試してないからわからないが。
オプションの量から見ても始めて取り掛かる人にはやさしくないよな。
 
o A --realtime option, which can also be enabled by setting the
CSOUND_PARAMS field realtime_mode to 1, provides asynchronous execution
of file reading and writing, and of init-time orchestra code.
This should make real-time operation of Csound more resistant to dropouts.
 
今回はマルチコアを意識したコードに基本的に書き換えていて、
タスクのディスパッチングを大きく見直したらしい。
オーディオのread/writeなど別スレッドにするなど。
ま、このパラメータを入れると、たくさんリソース使って、
リアルタイム処理をよりがんばってくれるということなのかも。
 
o New opcodes and syntax support arrays of arbitrary dimensionality.
Arrays are created (usually) with the init opcode or with fillarray:
k1 init 4
generates a k-rate 1-dimensional array of length 4. Similarly,
a2 init 4, 4
creates a square, 4 x 4 a-rate array. Or,
k2 fillarray 1, 2, 3, 4
creates a 4-element vector filled with {1, 2, 3, 4}, and implicitly
defines a length. Array elements are indexed with brackets [] such as k1[2] or
a2[2][3]. One dimensional arrays replace tvars, and can be used in opcodes like
maxtab/maxarray, mintab/minarray and sumtab/sumarray (see below).
Array setting can also be done on the left-hand side of opcodes, e.g.:
aSigs[0] vco2 .1, 440
aSigs[1] vco2 .1, 880
 
配列が今になってサポートされる言語はcsoundだけじゃないだろうか。
ほかの言語の何十年昔を行っているのだろうか。すごい。すごすぎる。
いや、でもcsound大好きなんだけどね。
 
o Multicore support has been completely rewritten using an improved
algorithm for task dispatching, which should use less memory and fewer locks.
Multicore benchmarks are now much faster than before. Multithreading often
provides significant speedups over single-threaded rendering.
 
シングルスレッドで音をレンダリングするよりずっと早くなったって、
やはりこれも最先端の世界からはどれだけ遅れをとっているのか。
誰か金持ちがお金出してあげて、最新化すれば済むけど、儲からないから
そんなことする人は居ないか。
 
 
o Compilation of instruments and orchestra code can be done at any stage;
new instruments can be added or can replace old instruments with the
same name/number even while Csound is running.
 
csoundの動作中にダイナミックに楽器ファイルを
入れ替えるkとができるようになったそうです。
より、パフォーマンスを意識したつくりになりつつあります。
 
 
o The Csound API has been cleaned up and extended to support new functionality.
 
CsoundAPIが変わったてことね。
 
 
=================
USER-LEVEL CHANGES
=================
 
 
New opcodes:
o faustgen
 
そもそもそも。faustって?なに?
メインのサイトは、http://faust.grame.fr/
Functional AUdio STreamの略語の新しい(?)信号処理をベースとする
音響処理言語のようです。MAX/MSPにもfaustgen~があるみたい。
 
 
<CsInstruments>
 
nchnls=2
0dbfs = 1
 
giPluck faustcompile {{
import("music.lib");
 
// Excitator
//--------
 
upfront(x) = (x-x') > 0.0;
decay(n,x) = x - (x>0.0)/n;
release(n) = + ~ decay(n);
trigger(n) = upfront : release(n) : >(0.0);
 
size = hslider("excitation", 128, 2, 512, 1);
// resonator
//-----------------
 
dur = hslider("duration", 128, 2, 512, 1);
att = hslider("attenuation", 0.1, 0, 1, 0.01);
average(x) = (x+x')/2;
 
resonator(d, a) = (+ : delay(4096, d-1.5)) ~ (average : *(1.0-a)) ;
 
process = noise * hslider("level", 0.5, 0, 1, 0.01)
: vgroup("excitator", *(button("play"): trigger(size)))
: vgroup("resonator", resonator(dur, att));
}}, "-vec -lv 1"
 
instr 1
i3, a1 faustaudio giPluck
k1 line p5, p3, p5*1.2
faustctl i3,"duration", sr/k1
faustctl i3,"attenuation", 0.01
faustctl i3,"play", 1
event_i "i",1, 0.1, 1, 1, 200+rnd(200)
outs a1,a1
endin
 
</CsInstruments>
 
こうのfaustコードは、ホームページのonline exampleから
探すことができるようです。karplus32で、同じものが出ていた。
 
 
o array -- many new or revised opcodes -- see below under orchestra.
 
ま、これは配列関連のopcodeでしょう。
 
 
o compileorc -- takes a filename containing a collection if instrument
definitions and compiles them, replacing existing versions.
It returns 0 on success.
 
どういう場面で使うのか良くわかんないですが、ORCファイルを
コンパイルして付け加えるみたいです。なんか、動的に楽器を作るときに
これを使うのでしょうか。事前に定義された楽器なら最初から
読み込めばいいはずですからねぇ。。
 
 
o compilestr -- like compileorc, but takes a string of orchestra code.
引数が文字列そのものを持ってきて楽器を付け足すみたいです。これは、
もっと使い方がわかんない。。。
 
 
o readscore -- runs the score preprocessor on a string and then schedules
new events via the RT event mechanism, returning 0 if successful.
スコアのプリプロセッサにかけてからスコアに動的に付け加える。
プリプロセッサがあるから現在の状態に、、みたいなことができるのが、
ポイントかもしれません。
 
 
o Instruments can run at local values of ksmps using
setksmps iksmps
as in Csound 5 UDOs.
 
まぎれて重要っぽいことが。
 
o Compilation can be done at any stage; new instruments can be
added or can replace old instruments with the same name/number.
同じ名前を使って、楽器を置き換えられる。これは、compileorcなどで
述べたことと同じ。
 
Running instances of old instrument definitions are not affected.
The only limitation is that header constants in instr 0 are read only
once at the time of the first compilation.
 
instr 0だけは特別で置き換えができないってことですね。
 
Init-time code can be placed outside instruments
in the global space, but this also will be
executed only once following the compilation.
 
initなどの初期設定コードなどは一回しか実行されないよ、
ということですね。
 
In this way, score event
generation can be completely replaced by orchestra code.
See also the new opcodes compileorc and compilestr.
だから、スコアもぜんぜん変えちゃうことができるのよねー
ということ、ま、そうなんでしょう。
 
 
o New syntax operators +=, -=, *= and /=. These are more than
syntactic sugar; please use += and -= for accumulating reverbs
as it gives better multicore behaviour.
 
お、これは気になる。やはり随分昔に
議論されていたことではあるが、+=などが導入。
で、重要なこととして、Syntactic sugreじゃないの、
舐めないでということが、あ、 糖衣構文という、きちんとした
意味があったのか(汗)だから、
 
リバーブの音の積み重ねについては、マルチコアなら、
いい感じになります。ということだそうです。
 
 
o The opcodes add, sub, mul and div have been deleted; use the
forms + - * /. Not many people were aware of these opcodes.
 
addとか、記号じゃないopcodeはdepricatedということ。
普通に足し算引き算の記号使え、ということ。
 
o Any opcode with zero outputs or one output can be used
as a function. Some opcodes might require type annotation to
resolve ambiguities; see the the new syntax page in
the Csound 6.00 manual.
 
んー、意味わかんないかも。csoundでいうところの、
関数がなんだかよくわからん。
 
o A statement can be broken across lines after a , = or
any arithmetic operation.
 
算術計算している途中で文章が行替えしてもいいということかな?
 
o There are a range of new or recoded operations on k-valued
arrays, most restricted to 1 dimensional arrays (vectors):
kans minarray ktab returns the smallest value in the
(possibly) multidimensional array
kans maxarray ktab returns its largest value
kabs sumarray ktab returns sum of all values in the array
ktab genarray imin, imax[, inc]
generates vector of values from imin
to imax by increments of inc (default 1)
ktab2 maparray ktab1, "sin" maps the k-rate 1-arg function in
the string to every element of the vector
ktab2 maparray_i ktab1, "sin" maps the i-rate 1-arg function
in the string to every element of the vector
ktab2 slicearray ktab1, istart, iend
returns a slice of ktab1 from ktab1[istart]
to ktab1[iend]
copyf2array ktab, kfn copies data from an ftable to a vector
copya2ftab ktab, kfn copies data from a vector to an ftable.
 
だからなんなんだ、疲れてきた。個別によみゃ、いいじゃん。
 
o Arithmetic on arrays is allowed. In particular addition,
subtraction, multiplication, and division are provided in arithmetic
syntax on vectors. Similar operations between arrays and scalars are
also allowed.
 
配列間の計算、配列とスカラ値の計算ができるよ。。そりゃそうだろね。
配列導入したんだから。
 
o Each instance of every instrument has a scratchpad of 4 values
that persists after turnoff; this allows values to carry to next use of the
instrument; this may be useful for legato etc.
 
本気でわからない。scratchpadが
 
o If a table number is given as -1 then an internal sine wave
equivalent to "f. 0 16384 10 1" is used. Attempts to write to
this table will give unpredictable results, but is not
policed. The 16384 can be change by command line option
--sine-size=# where the # is rounded up to a power of two.
 
テーブル番号-1はサインにしたんだって。
大きさは2のべき乗でコマンドライン指定できるんだってー
(なげやり)
 
o A number of oscil opcodes now have the f-table parameter as
optional, defaulting to the internal sine wave. (oscil1,
oscil1i, oscil, oscil3, oscili, foscil, foscil1, loscil,
loscil3, poscil, poscil3)
 
oscilオプコード群はf-tableをオプションのパラメータにして、
デフォルト値はSINなんだってーーー
 
 
Score:
 
o Score lines can have multiple strings.
 
重要そうだけど意味がわからん。複数の文字列を持つことができるって???
あ、
 
i 1 0 10 "A4"
みたいにいままでは、文字列が一つしかかけなかったのが、いくつでもということか。
マニュアルはまだひとつだけって書いてる。
 
 
o Change to escape characters in score strings -- they do not happen.
they do no happen ??って??
 
 
 
Modified Opcodes and Gens:
o The k() function can take an a-rate argument, in which case it
invokes a call to the downsamp opcode.
Utilities:
 
o Hetro/adsyn analysis files can be machine byte-order
independent if created with -X. The down side is a longer file
and a little slower loading. The het_export utility will
create the independent format from the old, and het_import is
no longer necessary.
o cvanal and lpanal will produce machine independent files if the -X
option is used. The convolve and lpread etc. opcodes will
accept either format. You are encouraged to use the machine
independent form. Analysis files produced with -X can be used
on other systems.
 
Frontends:
o CsoundQt has been ported to Csound 6.
o CsoundVST has been ported to Csound 6.
o A new Csound6 app for Android has been developed, extending the
Csound 5 app with:
(1) An improved user interface, including text editing, scrolling
performance messages, a built-in User Guide, and links to the
Csound manual and Web site.
(2) Plugin opcodes, including the signal flow graph opcodes, the
FluidSynth opcodes, and the Lua opcodes, which enable executing
arbitrary Lua coded in Csound using the very fast LuaJIT engine,
even writing opcodes in Lua, and calling any public C function from
Csound using LuaJIT's FFI.
 
なんで、LUAなんてマイナーな言語使っているんでしょうか。
それともそんなにマイナーじゃないのか。よくわからん。
 
 
General usage:
o The environment variables for module directories have been renamed
OPCODE6DIR64 or OPCODE6DIR (note the 6) so they can co-exist with
directories for Csound 5 modules.
 
csoud6からopcodeの環境変数が変わりました!
 
 
o Similarly, .csoundrc has been renamed .csound6rc.
 
同じく初期化ファイルも名前が変わりました!
Csound's string variable type has been re-implemented.
The OENTRY structure has been changed. It has a new dependency field.
This field is now required for multicore semantics. Setting this field to -1
safely disables parallel execution, but it is recommended to enable parallel
execution by using the flags defined in include/interlocks.h
If your opcode reads or writes to zak space, use ZR or ZW, or ZB for both.
Similarly, if it reads or writes tables, use TR, TW or TB. If it reads or
writes to channels, use CR, CW and CB. If it uses the stack, use SK.
If it outputs text, then use WR to stop mixing of output. The _QQ flag marks
an opcode as deprecated. Other flags may be added later.
All opcodes that touch audio should take note of sample-accurate code.
A number of previous API functions have been removed. OpenFile and OpenFile2
have both been replaced by new OpenFile2 with an additional argument.
Additions have been made for arg type specifications for opcodes.
o Any-types have been added, as follows:
* '.' signifies a required arg of any-type
* '?' signifies an optional arg of any-type
* '*' signifies a var-arg list of any-type
o Arrays are now specified using "[x]" where x is a type-specifier.
The type-specifier can be any of the of the current specifiers,
including any-types. See Opcodes/arrays.c for examples of usage.
 
===================================
NEW TYPE SYSTEM
===================================
A new type system has been added to Csound6, and significant changes
have been made to the compiler. The previous system for handling types
involved reading the first letter of a variable's name every time
the variable was used to determine its type. This meant there was much
re-checking of types. Also, adding new types was difficult, because much
custom code had to be updated to check for new type letters.
 
いままで、Csoundにおいて変数の型定義は、最初の文字で行ってました。
#そうそう、すごいシステム!
 
In Csound6, a separate system of types has been added. Types are defined as
CS_TYPEs. The creation of variables from types and the initialisation
of memory has been encapsulated within the CS_TYPEs. This change
allows easier addition of new types, as well as generic calculations of
memory pools, amongst other things.
 
CS_TYPEsdで新たに型を定義するようにしたって?
また独自路線を行くのですね。。ついていきます。。。。。(泣)
 
The compiler has been changed to use the new type system in its semantic
checking phase. Variables are now registered into a CS_VAR_POOL when they
are first defined, with the CS_VARIABLE having a reference to its CS_TYPE.
After first time definition within the pool, the type information is looked
up in consequent variable uses, rather than re-calculated from the variable
name. This opens up possibilities for new variable naming and typing
strategies, i.e. using "myVar:K" to denote a k-rate arg. It also
opens up possibilities for user-defined types, such as
"data myType kval, aval", then using "myVar:myType" to define a var
of that type. (The previous is speculative, and is not an active
proposal at this time.)
 
 
The addition of the type system has formalised the static type system
that has existed in Csound prior to Csound6. It has, arguably, simplified
the code-base in terms of type handling, as well as laid groundwork
for future type-related research to be integrated into Csound.
 
 
よよよよよー、どこまでもついてゆくぞよ。
 
 
 

evernote+druidbooks

evernoteにファイルを一気に
インポートする方法で便利なのは、
あるディレクトリに入っている
全てのファイルをインポートする方法。
たとえば写真が
ひとつのディレクトリに入っているのなら、
「ツール-インポートフォルダー」
でインポートするのがもっとも簡単である。
 
ファイルの種類を選んだり、
ファイルの特定の単語で
始まるファイルを選んだり、
ディレクトリが分岐している場合
前述のツールがとても便利である。
 
2evernote.rb lento*.jpg 2012/pdf/* 2012/photo/*
 
のような感じ。
で、本当にやりたかったことは実は別にある。
 
 
Evernoteで書籍管理をする!!!
 
androidの書籍管理ソフトで
druidbooksを使っているのだが、
これはCSV形式でデータを出力できる。
 
このデータをEvernoteに入れたい。
というのもdruidbooks
結構良いソフトなのだけども、
微妙に登録書籍の検索がやりずらい。
これならもう少し上手なタグなどをつけて
evernoteで検索したほうがずっといい。
 
まだ検討中なのでいくつかの問題点を整理する
 
1. 今後もdruidbooksをフロントエンドとして使ってデータ入力を簡易化したいが、このデータの更新作業という業務プロセス自体を簡単にしたい。
2. 見やすくHTML形式、左にイメージ、右に情報。タブレットで見たときに見やすくしたい
3. 読了日があるのなら読了というタグをつけたりして検索性を高めたい
4. 本に限らず進めたい
 
 
業務プロセスを考える
 
要件としては、
1.書籍購入か、書籍購入予定などで新しく追加したい
2. 読み終わる、購入予定が購入した場合などの反映もしたい
3. 購入済か買う予定だったかが知りたい
4. 本を思い出すときに使いたい(本当は本への書き込みが最重要だけども)
5. 個人的なメモ、抜書きするところ、とリンクを張って管理したい
6. 簡易な作業のみにしたい(曖昧だけど最重要な非機能要件)
 
 
データマスタの位置
 
結局データのマスタを
どこに考えるのかでつくりがぜんぜん変わる。
druidbooksがマスタでevernoteが
UI特化と考えるとどうしても
これまでの方針と相容れない。
やはりDruidbookはデータ入力元
すなわち、今後は本を追加する
という目的だけに使うしかない。
 
 
Evernoteでの更新作業
 
読了などの日付を変えるのは、
全てEvernoteにするとする。そのとき
発生する問題は何か?ステイタス入力が
Druidbooksではワンタッチで
終了するところが
タグの編集という何ステップにも及ぶ作業になる。
これがデメリット。ならば、
チェックボックスにしたいところだが、
こうすると検索できなくなる。
(イメージは以下の通り)
 
[ ]所持
[X]読了
[ ]貸し出し
[ ]
 
でも、やはりタグなんだろうなと思う。
検索のためのタグをつけて
それほど検索するのか?
というコスト問題だ。
 
宇宙物理学とかマクロ経済とか
粒度の細かいタグをつけても
あまり意味がない気がする。
自己満足ってやつになりそう。
 
 
最低限のタグと評価などは?
 
所持
 未読了
 読書中
 読了
  スコア(たとえば★の数)
未所持
 購入候補
  期待スコア(たとえば☆の数)
 貸し出し
 
と、考えれば、未読了のレベルで
MECEになっているからこれを選べばいいか。
 
 
最後に
 
のようなこともできるわけだし、
スマホやタブレットはあくまで
QRコード読取装置のフロントエンドかつ、
QRから書籍データを検索するものである。
いっそスマホからEvernoteへ
一気に投げ入れたいのだけど、
こっちのほうが早いかなぁ。。
ちゃんと考えないと、手段優先で
使わないツール作っちゃうんだよね。。(汗)
 
 

乗り換え初投稿

catch.comもサービスを閉じた。
無料ブログもいつ亡くなるか分からない。
 
やはり自分が書いた日本語をどこかに
保存しておきたいという
生存本能が肩越しに話しかけてくる。
 
データのexport機能はそう考えると必須。
FC2などちゃんとそういう機能を備えている"らしい"。
 
が、しかし、考え方を逆にしてみた。
 
マスターデータを自分でしっかり持って、
それを無料ブログへexportすると考えればいい。
つまり
 
 外部メディアへ      オンライン
 いざという時の<=======>evernote======>blogなど
 バックアップ   enex データマスタ
 
 
こう考えれば、evernoteと連携しているブログが
一番というわけではてなダイアリーを選択。
 
って、昔からそうしている人はいるんでしょうねぇ。
 
ま、BLOGにしてから、それをevernoteにキャプチャ
すればいいって考えもあるかもしれない。
既存のものはそうやって保存するつもり。
 
次に問題となるのは、オフラインデータのバックアップ、
すなわち、写真、mp3、docファイルなど。
これらは外部メディアへバックアップしているが、
逆にオンラインのデータマスタ(evernote)に置いて
活用するという発想が脳裏をよぎる。
 
ということで、PCやNASに保存したファイルを
evernoteへまとめてアップロードするツールを作った。
 
ちなみに、写真を複数つかんで、それをたとえば
Windows版のEvernoteにDrag&Dropすれば、
ひとつのノートにまとめて写真が入る。
最初はこれでいいと思ったが、やってみると醜い。
見るときに不要なファイルまで落としてきて
時間はかかるし、いいことなしだ。
 
となると、ひとつのメディアを
ひとつのノートに入れたい。しかし、これはこれで
手作業が面倒。
 
ということで、狙ったファイルをまとめて読み込んで
しかもひとつづつアップロードするツールを作成した。
久しぶりにコーディングしたのでかっこ悪い。
 
正常系で必要なエラー処理、準正常系処理など、
時間がかかるので手を抜いている。
 
以下、備忘のため
 
  • 基本的な仕組み
    • ワイルドカードで指定してファイル名を取り込み
    • ファイル対象から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は?
     
  • 使い方
    • rubyをインストールする!(ここが厄介!?)
    • この記事の最後にあるrubyのコードをCOPY&PASTE
    • 2evernote.rbというファイルに落とす
    • ファイルを置いたディレクトリに環境変数を変更してパスを通す
    • Evernoteが入っているディレクトリ、つまりEnscriptが置いてあるディレクトリにパスを通す
    • MS-DOSのコマンドラインを開く
    • コマンドラインでコマンド実行。以下、例
      • >>evernote.rb *.pdf *.pptx 201308*.jpg
    • 一応、Evernoteに入ったことを、アプリで確認
    • また、バグで同期されないこともあるので同期されていることを確認
  • 開発中に発生した課題
    • xml改行問題
    • xmlに改行があるだけで、読み込みエラーになる。一般的にもxmlに改行やスペースは禁物
    • UTC問題
      • JSTで書くと時間がずれる!というか、そういう仕様のようで、よく読んでませんでした
    • xml打ち間違え問題、凡ミスが怖いということ
      • resource-attributeを間違えるとファイルがattachmentという名前に
      • doctypeをen-en-noteなどと間違えると同期時のエラーに
 
で、evernotをオンラインのマスタにして、
実際にEvernoteからはてなに出すときに思ったこと。
 
ブログを介して表にだすってのは、出す直前に、
「あ、この日本語、ヘン!」とか
修正したいところがいっぱい見つかる。
それはあくまでマスタであるevernote側でやりたいから、
ブログ側にexportするときは作業としてやらねばいけない。
 
しかし面白いのが、evernoteに書いているときには、
個人的なものとして「ダダッー」っと文章を叩きつける。
ミスや細かい表現は気にしない。
 
一方、ブログに出すときってのは、
書いていることが、誰かの役に立つかな、とか、
こんなことが言いたいっ!ということを書くのだから、
そこに心理的なギャップがある。
 
この点をどうやって埋めるかというのは面白い問題だ。
 
昨今の炎上ってやつは、この心理的なギャップに起因している
んじゃないかな? いや、いや、いや、いや、
でもTwitterだから、最初から表に出ることが前提なわけで、
最初からその認識が間違った上で投稿しているんだろうな。
 
ふふふ。
 

 
 
require 'date'
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