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

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

スコアステートメント

Csoundのスコアで使う命令を整理する。ステートメントは結構分かったようで分からないところもあるので、実例をまじえながら確認。実際に以下のようなCSDファイルを作って、スコアセクションだけを使用例にあるものを入れかえて確認する。prints分はスコアで叩かれた時にだけ表示をするopcodeなのでこれが便利。また、「instr 1,2,3,4,5,6,7,8,9,10」みたいに書いておくと、複数の楽器を一つでごまかせるので便利な時もある。

<CsoundSynthesizer>
<CsOptions>
-d -m0 -odac hw:1 -+rtaudio=alsa
</CsOptions>
<CsInstruments>
sr     = 44100
kr     = 4410
ksmps  = 10
nchnls = 2

gitab ftgen 1,0,16384,10,1

instr 1,2,3,4,5,6,7,8,9,10
 prints "i%d %2.1f %2.1f %3d %d\n", p1,p2,p3,p4,p5
 a1 oscil 5500, p4, 1
 out a1, a1
endin

</CsInstruments>
<CsScore>
     ______________________________________
    | ここに使用例をスコアを入れて確認する |
     --------------------------------------
</CsScore>
</CsoundSynthesizer>

結論

色々やってみたが、スコアステートメントはバグなのかそういう仕様なのか不明点がやはり多いことが分かった。どうしても使わなくてはいけないテンポ設定の「t」以外は、nやmやsを使って繰り返しを上手に使うことをせずに、生のスコア編集をプログラムとして扱った方がストレスなく作曲に集中できるという結論に達した。

a p1 p2 p3

  • スコアの時間を進めるのに使う。進めた間のiによる発音は飛ばされる。早送りみたいなもの。
    • p1:必要だが、何が入っていても関係なし
    • p2:何beat目にこのスコアを動かすかを示す値
    • p3:何beatを進めるかを示す値
    • p4以降:あっても無視
    • この行が書かれる位置に影響されない
使用例1

a行が無ければ二つの音が鳴るはずだが、2.5から1.0(beat)飛ばすので3.0(beat)に鳴るはずの音は飛ばされてs最初の2.0(beat)から始まる音しか鳴らない。

i1 2.0 2.5 220 ; i1 2.0 2.5 220
i1 3.0 2.5 880 ;
a10 2.5 1.0
e

使用例1の出力

SECTION 1:
i1 2.0 2.5 220 0
time advanced 1.000 beats by score request

使用例2

試しに2.5(beat)後から1.0(beat)飛ばされるので、3.5(bea)t後に発音する行を入れると、音が二つ鳴るようになる。ちなみに、3.5(beat)より少しでも前だと(例えば3.4(beat)などに設定しても)依然として音は最初のものしか鳴らない。

i1 2.0 2.5 220 ; i1 2.0 2.5 220
i1 3.0 2.5 880 ;
i1 3.5 2.5 440 ; i1 3.5 2.5 440  ←これを追加
a10 2.5 1.0
e

使用例2の出力

SECTION 1:
i1 2.0 2.5 220 0
time advanced 1.000 beats by score request
i1 3.5 2.5 440 0

使用例3

1(beat)から5(beat)進めるように設定すると下のスコアは音を出さない。

i1 2 0.5 220
i1 2 0.5 880
a10 1 5 ; この行がどこでも同じ。a0でも同じ
e

使用例2の出力

出力なし

b p1

  • 以降のスコアの発音(p1)に影響を与える。正の値を指定すれば以降のスコアの発音(p1)にその値が加算され後に伸びるし、負の値を指定するとスコアの発音時間が差し引かれ早まる。0を指定すると発音はスコアに指定されたとおりになる。
    • p1:発音タイミングを指定のbeatだけ加算する
使用例1

i2 0.0 2.0 220
b 5.0
i2 1.0 1.0 440 ; i2 1+5 1 440と同じ
i2 2.0 1.0 480 ; i2 2+5 1 440と同じ
b -1.0
i2 3.0 2.0 440 ; i2 3-1 2 440と同じ
i2 5.0 1.0 880 ; i2 5-1 1 880と同じ
b 0.0
i2 10.0 1.0 1320 ; i2 10 1 1320と同じ

