itaVA_experimental_gui.m 17.5 KB
Newer Older
1
function varargout = itaVA_experimental_gui(varargin)
2
3
4
5
6
7
8
9
10
11
12
13
% ITAVA_EXPERIMENTAL_GUI VirtualAcoustics (VA) GUI adapter for simple FIR filter switch auralization
%       
%       Connect to a running VA server instance, play back sounds and
%       exchange filters of your workspace to make an FIR filter set of aribatrary channel number
%       audible. Input data is only considered if current workspace
%       variable is of itaAudio type and time data can be accessed.
%       
%       This GUI requires an enabled generic path prototype renderer in
%       VACore. The number of channels is fixed and has to match the channels provided in
%       the renderer. Basically, a real-time convolution engine is set up
%       and it's FIR filters can be exchanged instantaneously using Matlab
%       and the VAMatlab TCP/IP network interface.
14
%
15
16
%       To configure itaVA, call itaVA_setup. To run the experimental
%       VA server, call itaVA_experimental_renderer_prepare and itaVA_experimental_start_server
17
%
18
19
20
21
%       If the VA server is printing a lot of "empty output" warnings, you
%       can ignore them. It is a hint that the rendering processor produces
%       zeros, which is normal if your initial FIR filter is empty. This is
%       the default behaviour.
22
23
24
%
% Edit the above text to modify the response to help itaVA_experimental_gui

25
% Last Modified by GUIDE v2.5 04-Apr-2017 22:31:45
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @itaVA_experimental_gui_OpeningFcn, ...
                   'gui_OutputFcn',  @itaVA_experimental_gui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before itaVA_experimental_gui is made visible.
48
function itaVA_experimental_gui_OpeningFcn( hObject, ~, handles, varargin )
49
50
51
52
53
54
55
56
57
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to itaVA_experimental_gui (see VARARGIN)

% Choose default command line output for itaVA_experimental_gui
handles.output = hObject;
handles.va = itaVA;
58
handles.module_id = 'PrototypeGenericPath:MyGenericRenderer';
59
handles.va_source_id = -1;
60
handles.va_signal_id = '';
61
handles.va_listener_id = -1;
62
63
64

refresh_workspace_vars( hObject, handles );
refresh_sourcesignals( hObject, handles );
65
66

% Update handles structure
67
guidata( hObject, handles );
68
69
70
71
72
73
74
75



% UIWAIT makes itaVA_experimental_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
76
function varargout = itaVA_experimental_gui_OutputFcn( ~, ~, handles) 
77
78
79
80
81
82
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
83
varargout{ 1 } = handles.output;
84
85
86


