ページ 11

JavaScript,Pascal 音声波形編集スクリプトの組み方

Posted: 2015年10月18日(日) 02:00
by come
UTAU音源という、3~5秒程度の短く大量の人の肉声が収録されたwavファイルを効率よく加工したく、
手元にあったFL studioという作曲ソフトウェアの
EDISONという音声波形編集プラグインのスクリプト機能が使えるのではないかと考え
作成しています。

具体的にやろうとしていることは

0.音声ファイルのノーマライズ(最大化)
1.3~5秒程度の音声ファイルの発声開始手前の空白部分をカット
2.さらにそのファイルを頭から1.8秒でカット

3.0~2の工程を複数ファイルに対して一括操作
(おそらくこのツールで複数ファイルの一括操作は出来ないようなので、
工程0~2が作成でき次第、一ファイルずつ手動操作で取り組もうと考えています)


aikeの日記 (id:aike) http://d.hatena.ne.jp/aike/20101016
こちらでサンプルに出していただいているJavaSscriptの例文と考え方を編集することで、
工程の1、2は実現できたのですが、

工程、0.音声ファイルのノーマライズ(最大化)でつまずいております。
リファレンスにある、二つの関数

コード:

 
function NormalizeFromTo(x1, x2: integer; Vol: single; OnlyIfAbove: boolean = FALSE): single;
//Normalize the wave between sample positions x1 and x2 (inclusive)

または、

コード:

 
procedure NormalizeFormat(Source: TSample; Mode: integer = nfAll);
//Change the format of this sample to be compatible with the format of the source sample. See the mode constants above

この二つのどちらかの関数を使うのではないかと推測し、試していますが、そもそもコンパイルを通せません、

せめてNormalize関連の関数で動作するJavaScriptのサンプルコードがあればと思い探したのですが見つけられず、

FL Studio内のその他のサンプルコードも参照しているのですが、
Normalize関連の関数が記述されているはファイルは全てPascalで表記されており、
私の読解力、またはそれ以前の基礎知識の不足のため、読み替える事ができませんでした。

[1] 質問文
 [1.1]したい事:EDISON上でJavaScriptの構文で音声ファイルのノーマライズ(最大化、正規化)
 [1.2] プログラムコード:後述
 [1.3] エラーメッセージ:後述
 [1.4] 今は、Normalize系の関数が使用されているpascalのサンプルスクリプトを読み替え、
    シンプルにノーマライズだけをするJavaScriptのサンプルを作成しようとしてますが、
    基礎知識がないまま闇雲に試みているためエラーを無くすことができておりません。
    問題解決に必要そうな道筋、基本的な考え方などを教えていただきたいです。


[2] 環境  
 [2.1] OS : Windows7 32bit
 [2.2] コンパイラ名? :EDISON in FLstudio11有償エディション
体験版の最新バージョン12はこちらです:http://www.image-line.com/downloads/fls ... nload.html

[3] その他
 ・C言語の知識は初歩の表層をなぞったことがある程度です。Javaは舐めた程度 JavaScript pascal は今回初めて使用します

参考にしている主なページ
FL StudioとJavaScriptでサウンドプログラミング - aikeの日記 (id:aike) http://d.hatena.ne.jp/aike/20101016 
FL Studio @ ウィキ - Edison #atwiki http://www42.atwiki.jp/fruity/pages/118.html
FL Studio @ ウィキ - Edison スクリプト・ツール #atwiki http://www42.atwiki.jp/fruity/pages/133.html









同梱されているサンプルファイル例

pascal ファイル名 Ring modulation.edscript

コード:

 
script "Ring modulation" language "pascal";

procedure RM(Mix:Single;OverSample:Boolean);
var   n,x,c,x1,x2,OldSampleRate:Integer;
      s,s1,s2,v1,v2:Single;
      CBSample:TSample;
Begin
// get sample from clipboard
CBSample:=TSample.Create;
CBSample.LoadFromClipboard;
if CBSample.Length<=0 then 
   Begin
   CBSample.Free;   
   Exit;
   End;

// oversample
if Oversample then 
   Begin
   OldSampleRate:=EditorSample.SampleRate;
   EditorSample.SampleRate:=EditorSample.SampleRate+CBSample.SampleRate;
   End;

// normalize both to the same format
EditorSample.NormalizeFormat(CBSample);

Editor.GetSelectionS(x1,x2);
if x2-x1>=CBSample.Length then x2:=x1+CBSample.Length-1;

v1:=Mix;
v2:=1-v1;

for n:=x1 to x2 do 
  Begin
  x:=n-x1;
  if x mod 10000=0 then ProgressMsg('Processing',x,x2-x1);
  
  for c:=0 to EditorSample.NumChans-1 do
    Begin
    s1:=EditorSample.GetSampleAt(n,c);
    s2:=CBSample.GetSampleAt(x,c);
    s:=(s1*s2)*v1+s1*v2;
    EditorSample.SetSampleAt(n,c,s);
    End;
  End;
  
CBSample.Free;  
if Oversample then EditorSample.SampleRate:=OldSampleRate;
End;


var Form:TScriptDialog;

Begin
Form:=CreateScriptDialog('Ring modulation','Oversampled ring modulation. Clipboard data is used as modulator.');
Form.AddInput('Mix',1);
Form.AddInputCombo('Oversample','No,Yes',0);
if Form.Execute then RM(Form.GetInputValue('Mix'),Form.GetInputValueAsInt('Oversample')=1);
Form.Free;
End.
 



読み替えて自作してみた JavaScript
コンパイルエラーメッセージ:There was an error compiling the script.
";" expected but "NormSample" found at line 3: TSample NormSample;

[codeJScript]
script "Normalize" language "javascript";
//20151017

TSample NormSample;

EditorSample.LoadFromFile(ScriptPath+'HelloWorld.wav');

NormSample = TSample.Create;
NormSample.LoadFromClipboard;


EditorSample.NormalizeFormat(NormSample);

[/code]

EDISONの操作など不明な点がありましたらご指摘ください、
よろしくお願いします。