Merhaba, Matlab konusunda yeniyim. Matlabda bir script üzerine yazdığım kodlar ile A, B, C ve D klasörlerinin her birinde X, Y, Z, T, N gibi ses dosyaları var. Yazdığım kodlar ile A klasöründen X, B klasöründen T, C klasöründen Z ve D klasöründen Y ses dosyalarını çaldırmak istiyorum. Sorunum şu, A klasöründen X çaldıktan sonra B klasöründen tekrar X çalabiliyor. Ya da A dan X çaldıktan sonra B den T çaldıktan sonra C den tekrar T çalabiliyor. Ben bir kere gelen ses bir daha gelmesin istiyorum. Nasıl yapabilirim?
Merhaba,
Secim havuzu yerine kendi örneğinizi uyarlayabilirsiniz. burada randperm fonksiyonu ile rastgele tekrar etmeyen vektörler oluşturarak bunları seçim havuzunuz ile eşleştirebilirsiniz (mapping).
clc; clear all;
havuz = [1 5 8 36 1 4 8 5 2 3 9] % Secim havuzumuz
sec = randperm(length(havuz),length(havuz)); % Secim rastgele vektoru
for say=1:length(havuz)
secim = havuz(sec(say)) %Secimi gerceklestiriyoruz
end
%% program
for dB = {'minus3dB' } % for each dB value
for Hz = {'4Hz0' '4Hz3' '4Hz6'} % for each Hz value
if should_terminate; break; end % firstly, check if 'Exit' was clicked
path = [base_path '\' dB{1} '\' Hz{1}];
info = dir([path '\*.wav']); % list wav files in the directory
names = {info.name}; % omit everything other than names
count = numel(names); % number of files
%% play files from this dir until the user gives correct answer
while (count > 0)
%% select a file randomly
index = randi(count); % select a random number from 1 to count
name = names{index}; % select file at that index
file = [path '\' name]; % build full path
%% play the file
[y, Fs] = audioread(file); % read file data
player = audioplayer(y, Fs); % prepare a player for it
playblocking(player); % play and wait to the end of the sound
%% decide next action
answer = questdlg(file , title, correct, incorrect, terminate, default);
switch answer
case correct
correct_count = correct_count + 1;
break % continue to next dir
case incorrect
incorrect_count = incorrect_count + 1;
names(index) = []; % remove the processed file
break
case terminate
should_terminate = 1; % request to terminate
break
end % switch
end % while
end % Hz
end % dB
yukarida attigim kodlarda Bir Ses dosyasini tekrar acmamasini istiyorum.. yani bunun gibi 4 tane program var hepsi ayni calisiyor sadece klasorler farkli. o klasorlerden dosyalar secip caliyor. Ama bazilarinda ayni dosya adlari gelmesi mumkun. Ben ayni isimle dosyalar gelmesin istiyorum..
Kurduğunuz algoritma içine şu şekilde bir çözüm olabilir:
%En basa:
kullanilan_dosyalar_listesi=strings(0);
%(Kodlarinizla dongu tamamlaniyor ve diger klasore geciliyor.)
names={info.name};
names(ismember(names,kullanilan_dosyalar_listesi))=[]; %liste'deki elemanlari names vektorunden seciyor ve siliyor
%(Diger kodlariniz...)
[y, Fs] = audioread(file);
kullanilan_dosyalar_listesi(end+1)=name;
Elde eşsiz dosya kalmaması sonucunda hata verecektir tabi.
Ben R2018a'da tanıtılan string veri tipini kullandım, siz 'cell array of character vectors' dedikleri yontemi kullaniyorsunuz. O yontemi pek hatirlamiyorum.
Hata vermemesi için çeşitli yerlerde tür dönüşümü yapmak gerekebilir, şunun gibi:
names=string({info.name});