使用例1の出力

元のスコアのstartTimeに加減算をすると以下のとおり

i2 0.0 2.0 220
i2  6.0 1.0 440
i2 7.0 1.0 440
i2 2.0 2.0 440
i2 4.0 1.0 880
i2 10.0 1.0 1320

これがstartTimeでソートされた結果となって現れる。

SECTION 1:
i2 0.0 2.0 220 0
i2 2.0 2.0 440 0
i2 4.0 1.0 880 0
i2 6.0 1.0 440 0
i2 7.0 1.0 480 0
i2 10.0 1.0 1320 0

e p1

  • 最後のセクションの最後。つまりこれでスコアが終了することを意味する。
  • -
使用例1
使用例1の出力

f p1

-

  • -
使用例1
使用例1の出力

i p1

-

  • -
使用例1
使用例1の出力

m p1 , n p1

  • mで名前をつけてセクションを開始する。nで名前をつけたセクションを呼び出す。
    • p1:セクション名。英数字
    • 色々試すと、セクション名は一つしか使えない。バグか?
使用例1

一つのセクションに名前をつけてもう一度同じスコアを呼び出した。呼び出す前には必ず「s」を使ってセクションを終わらせておくことが必要。

t0 360
;section 1
i2 0.0 1.0 440 "--1st line"
s
m 1stChapter
t0 360
i2 0.0 1.0 880 "--2nd line"
i2 1.0 1.0 440 "--3rd line"
s

i2 0.0 1.0 220 "--4th line"
i2 1.0 3.0 440 "--5th line"
i2 2.0 2.0 480 "--6th line"
i2 3.0 2.0 440 "--7th line"
s

n 1stChapter
s

ただし楽器に5番目のパラメータに文字列を与えて印刷されるように変更を加えた。

instr 1,2,3,4,5,6,7,8,9,10
 Sin strget p5
 Sdst strcat "i%d %2.1f %2.1f %3d ", Sin
 Sdst strcat Sdst, "\n"
 prints Sdst, p(1),p(2),p(3),p(4)
 a1 oscil 5500, p4, 1
 outs a1, a1
endi

これは、単に%sを使って

 prints "i%d %2.1f %2.1f %3d %s\n", p5

と書くとSegmentation faultだし、一旦StringにP5を代入して

 Sin strget p5
 prints "i%d %2.1f %2.1f %3d %s\n", Sin

と書くとコンパイル時のエラーだし、

仕方ないので先ほどの用に書き換えた。他に方法があるんだろうか?

使用例1の出力
  • 何故Section4、5が空で出力されるのかは不明。それ以外は想定どおりの動きをした

SECTION 1:
i2 0.0 0.2 440 --1st line
end of section 1 sect peak amps: 5500.0 5500.0

SECTION 2:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 2 sect peak amps: 5500.0 5500.0

SECTION 3:
i2 0.0 1.0 220 --4th line
i2 1.0 3.0 440 --5th line
i2 2.0 2.0 480 --6th line
i2 3.0 2.0 440 --7th line
end of section 3 sect peak amps: 16473.6 16473.6

SECTION 4:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 4 sect peak amps: 5500.0 5500.0

SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

SECTION 6:
end of section 6 sect peak amps: 0.0 0.0

使用例2

ちなみに、前の例で「7th line」の後にうっかり「s」を書き忘れてセクションが終了していないと

t0 360
;section 1
i2 0.0 1.0 440 "--1st line"
s
m 1stChapter
t0 360
i2 0.0 1.0 880 "--2nd line"
i2 1.0 1.0 440 "--3rd line"
s

i2 0.0 1.0 220 "--4th line"
i2 1.0 3.0 440 "--5th line"
i2 2.0 2.0 480 "--6th line"
i2 3.0 2.0 440 "--7th line"


n 1stChapter
s

使用例2の出力

ちゃんとセクションが終了していないと、次のセクションの呼び出しが成功しない。

