【问题标题】:Volume Slider in Matlab GUIMatlab GUI 中的音量滑块
【发布时间】:2015-10-07 17:10:09
【问题描述】:

上一篇链接:
Matlab Questions about Audioplayer GUI

我正在尝试在 Matlab 中制作音量滑块...
所以目前我从我搜索的内容中想到的是使用句柄变量来获取滑块的值。之后,我打算让变量乘以音频播放器中的 (x,fs)。
我当前句柄开头的代码是这样的......

handles.a = []  ; %I don't know what to put for this >.<
handles.output = hObject;
handles.myPlayer=[];
guidata(hObject, handles);

我的音量滑块代码是这样的:

function slider1_Callback(hObject, eventdata, handles) 
handles.a = get(handles.slider1,'Value');
guidata(hObject,handles);

我的音频播放器代码将是这样的(不确定如果我这样做是否会起作用):

FullPath='C:\Users\Y400\Documents\MATLAB\test1'; 
[x,Fs]=wavread(FullPath);
handles.myPlayer = audioplayer(handles.a*x,Fs);
play(handles.myPlayer);`
guidata(hObject, handles)`

因此,当我在此之后尝试“播放”音频时,出现以下错误:
未定义的函数或变量“a”。

如果有人可以指导我,将不胜感激? >.

编辑

我设法解决(?)错误:未定义的函数或变量“a”。

我现在的错误是我收到了这个错误:
错误使用 * 内矩阵尺寸必须一致。

上面的代码被编辑后也出现以下错误...

当我尝试将handles.a 与x 相乘时,“*”就出现了

【问题讨论】:

    标签: matlab slider volume


    【解决方案1】:

    现在让我们看看如何在不重新开始播放示例的情况下增加/减少音量:

    在slider1_Callback 中:

    function slider1_Callback(hObject,handles,eventdata)
    
    %Pause audioplayer
    
    pause(handles.myPlayer);
    
    %Know how far the user has got in the sample
    
    NewStart=get(handles.myPlayer,'CurrentSample')+1;
    
    %stop current player
    
    stop(handles.myPlayer);
    
    %Reload your sample
    
    [x,Fs]=wavread(FullPath);
    
    %Create a new sample by cutting x and keeping only the lines from NewStart 
    %to the end
    
    x=x(NewStart:end,:); 
    
    %Get the value of the slider
    
    Volume=get(handles.slider1,'value');
    
    %Set new audioplayer
    
    handles.myPlayer=audioplayer(x*Volume,Fs);
    
    %Play
    
    play(handles.myPlayer);
    
    % save handles structure
    
    guidata(hObject,handles);
    

    您的音频样本有多长?如果它太长,加载和中断播放可能需要一些时间。为了减少加载时间,您可以考虑保存数据(例如在按钮的“用户数据”属性之一中)。

    【讨论】:

    • 插入后出现如下错误:未定义函数或变量'FullPath'。那么我是否必须再次重新定义 FullPath?如果是这样,我该怎么做,我是否使用 if else 函数?
    • 相信你自己能解决这个问题,而且对你来说会更有收获! (你处于领先地位!)
    • 好的,谢谢,我会先尝试解决,如果有错误,我可以在这里问你吗?
    • 是的,试试你在上一条评论中提出的建议!
    • 好的,我已经尝试过了,没有错误,但它似乎在稍作停顿后跳回到开头>。
    【解决方案2】:

    在您的上一篇文章中,为了让我们创建的 audioplayer 对象对整个程序可见,我们必须手动将其存储在 habdles 结构中。

    按钮、滑块、编辑文本等 UI 控件自动存储在 GUI 句柄结构中。

    例如,标签为“slider1”的滑块可以通过“handles.slider1”访问。

    要获得它的价值,你可以使用:

    get(handles.slider1, 'value');
    

    请注意,在属性检查器中,您可以更改其 Min 和 Max 属性以满足您的需要(这里 Min=0 和 Max=5 似乎很正确)。

    现在,我们必须实际更改音频样本的音量。

    一种简单的方法(但它会从一开始就重播样本),就是在你用来播放声音的按钮中实现音量修改(如果我没记错的话是Button3):

    行后:

    [x,Fs]=wavread('FullPath');
    

    添加:

    Volume=get(handles.slider1,'value');
    

    然后:

    handles.myPlayer=audioplayer(Volume*x,Fs);
    

    最后一步是在你的 slider1_Callback 中调用 Button3 的回调:

    Function     Slider1_Callback(hObject,handles,eventdata)
    
    Button3_Callback(hObject,handles,eventdata);
    

    告诉我这是否是您需要的,或者您是否希望在不从头开始重新启动样本的情况下增加音量,这会有点困难,但仍然可行。

    【讨论】:

    • 您好,感谢您的回复。当我插入以下代码时,它似乎给了我一个错误: Button3_Callback(hObject,handles,eventdata);是的,我需要在不重新启动的情况下增加/减少音量
    • 播放按钮的标签是什么?
    • 是pushbutton1。而不是 Button3_Callback(hObject,handles,eventdata); ,我使用 pushbutton1_Callback(hObject,handles,eventdata);
    • 是的,就是这样。我正在发布第二个答案,以便在不重新启动的情况下增加/减少音量
    猜你喜欢
    • 2014-12-25
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多