3

私は[y, Fs, nbits, opts] = wavread(filename)Waveファイルを読み込むために使用しています。次に私plot(t, y)はどこにt = 0:1/Fs:(length(y)-1)/Fs。を介してwavを再生しsound(y, Fs)ます。私の質問は、wavからのオーディオと同期するある種のマーカーをプロットに表示する方法はありますか?プロット内で移動するマーカーを介して、対応するサウンドがプロット内のどこにあるかを観察しながら、オーディオを聞きたいと思っています。

4

1 に答える 1

2

以下は、同期が良好なソリューションです。audioplayerオブジェクトが再生ヘッドの位置を更新するコールバックを開始しているため、これはうまく機能します。これが呼び出しスクリプトです。。。

fs = 44100;
durT = 3; %seconds
durS = fs*durT; %samples
x = randn(durS, 1);

dt = 1/fs;
tAxis = dt:dt:durT;

frameRate = 25; %fps
frameT = 1/frameRate;

mag = 5;

figure;
plot(tAxis, x);
ylim([-mag mag])
xlim([0 durT])
xlabel('Time [s]')

playHeadLoc = 0;
hold on; ax = plot([playHeadLoc playHeadLoc], [-mag mag], 'r', 'LineWidth', 2);

player = audioplayer(x, fs);
myStruct.playHeadLoc = playHeadLoc;
myStruct.frameT = frameT;
myStruct.ax = ax;

set(player, 'UserData', myStruct);
set(player, 'TimerFcn', @apCallback);
set(player, 'TimerPeriod', frameT);
play(player);

...これが別のファイルに保存できるコールバック関数です...

function src = apCallback(src, eventdata)
    myStruct = get(src, 'UserData'); %//Unwrap

    newPlayHeadLoc = ...
        myStruct.playHeadLoc + ...
        myStruct.frameT;
    set(myStruct.ax, 'Xdata', [newPlayHeadLoc newPlayHeadLoc])

    myStruct.playHeadLoc = newPlayHeadLoc;
    set(src, 'UserData', myStruct); %//Rewrap
end

信号をノイズサンプルにして、好きなものに置き換えることができます。audioplayerオブジェクトが現在のプレイヘッドの場所にアクセスできないメソッドを持っstopているのは残念です。resume幸いなことに、好きなものを詰め込むことができるユーザーデータプロパティがあります。

于 2012-10-10T18:45:48.397 に答える