boblsturm@0: classdef Sound < handle boblsturm@0: properties boblsturm@0: Filename boblsturm@0: Directory boblsturm@0: Sampling_rate boblsturm@0: Bits_per_sample boblsturm@0: Audioplayer boblsturm@0: Time_length boblsturm@0: Signal boblsturm@0: Features boblsturm@0: end boblsturm@0: boblsturm@0: methods boblsturm@0: function obj = Sound(varargin) boblsturm@0: if nargin == 1 boblsturm@0: [pathstr, name, ext] = fileparts(varargin{1}); boblsturm@0: obj.Filename = strcat(name, ext); boblsturm@0: obj.Directory = pathstr; boblsturm@0: elseif nargin == 2 boblsturm@0: obj.Signal = varargin{1}; boblsturm@0: obj.Sampling_rate = varargin{2}; boblsturm@0: end boblsturm@0: boblsturm@0: obj.init; boblsturm@0: end boblsturm@0: boblsturm@0: function obj = init(obj) boblsturm@0: if ~isempty(obj.Filename) boblsturm@0: [Y, Fs] = audioread([obj.Directory filesep obj.Filename]); boblsturm@0: boblsturm@0: %Convert to Monophonic sound boblsturm@0: if(size(Y, 2) ~= 1) boblsturm@0: Y = (Y(:,1)+Y(:,2))/2; boblsturm@0: end boblsturm@0: boblsturm@0: obj.Signal = Y; boblsturm@0: obj.Sampling_rate = Fs; boblsturm@0: end boblsturm@0: boblsturm@0: obj.Time_length = length(obj.Signal)/obj.Sampling_rate; boblsturm@0: boblsturm@0: obj.Audioplayer= audioplayer(obj.Signal, obj.Sampling_rate); boblsturm@0: obj.Bits_per_sample = obj.Audioplayer.BitsPerSample; boblsturm@0: end boblsturm@0: end boblsturm@0: boblsturm@0: methods boblsturm@0: function control_audio(obj, action) boblsturm@0: switch action boblsturm@0: case 'play' boblsturm@0: play(obj.Audioplayer); boblsturm@0: case 'stop' boblsturm@0: stop(obj.Audioplayer); boblsturm@0: case 'pause' boblsturm@0: obj.Audioplayer.pause; boblsturm@0: case 'resume' boblsturm@0: obj.Audioplayer.resume; boblsturm@0: end boblsturm@0: end boblsturm@0: boblsturm@0: function save_audio(obj) boblsturm@0: handles = guidata(gcf); boblsturm@0: [file,path] = uiputfile({'*.wav'},'Save Sound As'); boblsturm@0: audiowrite([path filesep file], handles.SynthesisObject.Synthesis, handles.Sound_corpus.Sampling_rate); boblsturm@0: end boblsturm@0: boblsturm@0: function plot_spectrogram(obj, varargin) boblsturm@0: if nargin > 1 boblsturm@0: mindB = varargin{1}; boblsturm@0: else boblsturm@0: mindB = 80; boblsturm@0: end boblsturm@0: boblsturm@0: S = obj.Features.STFT.S; boblsturm@0: F = obj.Features.STFT.F; boblsturm@0: T = obj.Features.STFT.T; boblsturm@0: boblsturm@0: dB = 20*log10(abs(S)/max(max(abs(S)))); boblsturm@0: sonodB = max(-mindB, dB); boblsturm@0: imagesc(T,F./1000,sonodB); boblsturm@0: cmap = colormap('jet'); boblsturm@0: cmap(1,:) = 0*ones(1,3); boblsturm@0: colormap((cmap)); boblsturm@0: colorbar boblsturm@0: axis xy; grid on; boblsturm@0: axis([0 T(end) 0.01 10]); boblsturm@0: set(gca,'XTick',[0:0.5:T(end)],'XTickLabel',''); boblsturm@0: set(gca, 'Layer', 'top'); boblsturm@0: ylabel('Frequency (kHz)'); boblsturm@0: grid on; boblsturm@0: set(gca,'FontSize',16); boblsturm@0: end boblsturm@0: boblsturm@0: function plot_chromagram() boblsturm@0: end boblsturm@0: boblsturm@0: function plot_templates(obj) boblsturm@0: W=abs(obj.Features.STFT.S); boblsturm@0: F=abs(obj.Features.STFT.F); boblsturm@0: hold on; grid on; boblsturm@0: [~,I]=max(W); boblsturm@0: [~,Ix] = sort(I,'ascend'); boblsturm@0: for jj=1:size(W,2) boblsturm@0: specdB=W(:,Ix(jj))/max(max(W)); boblsturm@0: handle=plot3(jj*ones(size(W,1),1),F/1000,specdB, ... boblsturm@0: 'Color',power((size(W,2)-jj)/(size(W,2)+1),0.65)*ones(3,1), ... boblsturm@0: 'LineWidth',8*(2+size(W,2)-jj)/(size(W,2))); boblsturm@0: end boblsturm@0: ylabel('Frequency (kHz)'); boblsturm@0: xlabel('Template'); boblsturm@0: zlabel('Magnitude'); boblsturm@0: view(105,26); boblsturm@0: end boblsturm@0: boblsturm@0: function plot_signal(obj) boblsturm@0: plot([1:length(obj.Signal)]/obj.Sampling_rate, obj.Signal, 'Color', [0, 0, 0]); boblsturm@0: end boblsturm@0: boblsturm@0: function obj = computeFeatures(obj, window, analysis) boblsturm@0: obj.Features.window = window; boblsturm@0: boblsturm@0: if(strcmp(analysis, 'STFT')) boblsturm@0: obj.Features.STFT = computeSTFTFeat(obj.Signal, obj.Sampling_rate, obj.Features.window); boblsturm@0: elseif(strcmp(analysis, 'CQT')) boblsturm@0: boblsturm@0: elseif(strcmp(analysis, 'Chroma')) boblsturm@0: boblsturm@0: end boblsturm@0: end boblsturm@0: boblsturm@0: function obj = concat(obj, sound) boblsturm@0: obj.Signal = [ obj.Signal; sound.Signal ]; boblsturm@0: boblsturm@0: obj.Time_length = length(obj.Signal)/obj.Sampling_rate; boblsturm@0: boblsturm@0: obj.Audioplayer= audioplayer(obj.Signal, obj.Sampling_rate); boblsturm@0: obj.Bits_per_sample = obj.Audioplayer.BitsPerSample; boblsturm@0: end boblsturm@0: end boblsturm@0: end