SECTION 1:
i2 0.0 0.2 440 --1st line
end of section 1 sect peak amps: 5500.0 5500.0

SECTION 2:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 2 sect peak amps: 5500.0 5500.0

SECTION 3:
i2 0.0 1.0 220 --4th line
i2 1.0 3.0 440 --5th line
i2 2.0 2.0 480 --6th line
i2 3.0 2.0 440 --7th line
end of section 3 sect peak amps: 16473.6 16473.6

SECTION 4:
end of section 4 sect peak amps: 0.0 0.0

使用例3

新たに別のセクションを定義する。

t0 360
;section 1
i2 0.0 1.0 440 "--1st line"
s
m 1stChapter
t0 360
i2 0.0 1.0 880 "--2nd line"
i2 1.0 1.0 440 "--3rd line"
s

i2 0.0 1.0 220 "--4th line"
i2 1.0 3.0 440 "--5th line"
i2 2.0 2.0 480 "--6th line"
i2 3.0 2.0 440 "--7th line"
s

n 1stChapter
s

m 2ndChapter
t0 360
i2 0.0 1.0 880 "--8th line"
i2 1.0 1.0 440 "--9th line"
i2 2.0 1.0 880 "--10th line"
i2 4.0 1.0 1320 "--11th line"
s

n 2ndChapter
s

使用例3の出力

新しいセクションを呼び出す限りは、予想どおり呼び出される。

SECTION 1:
i2 0.0 0.2 440 --1st line
end of section 1 sect peak amps: 5500.0 5500.0

SECTION 2:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 2 sect peak amps: 5500.0 5500.0

SECTION 3:
i2 0.0 1.0 220 --4th line
i2 1.0 3.0 440 --5th line
i2 2.0 2.0 480 --6th line
i2 3.0 2.0 440 --7th line
end of section 3 sect peak amps: 16473.6 16473.6

SECTION 4:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 4 sect peak amps: 5500.0 5500.0

SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

SECTION 6:
i2 0.0 0.2 880 --8th line
i2 0.2 0.2 440 --9th line
i2 0.3 0.2 880 --10th line
i2 0.7 0.2 1320 --11th line
end of section 6 sect peak amps: 5500.0 5500.0

SECTION 7:
i2 0.0 0.2 880 --8th line
i2 0.2 0.2 440 --9th line
i2 0.3 0.2 880 --10th line
i2 0.7 0.2 1320 --11th line
end of section 7 sect peak amps: 5500.0 5500.0

SECTION 8:
end of section 8 sect peak amps: 0.0 0.0

SECTION 9:
end of section 9 sect peak amps: 0.0 0.0

使用例4

新たに定義したものを呼び出すのではなく、前に定義したものを呼び出すと、なぜか直前に定義したものを呼び出していて意図したとおりには動かない。「Duplicate 0: (/tmp/fileYfoIpG.sco,86)、Duplicate 0: (/tmp/fileYfoIpG.sco,336)というエラーのようなものをコンパイル時に吐いていること以外は不明。

SECTION 1:
i2 0.0 0.2 440 --1st line
end of section 1 sect peak amps: 5500.0 5500.0

SECTION 2:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 2 sect peak amps: 5500.0 5500.0

SECTION 3:
i2 0.0 1.0 220 --4th line
i2 1.0 3.0 440 --5th line
i2 2.0 2.0 480 --6th line
i2 3.0 2.0 440 --7th line
end of section 3 sect peak amps: 16473.6 16473.6

SECTION 4:
i2 0.0 0.2 880 --2nd line
i2 0.2 0.2 440 --3rd line
end of section 4 sect peak amps: 5500.0 5500.0

SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

SECTION 6:
i2 0.0 0.2 880 --8th line
i2 0.2 0.2 440 --9th line
i2 0.3 0.2 880 --10th line
i2 0.7 0.2 1320 --11th line
end of section 6 sect peak amps: 5500.0 5500.0

SECTION 7:
i2 0.0 0.2 880 --8th line
i2 0.2 0.2 440 --9th line
i2 0.3 0.2 880 --10th line
i2 0.7 0.2 1320 --11th line
end of section 7 sect peak amps: 5500.0 5500.0