% --- Executes on button press in connect_connect_va.
87
function connect_connect_va_Callback( hObject, ~, handles )
88
89
90
91
92
93
94
95
96
% hObject    handle to connect_connect_va (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.va.isConnected
    handles.va.disconnect;
end
handles.va.connect;
handles.va.reset;

97
gpg_renderer_list = [];
98
99
for n=1:numel( handles.va.getRenderingModules )
    if strcmp( handles.va.getRenderingModules( n ).class, 'PrototypeGenericPath' )
100
        gpg_renderer_list = [ gpg_renderer_list handles.va.getRenderingModules( n ) ];
101
102
103
    end
end

104
105
106
107
108
if numel( gpg_renderer_list ) == 1
    gpg_renderer = gpg_renderer_list( 1 );
elseif numel( gpg_renderer_list ) > 1
    gpg_renderer = gpg_renderer_list( 1 );
    warning( 'More than one prototype generic path renderer found. Using first.' )
109
else
110
    error( 'No prototype generic path renderer found, please add or enable in VA configuration.' )
111
112
end

113
114
disp( [ 'Using channel prototype generic path renderer with identifier: ' gpg_renderer.id ] )

115
% Classic VA module call with input and output arguments
116
handles.module_id = [ gpg_renderer.class ':' gpg_renderer.id ];
117
in_args.info = true;
118
119
out_args = handles.va.callModule( handles.module_id, in_args );
disp( [ 'Your experimental renderer "' handles.module_id '" has ' num2str( out_args.numchannels ) ' channels and an FIR filter length of ' num2str( out_args.irfilterlengthsamples ) ' samples' ] )
120
121
122

handles.edit_va_channels.String = out_args.numchannels;
handles.edit_va_fir_taps.String = out_args.irfilterlengthsamples;
123
handles.edit_va_fs.String = '44.100'; % @todo get from VA audio streaming settings
124

125
% Useful FIRs
126
global ita_impulse;
127
128
129
130
131
132
133
if ~exist( 'ita_all_dirac', 'var' )
    ita_impulse = ita_merge( ita_generate_impulse, ita_generate_impulse );
end
global ita_silence;
if ~exist( 'ita_all_silence', 'var' )
    ita_silence = ita_merge( ita_generate_impulse, ita_generate_impulse ) * 0;
end
134

135
% Very simple scene with one path
136
137
handles.va_listener_id = handles.va.createListener( 'itaVA_ExperimentalListener' );
handles.va_source_id = handles.va.createSoundSource( 'itaVA_ExperimentalSource' );
138
139
140
141
142
143
144
145
146
147
148
149
handles.va_signal_id = '';

% VA control
handles.va.setOutputMuted( handles.checkbox_global_muted.Value );
handles.va.setOutputGain( handles.slider_volume.Value );


% Update handles (store values)
guidata( hObject, handles );



150
151
152
153
154
155
156
157
158
159
160
161
162

function edit_va_channels_CreateFcn(hObject, eventdata, handles)

function edit_va_fir_taps_CreateFcn(hObject, eventdata, handles)

% --- Executes on selection change in listbox_filters.
function listbox_filters_Callback(hObject, eventdata, handles)
% hObject    handle to listbox_filters (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns listbox_filters contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox_filters
163
index_selected = handles.listbox_filters.Value;
164
165
166
167
168

if isempty( index_selected )
    return
end

169
170
171
filter_list = handles.listbox_filters.String;
filter_selected = filter_list{ index_selected };

172

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
if handles.va.isConnected
    
    num_channels = str2double( handles.edit_va_channels.String );

    mStruct = struct;
    mStruct.listener = handles.va_listener_id;
    mStruct.source = handles.va_source_id;
    mStruct.verbose = true;
    
    newfilter = evalin( 'base', filter_selected );
    
    for n=1:num_channels
        idx_channel_name = [ 'ch' num2str( n ) ];
        mStruct.( idx_channel_name ) = double( newfilter.ch( n ).timeData )';
    end
    
    mRes = handles.va.callModule( handles.module_id, mStruct );
    %disp( mRes )
end
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206

% --- Executes during object creation, after setting all properties.
function listbox_filters_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listbox_filters (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on selection change in listbox_sourcesignals.
207
function listbox_sourcesignals_Callback( hObject, ~, handles )
208
209
210
211
212
213
% hObject    handle to listbox_sourcesignals (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns listbox_sourcesignals contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox_sourcesignals
214
215
216
217
218
219
220
221
index_selected = handles.listbox_sourcesignals.Value;
filename_list = handles.listbox_sourcesignals.String;
filepath_list = handles.listbox_sourcesignals.UserData;
filepath_selected = filepath_list{ index_selected };
filename_selected = filename_list{ index_selected };

if handles.va.isConnected
    
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
    va_signal_id_old = handles.va_signal_id;
    
    if ~isempty( va_signal_id_old ) && strcmp( handles.va.getSoundSourceSignalSource( handles.va_source_id ), va_signal_id_old )
        playstate = handles.va.getAudiofileSignalSourcePlaybackState( va_signal_id_old );
        if strcmpi( playstate, 'playing' )
            handles.va.setAudiofileSignalSourcePlaybackAction( handles.va_signal_id, 'pause' );
        else
            handles.va.setAudiofileSignalSourcePlaybackAction( handles.va_signal_id, 'play' );
        end
    else
        if ~isempty( va_signal_id_old )
            handles.va.setSoundSourceSignalSource( handles.va_source_id, '' );
            handles.va.deleteSignalSource( va_signal_id_old );
        end
        
        handles.va_signal_id = handles.va.createAudiofileSignalSource( filepath_selected, filename_selected );
        handles.va.setSoundSourceSignalSource( handles.va_source_id, handles.va_signal_id );
        handles.va.setAudiofileSignalSourcePlaybackAction( handles.va_signal_id, 'play' );
        is_looping = handles.checkbox_loop.Value;
        handles.va.setAudiofileSignalSourceIsLooping( handles.va_signal_id, is_looping );
242
        
243
244
245
246

        if ~isempty( va_signal_id_old )
            handles.va.deleteSignalSource( va_signal_id_old );
        end
247
248
    end
end
249

250
251
252
% Update handles structure
guidata( hObject, handles );

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

% --- Executes during object creation, after setting all properties.
function listbox_sourcesignals_CreateFcn(hObject, eventdata, handles)
% hObject    handle to listbox_sourcesignals (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: listbox controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton_start_va.
function pushbutton_start_va_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_start_va (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
itaVA_experimental_start_server

function refresh_workspace_vars( hObject, handles )
base_ws_vars = evalin( 'base', 'whos' ); 

stringlist = '';
for i=1:numel( base_ws_vars )
    if( strcmp( base_ws_vars( i ).class, 'itaAudio' ) )
        stringlist = [ stringlist; { base_ws_vars( i ).name } ];
    end
end

handles.listbox_filters.String = stringlist;


function refresh_sourcesignals( hObject, handles )
filelist = dir( pwd );

stringlist = '';
fullfile_stringlist = '';
for i=1:numel( filelist )
    filepath_abs = fullfile( pwd, filelist( i ).name );
294
    [ ~, fbn, ft ] = fileparts( filepath_abs );
295
296
297
298
299
300
301
    if( strcmpi( ft, '.wav' ) )
        stringlist = [ stringlist; { fbn } ];
        fullfile_stringlist = [ fullfile_stringlist; { filepath_abs } ];
    end
end

handles.listbox_sourcesignals.String = stringlist;
302
handles.listbox_sourcesignals.UserData = fullfile_stringlist;
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348


% --- Executes on button press in pushbutton_refresh_workspace_vars.
function pushbutton_refresh_workspace_vars_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_refresh_workspace_vars (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
refresh_workspace_vars( hObject, handles );

% --- Executes on button press in pushbutton_va_setup.
function pushbutton_va_setup_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_va_setup (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
itaVA_setup

function edit_va_channels_Callback(hObject, eventdata, handles)
% hObject    handle to edit_va_channels (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_va_channels as text
%        str2double(get(hObject,'String')) returns contents of edit_va_channels as a double



function edit_va_fir_taps_Callback(hObject, eventdata, handles)
% hObject    handle to edit_va_fir_taps (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_va_fir_taps as text
%        str2double(get(hObject,'String')) returns contents of edit_va_fir_taps as a double



function edit_va_fs_Callback(hObject, eventdata, handles)
% hObject    handle to edit_va_fs (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_va_fs as text
%        str2double(get(hObject,'String')) returns contents of edit_va_fs as a double


% --- Executes during object creation, after setting all properties.
349
function edit_va_fs_CreateFcn( hObject, eventdata, handles )
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
% hObject    handle to edit_va_fs (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton_refresh_input_files.
function pushbutton_refresh_input_files_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_refresh_input_files (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
refresh_sourcesignals( hObject, handles )
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442


% --- Executes on button press in checkbox_loop.
function checkbox_loop_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_loop (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.va.isConnected && ~isempty( handles.va_signal_id )
    handles.va.setAudiofileSignalSourceIsLooping( handles.va_signal_id, get( hObject, 'Value' ) );
end


% --- Executes on button press in pushbutton_stop.
function pushbutton_stop_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_stop (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.va.isConnected && ~isempty( handles.va_signal_id )
    handles.va.setAudiofileSignalSourcePlaybackAction( handles.va_signal_id, 'stop' );
end


% --- Executes on button press in checkbox_global_muted.
function checkbox_global_muted_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_global_muted (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.va.isConnected
    handles.va.setOutputMuted( get( hObject, 'Value' ) );
end


% --- Executes on slider movement.
function slider_volume_Callback(hObject, ~, handles)
% hObject    handle to slider_volume (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if handles.va.isConnected
    handles.va.setOutputGain( get( hObject, 'Value' ) );
end
handles.edit_output_volume.String = num2str( get( hObject, 'Value' ) );


% --- Executes during object creation, after setting all properties.
function slider_volume_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider_volume (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end



function edit_output_volume_Callback(hObject, eventdata, handles)
% hObject    handle to edit_output_volume (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_output_volume as text
%        str2double(get(hObject,'String')) returns contents of edit_output_volume as a double


% --- Executes during object creation, after setting all properties.
function edit_output_volume_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_output_volume (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end