Mathematica や Matlab、S言語といった数値計算ソフト(?)には
クローンや類似の機能を持ったフリーソフトがあったりします。
数値計算用:
Scilab
日本語ドキュメントが充実しているのでオススメ。
本件で必要な機能は一通り揃っているのではないでしょうか。
デモとそのソース参照。evalもあるしGUIも作れるし
ウィンドウ枠なしの全画面表示も一応自前でできる。
helpにはサンプルコードの実行ができるものがあり
そこでコードの編集もできる。
(組込エディタを使用。起動コマンドはedit)
「Scilab GUI」でWebページを検索してみるのもいい。
Matlabクローン:
Octave
FreeMat
統計計算用:
S言語クローン:
R言語
数式処理用:
Maxima
Risa/Asir
※Mathematica・Mapleを含め使ったことが無いので詳しいことは。
数値計算機能はあるようです。
plot関数など、特に画面表示を行う関数の多さと機能の豊富さと出来の良さは商用には遠く及びません。
(開発元がそこまで用意して無いだけなので自分で書けばできます)
最近は Python が人気ですね。猫も杓子もPy。NumPy や SciPy があれば Matlab いらんという人も多いのだとか。
Mathematica は以前から、Matlab は近年になってですが家庭向けのタダ同然の安価な販売形態がありますので是非ご検討ください。
商用はいい!一度使うと他のものは使えないレベルです。
JavaScript で波形生成&音再生は以前試したことがあります。よく覚えていませんしコードはどこかへ行ってしまいました。XP時代のULCPCだったしただ書いただけでシングルスレッドだったし書き方が悪かったかも知れないですが、1秒分生成するのに10秒程度まで改善したものの大幅な改善が難しそうな感じだったので諦めました。(Scilabは比較的低速ですが、同様の処理を最も低速な書き方で30秒、高速な書き方なら1/100秒)
ブラウザで実行する関係上ローカルのストレージ上のデータの読み書きが面倒な上に制約が多いという難点もあります。ローカルネットワーク上にwebサーバを置いてサーバサイドで処理する仕組みのほうが結果的に簡単に済むかも知れません。
OKwaveのようなところで訊いてみればあっさり解決するかも知れませんね。
spwave のような生のバイナリデータを扱える音声ファイルエディタもありますので変換・再生機能はそういうものに任せてもいいでしょう。
描画を Gnuplot などに任せることもできます。(以前 Octave がそのようにしていました)
事実上ほぼ全ての言語・環境・ソフトウェアでお望みのことはできることになります。
有名どころはもちろん、
とっつきやすそうなところ(GUI機能を自前で持っているスクリプト実行環境)では
Hot Soup Processor (日本生まれ)
VCSSL (日本生まれ。ドキュメントが良く整備されている)
Squeak (目的には非常に合っている。しかし日本語情報は少な目)
LibreOffice(StarBasic)
フリーじゃ無いけど Microsoft Excel(VBA) も圧倒的な利用者人口が絶対的に有利ですのでおすすめです。
コンパイル型の言語で起動後に数式を変更するとなるとパーサが必要になりますが、自分で書かなくてもコンパクトでフリーなコンパイラというのもあるのでそれに渡して処理させることができます。
参考:
spwave
http://www-ie.meijo-u.ac.jp/~banno/spLibs/spwave/index-j.html
// 以下Scilab用コード samplecode1.sce の中身。
// コンソールに
// exec samplecode1.sce;
// などと入力して実行する
// Play で再生
// Eval で数式を評価
// 数式のyの値がグラフ表示・再生されます。
// 数式は末尾に ; (セミコロン)をつけます。一行に複数書けます。
funcprot(0); //エラー抑制
//// //// sub //// ////
function plot_sub(container)
drawlater();
if ~isempty(ha.children)
delete(ha.children);
end
sca(ha);
ix = 10900:11200; //表示区間は決め打ち
plot(ix, container.y(ix),'.-','Markersize', 2)
drawnow();
endfunction
//// //// callback - play //// ////
function pb_callback(s, Fs)
playsnd(0.25 * s, Fs); // 振幅を少し小さくしてますが音量注意
endfunction
//// //// callback - eval //// ////
function ev_callback(container)
fs = container.fs;
t = container.t;
execstr(hc2.String); //エラー対策してません!
container.y = y;
plot_sub(container)
// Saving Data
container = resume(container);
endfunction
//// //// main //// ////
funcprot(1); //エラー抑制を戻す
fs = 44100; //サンプリング周波数
t = 0:1/fs:.25; //0からXX秒までの時刻データの配列(1行だけの行列)
y1 = sin( 2 * %pi * ( 440 * 2^(-9/12) ) .* t ); // sin(2πft) 約XX秒のデータ
y2 = sin( 2 * %pi * ( 440 * 2^(-7/12) ) .* t );
y3 = sin( 2 * %pi * ( 440 * 2^(-5/12) ) .* t );
y4 = sin( 2 * %pi * ( 440 * 2^(-4/12) ) .* t );
y5 = sin( 2 * %pi * ( 440 * 2^(-2/12) ) .* t );
y6 = sin( 2 * %pi * ( 440 * 2^( 0/12) ) .* t );
y7 = sin( 2 * %pi * ( 440 * 2^( 2/12) ) .* t );
y8 = sin( 2 * %pi * ( 440 * 2^( 3/12) ) .* t );
y = [y1 y2 y3 y4 y5 y6 y7 y8]; //全部をつなげる
//GUI作成
hf = figure(100,'position', [150, 32, 800, 400]);
//button
hc = uicontrol(hf, 'Style', 'pushbutton', 'Callback', 'pb_callback(container.y, fs)', ...
'unit', 'normalized', 'Position', [.85 .15 .1 .1], ...
'String', 'Play');
//button
hc3 = uicontrol(hf, 'Style', 'pushbutton', 'Callback', 'ev_callback(container)', ...
'unit', 'normalized', 'Position', [.85 .3 .1 .1], ...
'String', 'Eval');
//edit box
//複数行の編集を可能にする場合は付属のTCL/Tkやエディタを使うほうが良さげ。
str = ['y1 = sin( 2 * %pi * 262 .* t ); y8 = sin( 2 * %pi * 523 .* t ); y15 = sin( 2 * %pi * 1047 .* t ); y = [y1 y8 y15];'];
hc2 = uicontrol(hf, 'Style', 'edit', 'Callback', '', ...
'unit', 'normalized', 'Position', [.05 .85 .9 .075], ...
'String', str);
//描画領域
ha = newaxes();
ha.axes_bounds = [0 .1 .9 .9];
//受け渡し用変数にデータを格納
container.fs = fs;
container.t = t;
container.y = y;
plot_sub(container); //plot
pb_callback(y, fs) //初回再生
補足
早速のご回答をいただき、とても感謝しております。 Python を使ったことがありませんが、ブラウザー上で javascript を用いて 同じ動作をさせることが可能でしょうか。 もし JS で無理な場合には、Cの初心者レベルのコードを何とか フリーのコンパイラーで試してみるくらいの作業は 子供の学習用教材として週末に取り組んでみれるかもしれません。 よろしくご指導のほどをお願いいたします。