裏目小僧の部屋

2023目標

やるべきこととか思いついたらコメント機能で書く

  • やっぱりスクリプトは遅い。関数呼び出しのオーバーヘッドが特に大きい様子。
    • fs=8Kなら ある程度動くけど fs=44.1K だとほとんど余裕がない。少し長くなると音切れする
  • スクリプトで試した後は直接実行させるようにしたい
  • 考えられる方法は2つ
    • コードを DLLとして アプリ側から呼び出す
      • コード中のbegin 〜 end. は C言語でいう main 関数なので これを ライブラリにするt DLLMAINとなってしまう
    • コードを単体のアプリとして動かす
      • 音だけ出すGUIも何もないアプリになってしまって不便だろ
  • という事で DLL化したい。
  • そうすると begin 〜 end.を 関数ブロックに書き換える必要がある
    • 案A ファイルの頭に function を突っ込んで最後の end. を end; に書き換える
      • 問題は classの定義が出来なくなる事.音を出す処理必要そうでもない
    • 案B ファイルの先頭から真面目に構文を調べて begin 〜 end.ブロックを探す
      • ちょっと手間だよね PascalScriptのPSCompilerを触れば可能かもしれないけど
  • そうだ! begin〜end. を隠して procedure main;begin 〜 end;にすれば良いんだ! - 裏目小僧 (2023年01月20日 16時30分43秒)
  • DLL化の実験は成功したけど EXEには出来ないかな - 裏目小僧 (2023年02月09日 14時29分46秒)
  • EXEにするとなれば音程を設定する機能とか必要だよな。そっちを先に作ってゆこう。まずピアノキーボード表示からだね - 裏目小僧 (2023年02月10日 04時30分10秒)
  • FFTの計算と結果の周波数特性表示も必要だしZ変換の周波数特性表示も必要。そうすると複素数のスクリプトも必要か。 FFTとかは20年か30年くらい前に何度か作ったから引っ張り出して動くようにしないと - 裏目小僧 (2023年02月24日 11時57分38秒)
  • そういや複素数積をx86SIMD命令で出来るようになったとか昔に聞いたから調べてみよう - 裏目小僧 (2023年02月24日 12時01分34秒)
  • 方針転換 - 裏目小僧 (2023年04月09日 04時42分09秒)
    • windowsアプリは公開してもダウンロードしてもらえない。というかウイルス扱いされてダウンロードできない。
      • それを回避するにはVectorとかウイルスチェックしてるサイトに登録するしかないだろう。
    • Z変換やラプラス変換の周波数特性表示をJavaScriptで作り、鍵盤表示して音をJavaScriptで出して気づいた事がある
    • pascalScriptに比べてJavaScriptは高速で10〜15年前のネイティブアプリ程度の速度が出る
    • これは JavaScriptでもう音を出す処理も全部やってしまえって啓示だ。
    • 問題はJavaScriptをユーザーが完全に作れるようにすると悪戯し放題って事
    • そこで以下のような方針を考えた
・JavaScriptのeval機能を使って実現するため悪戯防止の為に機能制限をする 
・最初は強く機能制限し、後で緩和する
・追加時は他言語へのコンパイルも意識し他言語に翻訳可能な範囲とする
    • 仕様としてはこんな感じかな
仕様(暫定)
・変数名は英字+数字のみで英字は2文字に制限
・関数はMathの1変数関数に制限
・演算子も3項演算子のような複雑なものや文字列関係を除く
・if文/loop文は無い。 > < は正しいなら1 でなければ0
特殊な変数(定数)
PI  円周率(定数)
no  番号 1-110 no==81の時880H
n0  (no-12)/12 の整数が設定される
n1  0=C 2=D 3=E 4=F となる番号 no == n1 + n0*12+12 
sw  呼び出したボタンが押されている間1 離されたら0 
f   周波数(平均律で設定されるので必要ならn0,n1から求める)
fs  サンプルレート
v0  音量が設定(yの値に後で掛け算されるので参照は不要だが音量に応じた応答をする場合用)
v   実行中に与えられる音量 
v1〜v9 ツマミ類の為の予備
y   出力値 y=y0*v とするのがよい(実際の出力時v0が掛け算される)
y0  音量を設定する前の出力値
NZ -1〜+1の乱数
他 tm tA tD vS tR が予約されている n,t,vはユーザー用として使わない方がいい
変数 定数 関数 演算子 と()
 変数 変数名 [a-zA-Z][a-zA-Z]?\d* 
 定数 小数点付 10進数のみ
 関数 sin() cos() tan() log() log10() exp() abs() sqrt() ceil() randowm() round() trunc()
 演算子 + - * /    > <  
変数=式;
実装文
文の集まり
プログラム
プログラムは文字列で与えられる。
プログラムの解釈の前に全ての改行と空白タブは除かれる。
初期化部(無ラベルのの実装分)の後 A部 D部 S部 R部が続き文字列が終了する
全体の形は
 初期化 実装文;
 A:秒:実装文;
 D:秒:実装文;
 S:量:実装文;
 R:秒:実装文;
となる。
秒と量は変数又は数値又は数式で設定する 変数・数式が使われても初期化後の値で固定される
量 最大は1なので 0.6のように設定する
ADSRの実装文は指定秒とSはボタン押し中に繰返し実行される 
またv 変数が更新される A: 0->1に大きくなり D:1->v0->S量に小さくなり S:指定量 R: s量->0へと小さくなる
vは直線状に変化するので必要なら加工して独自エンベロープを作ればよい。
基本的にvに従う必要はなく独自の処理をすればよい。
A以外は省略出来る。省略時は秒/量は0となる
DSR各部の実装部を省略した場合A部の実装部が呼ばれる
実装した場合はyを更新する式が一つは必要
動作
キーボードが押されると
初期化部が1回実行されと、ADSRの秒量が計算され記録される
 その後AとDが指定秒間、繰返し実行される。
ADが終了してもボタンが押されていればSがボタンが離されるまで繰返し実行される
最後に Rが指定秒実行され終了する
 A+D中にボタンが離されてもA+DとRは実行される
お名前: コメント:

プライバシーポリシー本文は日本語以外に翻訳禁止