授業料無償化と発言したのは本当なのだろうか?
授業料無償化?
Twitterが授業料無償化(教育費無償化)で有象無象のごった煮となっていたので、ソースなどを辿る旅に出た記録。
According to NHK
大学在学中は授業料無償化 自民が検討案まとめる | NHKニュース
NHKニュースサイトの動画を見たが、ニュースキャスターの声が大きすぎて自民党教育再生実行本部?の生の声が聞こえなかった。果たして本当に「無償化」と発言したのだろうか?
教育再生実行本部
教育再生実行本部 第八次提言 | 政策 | ニュース | 自由民主党
教育再生実行本部の提言は、サイトを確認すると第八提言(2017年5月18日)は存在するものの(おそらく今回に相当する)第九提言はまだ存在しない。「無償化」発言のエビデンスを追うにはもう少し時間を待つ必要があるかもしれない。
自民党の政策パンフレット
「無償化」では無いが「卒業後拠出金方式」という単語は自民党の政策BANK2017のp.32に記述がある。オーストラリアのHECSを参考にした仕組みらしい。
ベネッセ
直接は関係ないが教育費無償化については、ベネッセのコラムが分かりやすかった。
考えたこと
完全無償化となると財源どうするの?となるし、卒業後拠出金方式だとすると大学の経営不安定になるような気がする。
いずれにしても現状維持より良い選択肢・現状維持より魅力的な解決策には見えないのが残念である。
全然関係ない余談
はてなブログのmarkdownモードにおいて、リンクを挿入する際[URL:title]
だとtitleが自動挿入される。
がしかし、URL参照先がpdfだとtitleを取得してくれないようである。
なので手動でタイトルを打ち込む必要がある。その方法は以下の2つである。
[URL:title=タイトル]
[タイトル](URL)
換気扇の音を作りたい
どうも音が籠もってしまう。かといってハイパスだとシャリシャリ感が邪魔である。 目的の音とは違うが、waveの音は冷蔵庫から鳴る低音に近い。
コード
( SynthDef(\kanki, { |cfreq = 388,amp=0.4| var noise,wave,out; noise = RLPF.ar(BrownNoise.ar(0.5),cfreq,0.5); wave = RLPF.ar(Saw.ar(cfreq/8,0.5),cfreq,0.3); out = noise + wave; Out.ar(0,Pan2.ar(out,0,amp)); }).add; ) ~x = Synth(\kanki);
PseqにasStreamを付けるとRoutineになる
Pseqに限らずPrandとかPbrownでも.asStream
付けるとRoutineになる。PatternをRoutineの中で使うときに重宝する、のだろうか?
なお、Patternに加えてEnvも.asStream
付けてRoutine化することが可能。
コード
///////////////////////////////// //Routine ( ~r = Routine( { 2.do({ 12.yield; 34.yield; 56.yield; }); }); ) ~r.reset; ( { 7.do({ ~r.next.postln; 1.wait; }); }.fork ) ///////////////////////////////// //Pseq ~p = Pseq([12,34,56],2).asStream; ~p.reset; ( { 7.do({ ~p.next.postln; 1.wait; }); }.fork )
参考
Pseq | SuperCollider 3.9dev Help
Ptparでカエルの歌を輪唱する
TaskかRoutineを用いて書いてみたかったけれども、思いつかなかったのでPtpar
を用いて書いてみた。
いつか「カエルの歌 無限輪唱」を書きたい。
PtparとPpar
Ptpar
はtime offset付きでparalell実行するPatternPpar
はtime offset無しでparalell実行するPattern
コード
//カエルの歌 //////////////////////////////////// ( var melody = [ 60,62,64,65,64,62,60, 64,65,67,69,67,65,64, 60,60,60,60, 60,60,62,62,64,64,65,65, 64,62,60]; var dur = [ 1,1,1,1,1,1,2, 1,1,1,1,1,1,2, 2,2,2,2, 0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5, 1,1,2]; var song = Pbind( \midinote,Pseq(melody,1), \dur,Pseq(dur,1), ); var tempo = TempoClock(120/60); /* Ptpar embed event streams in parallel, with time offset Arguments: list list of pairs of times and patterns: [time, pat, time, pat .. ]. repeats repeat the whole pattern n times. */ Ptpar([0,song,8,song,16,song],1).play(tempo); ) ////////////////////////////////////
参考
TaskやRoutineで時間制御する
TaskとRoutine
.wait
を使って時間を制御したい場合、TaskやRoutineを使う。Taskの特徴は一時停止・再開できること。一方Routineの特徴は、一時停止・再開は出来ないが.yield
が使えることである。ということで、Task・Routineで使えそうに見えるメッセージについて比較した。
TaskとRoutineの比較
メッセージ\ | Task | Routine |
---|---|---|
.play | 使える | 使える |
.start | 使える | ERROR |
.resume | 使える | .nextと同じ |
.pause | 使える(.stopと同じ) | ERROR |
.stop | 使える(.pauseと同じ) | 使える |
.reset | 使える | 使える |
.next | nil | 使える |
.value | nil | .nextと同じ |
TaskとRoutineの使い分け
Task | SuperCollider 3.9dev Helpによると、
Tasks are not 100% interchangeable with Routines. Condition does not work properly inside of a Task. Stopping a task and restarting it quickly may yield surprising results (see example below), but this is necessary to prevent tasks from becoming unstable if they are started and/or stopped in rapid succession.
また
As a result, Task should be used for processes that need to start and stop relatively infrequently, but for which maximum stability is required. If you need fine-grained control over when and how the process stops and resumes (as is the case, for instance, with condition), Routine is preferred.
とある。内部でコンディションを持つならRoutineがおすすめ、ということだと思われる。
ところでforkは?
forkは
Returns a Routine using the receiver as it's function, and plays it in a TempoClock.
である。and plays it in a TempoClockがポイントで、forkは実行すると即座にplayされてしまう、すなわちあとから実行・途中で止めることが出来ない。
コード確認
//Task ( t = Task({ inf.do({|i| ("Task" + i).postln; 1.wait; }); }); ) //Routine ( r = Routine({ inf.do({|i| ("Routine" + i).postln; 1.wait; }); }); ) //Task t.play; t.start; t.resume; t.pause; t.stop; t.reset; t.next;//nil t.value;//nil //Routine r.play; r.start;//ERROR: Message 'start' not understood. r.resume; r.pause;//ERROR: Message 'pause' not understood. r.stop; r.reset; r.next; r.value; //fork /* Returns a Routine using the receiver as it's function, and plays it in a TempoClock. */ ( f = fork({ inf.do({|i| ("fork" + i).postln; 1.wait; }); }); )
参考
Task | SuperCollider 3.9dev Help
Envでキックとハイハットを作る
昨日の復習がてら、キックとハイハットを作る。カーブの値(curve:-10)
)をいじると音が結構変わるもんだ。どうやったらセンスや勘所を掴めるのだろう・・・。
コード
//キック ( SynthDef(\kick,{ var env = EnvGen.ar(Env(levels:[100,200,60,0],times:[0.01,0.2,0.2,0.2],curve:-10)); var sig = SinOsc.ar(env,0,1,0) + WhiteNoise.ar(0.01); sig = sig * EnvGen.ar(Env.perc(attackTime:0,releaseTime:0.3),doneAction:2); Out.ar(0,sig!2); }).play ) //ハイハット ( SynthDef(\hi,{ var sig = PinkNoise.ar(0.1); sig = sig * EnvGen.ar(Env.perc(attackTime:0,releaseTime:0.1),doneAction:2); Out.ar(0,Pan2.ar(sig,SinOsc.kr(0.3))); } ).play; ) //とりあえず同時に鳴らす ( Pbind(\instrument,\kick,\dur,Pseq([1,1,1,1/2,1/4,1/4],inf)).play(TempoClock(144/60)); Pbind(\instrument,\hi,\dur,1/4).play(TempoClock(144/60)); )
Envでキックを作る
Envに慣れる
Envでエンベロープを作る。Envのargumentはlevelsの配列やtimesの配列、curveのシンボル、などを取る。timesを省略すると、1!(levelsの配列).size - 1
がtimesに指定され、curveを省略すると\lin
が指定される。
なお、.plotを付けるとエンベロープカーブを見ることができる。
例
Env(levels:[0,1,0],times:[1,1]).plot;
Env(levels:[440,880,440,330,220],curve:-5).plot;
Env([0.0, 0.5, 0.0, 1.0, 0.9, 0.0], [0.5, 0.1, 0.01, 1.0, 1.5], -4).plot;
キックを作る
Envはamplitudeに掛けるのみと思っていたがそれのみにとどまらず、frequencyに掛ける(周波数変調)こともできる。
コード例
( SynthDef(\wow, { |amp = 0.5| var lv_lists = [80,180,80,100,300,100]; var num_lv = lv_lists.size; var e_times = 0.05; var f_env = Env.new(levels:lv_lists,times:(e_times!num_lv),curve:-1); var f_envgen = EnvGen.ar(f_env); var a_env = EnvGen.ar(Env.perc(0,e_times*num_lv),doneAction:2); var sig = SinOsc.ar(f_envgen,0,mul:amp) * a_env; Out.ar(0,sig!2); }).add; ) //単音実行 Synth(\wow); //Pbindで四分音符刻み ~aWow = Pbind(\instrument,\wow,\dur,1).play;
コード備忘録
f_envとf_envgenはfrequencyのエンベロープ、a_envはamplitudeのエンベロープ(パーカッシブのデフォルト)である。f_envはこのような形。
実行すると「一瞬ウニュってる」ような?キックが聞こえるはず。
参考
Mixの使い方
Mix.fillのargumentsはnとfunction。このfunctionは(0..n-1)の値を取るカウンターを引数として受け取る。0から始まる点に注意。
なお、SC3だとMix.arFill == Mix.krFill == Mix.fillである。
コード例
( var num = 5; {Mix.fill( num, { arg i; i.postln;//-> 0,1,2,3,4 SinOsc.ar(500 * (2*i+1),0,1/num); } )}.play; )