SECTION 8:
end of section 8 sect peak amps: 0.0 0.0

SECTION 9:
end of section 9 sect peak amps: 0.0 0.0

使用例4の出力

q p1

-

  • -
使用例1
使用例1の出力

r p1 p2

  • セクションの繰り返しの始まり。s、r、eまで繰り返す
    • p1:繰り返し回数を指定
    • p2(optional):スコアセクションで利用できる繰り返し回数を表すマクロを指定
    • 繰り返されたセクションでは開始時間も0にリセットされる。
    • p2で設定されるマクロは繰り返しセクション外では未定義となる。
使用例1
  • オプションのマクロとしてCOUNTERという名前で定義し、p5として楽器に食わせる。
  • 3回繰り返すのでセクションは3つ作られる想定

r3 COUNTER
i2 0.0 1.0 220 $COUNTER
i2 1.0 3.0 440 $COUNTER ; i2 1+5 1 440
i2 2.0 2.0 480 $COUNTER ; i2 2+5 1 440
i2 3.0 2.0 440 $COUNTER ; i2 3-1 2 440
i2 5.0 1.0 880 $COUNTER ; i2 5-1 1 880
s 8

使用例1の出力
  • 繰り返されるセクションの前後に空のSECTION 1と5が自動的に生成された

SECTION 1:
end of section 1 sect peak amps: 0.0 0.0
SECTION 2:
i2 0.0 1.0 220 1
i2 1.0 3.0 440 1
i2 2.0 2.0 480 1
i2 3.0 2.0 440 1
i2 5.0 1.0 880 1
end of section 2 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 3:
i2 0.0 1.0 220 2
i2 1.0 3.0 440 2
i2 2.0 2.0 480 2
i2 3.0 2.0 440 2
i2 5.0 1.0 880 2
end of section 3 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 4:
i2 0.0 1.0 220 3
i2 1.0 3.0 440 3
i2 2.0 2.0 480 3
i2 3.0 2.0 440 3
i2 5.0 1.0 880 3
end of section 4 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

使用例2

繰り返しセクションの前後にスコアを加える

t0 120
i2 0.0 1.0 440
i2 1.0 1.0 880
i2 3.0 1.0 440
r3 COUNTER
t0 90 3 360
i2 0.0 1.0 220 $COUNTER
i2 1.0 3.0 440 $COUNTER ; i2 1+5 1 440
i2 2.0 2.0 480 $COUNTER ; i2 2+5 1 440
i2 3.0 2.0 440 $COUNTER ; i2 3-1 2 440
i2 5.0 1.0 880 $COUNTER ; i2 5-1 1 880
s 10
t0 60 2 540
i2 0.0 1.0 440
i2 2.0 1.0 880
i2 4.0 1.0 1320

使用例2の出力

繰り返しセクションの前後に生成された空セクションは、そこにスコアを書き込むとカラセクションではなく中身のあるセクションとして認識される。時間もその前後のセクションでは0に初期化される。

SECTION 1:
i2 0.0 0.5 440 0
i2 0.5 0.5 880 0
i2 1.5 0.5 440 0
end of section 1 sect peak amps: 5500.0 5500.0
inactive allocs returned to freespace
SECTION 2:
i2 0.0 0.6 220 1
i2 0.6 0.8 440 1
i2 1.0 0.4 480 1
i2 1.2 0.3 440 1
i2 1.6 0.2 880 1
end of section 2 sect peak amps: 11027.3 11027.3
inactive allocs returned to freespace
SECTION 3:
i2 0.0 0.6 220 2
i2 0.6 0.8 440 2
i2 1.0 0.4 480 2
i2 1.2 0.3 440 2
i2 1.6 0.2 880 2
end of section 3 sect peak amps: 11027.3 11027.3
inactive allocs returned to freespace
SECTION 4:
i2 0.0 0.6 220 3
i2 0.6 0.8 440 3
i2 1.0 0.4 480 3
i2 1.2 0.3 440 3
i2 1.6 0.2 880 3
end of section 4 sect peak amps: 11027.3 11027.3
inactive allocs returned to freespace
SECTION 5:
i2 0.0 0.8 440 0
i2 1.1 0.1 880 0
i2 1.3 0.1 1320 0
end of section 5 sect peak amps: 5500.0 5500.0

