ドレミファソラシド
signal processing toolboxを使っています。
サンプリング周波数44100、刺激時間50msec、両端に3msecのblackmanフィルターをかけたwavファイルを作ってみます。
音は以下のようになっています。
音 | 記号 | 周波数(Hz) |
---|
ラ | A | 440.0000 |
ラ# | B | 466.1638 |
シ | H | 493.8833 |
ド | C | 523.2511 |
ド# | C# | 554.3653 |
レ | D | 587.3295 |
レ# | D# | 622.2540 |
ミ | E | 659.2551 |
ファ | F | 698.4565 |
ファ# | F# | 739.9888 |
ソ | G | 783.9909 |
ソ# | G# | 830.6094 |
ラ | A | 880.0000 |
fs=44100; % sampling frequency
t=linspace(0,1,(fs+1))'; % まず1秒間の時系列を作成
t(t>0.05)=[]; % 時系列を0〜50msecとする
x=440*2.^((0:12)/12); % 440〜880Hzを12音階に等分
y=sin(t*2*pi*x); % 各音階の時系列作成
t1=find(t<0.003);
t2=find(t>(0.05-0.003));
w=blackman(size(t1,1)+size(t2,1)); % signal processing toolboxのblackman関数
y([t1;t2],:)=(w*ones(1,size(y,2))).*y([t1;t2],:);
k=3*ones(size(y,1),1)*(1:size(y,2)); % 作図用
figure;set(gcf,'color',[1,1,1]);plot(t,y+k,'r');axis ij;
set(gca,'ylim',[0,max(k(:))+3]);grid on;
ytick=k(1,:);
for k=1:size(x,2);yticklabel{k}=sprintf('%0.4fHz',x(k));end;
set(gca,'ytick',ytick,'yticklabel',yticklabel');

演奏します。
wavplay([y(:,1);y(:,3);y(:,5);y(:,6);y(:,8);y(:,10);y(:,12);y(:,13)],fs);
ではwavファイルにします。
[filename,pathname]=uiputfile('*.wav'); % path名だけ使用
if filename==0;return;end;
bits=16;% 16bitでは警告が表示されるが無視する
for k=1:size(x,2);
filename=sprintf('%08.0f.wav',x(k)*10000);
wavwrite(y(:,[k,k]),fs,bits,strcat(pathname,filename));% 左右2ch同じ音として保存する。
end;
これで12音階のwavファイルができました。
後でSTIM側で16bit WAVファイルをSNDファイルに変換する必要があります
ドとソのMismatch Negativity Fieldの課題を作ってSTIMで認識できるSEQファイルとして保存してみます。
standard刺激 : deviant刺激は4 : 1にし、300回試行することとします。
N=300; % 試行回数
[filename,pathname]=uiputfile('*.seq');
if filename==0;return;end;
fid=fopen(strcat(pathname,filename,'.seq'),'w');
fprintf(fid,sprintf('Numtrials %0.0f\n',N+1));
fprintf(fid,'event mode dur win soa x/r y/l resp type file\n');
fprintf(fid,'------------------------------------------------------------------------\n');
for x=1:N;
if rand(1)>0.8;
trig=1;filename=' 05232511\n';% ド
else
trig=2;filename=' 07839909\n';% ソ
end;
st=sprintf('%0.0f WAV 0 0 1.0 90 90 -1 %0.0f ',x,trig);
fprintf(fid,strcat(st,filename));
end;
fprintf(fid,sprintf('%0.0f GOTO 1 0 0 0 0 0 0 0\n',N+1));
fclose(fid);
MATLAB上でテストしてみます。尚試行回数は20回にしています。
n=1;tic;
while 1==1;
if toc>=1;
if rand(1)>0.8;wavplay(y(:,[4,4]),fs);
else wavplay(y(:,[11,10]),fs);
end;
n=n+1;tic;
if n==20;break;end;
end;
end;
wavplay実行時にパラレルポートから5Vのtrigger信号を送ることができればSTIMの代用になりそうです。
テンポ=120、即ち四分音符を1分間に120回としてMATLABで演奏してみます。
clear;
fs=44100;
t=linspace(0,4,fs*4+1)'; % 4秒間
tempo=60/120; %四分音符の持続時間
x=440*2.^((0:24)/12); % 2オクターブ
y=sin(t*2*pi*x); % 全音符の各音階の時系列作成
t2=find(t <tempo*2); % 二分音符
t24=find(t <tempo*3); % 付点二分音符
t4=find(t <tempo);% 四分音符
t48=find(t<tempo*1.5);% 付点四分音符
t8=find(t <tempo*0.5);% 八分音符
bw=prod(size(find(t<0.01))); % blackmanの時間幅の半値
w=blackman(bw*2);
wa=w(1:bw);wb=w((bw+1):end);
music=[];
w=y(t48,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,9);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,8);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,6);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,4);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,8);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,8);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,6);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,4);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,4);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,8);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t24,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,18);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t24,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,15);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,20);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,20);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,18);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,20);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,20);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,18);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t2,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t48,13);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t8,11);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,18);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,18);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t24,16);w=w.*[wa;ones(size(w,1)-2*bw,1);wb];music=[music;w];
w=y(t4,16)*0;music=[music;w];
wavplay([music,music],fs);
32秒の曲ですが、MATLAB上では10.7MB(64bit浮動小数点)になりました。
曲は校歌みたいですが満州国の国歌です。