s p1

  • セクションの終わりを示す
    • p1(optional):セクションの長さを示す。最後のスコアの後の時間より小さい場合はこの値は無視される。大きい場合は、無音区間が発生する。
使用例1

sの後の値を小さくする。sの値が最後のイベントの発生時刻5.0(beat)より小さいため無視される。

r3 COUNTER
i2 0.0 1.0 220 $COUNTER
i2 1.0 3.0 440 $COUNTER ; i2 1+5 1 440
i2 2.0 2.0 480 $COUNTER ; i2 2+5 1 440
i2 3.0 2.0 440 $COUNTER ; i2 3-1 2 440
i2 5.0 1.0 880 $COUNTER ; i2 5-1 1 880
s 1

使用例1の出力

SECTION 1:
end of section 1 sect peak amps: 0.0 0.0
SECTION 2:
i2 0.0 1.0 220 1
i2 1.0 3.0 440 1
i2 2.0 2.0 480 1
i2 3.0 2.0 440 1
i2 5.0 1.0 880 1
end of section 2 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 3:
i2 0.0 1.0 220 2
i2 1.0 3.0 440 2
i2 2.0 2.0 480 2
i2 3.0 2.0 440 2
i2 5.0 1.0 880 2
end of section 3 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 4:
i2 0.0 1.0 220 3
i2 1.0 3.0 440 3
i2 2.0 2.0 480 3
i2 3.0 2.0 440 3
i2 5.0 1.0 880 3
end of section 4 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

使用例2

r3 COUNTER
i2 0.0 1.0 220 $COUNTER
i2 1.0 3.0 440 $COUNTER ; i2 1+5 1 440
i2 2.0 2.0 480 $COUNTER ; i2 2+5 1 440
i2 3.0 2.0 440 $COUNTER ; i2 3-1 2 440
i2 5.0 1.0 880 $COUNTER ; i2 5-1 1 880
s 10

使用例2の出力
  • テキスト出力では分からないが、各セクションの最後の楽器が発音される後に、空白時間が「(sの引数で指定されたbeat数)-(セクション最後に発生するbeat)」だけ発生した。この場合は5(beat)=5秒。

SECTION 1:
end of section 1 sect peak amps: 0.0 0.0
SECTION 2:
i2 0.0 1.0 220 1
i2 1.0 3.0 440 1
i2 2.0 2.0 480 1
i2 3.0 2.0 440 1
i2 5.0 1.0 880 1
end of section 2 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 3:
i2 0.0 1.0 220 2
i2 1.0 3.0 440 2
i2 2.0 2.0 480 2
i2 3.0 2.0 440 2
i2 5.0 1.0 880 2
end of section 3 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 4:
i2 0.0 1.0 220 3
i2 1.0 3.0 440 3
i2 2.0 2.0 480 3
i2 3.0 2.0 440 3
i2 5.0 1.0 880 3
end of section 4 sect peak amps: 16473.6 16473.6
inactive allocs returned to freespace
SECTION 5:
end of section 5 sect peak amps: 0.0 0.0

t p1 p2 p3 p4 p5 p6 p7 ....

-

    • p1:0
    • p2:0(beat)時のテンポをBPMで指定
    • p3,5,7...:次の引数で決まるBPMを開始する時間を指定
    • p4,6,8...:一つ前の引数で決まる時間から始まるBPMを指定
使用例1
使用例1の出力

v p1

  • bステートメントが加減算であったが、vステートメントは乗算をして以降の時間の値に影響を与える(らしい)
    • p1:正の値。この値を以降のイベントの時間要素(p2)に掛ける

x p1,....

  • セクションの残りのイベントを無視する。
    • p1(optional):何の引数があってもいいが何の影響も与えない。


         ←目次へ戻る