[Matlab] Get adsr from audio file
코드
% 음원 파일 경로 설정
audioFile = '음원파일경로.wav';
% 음원 파일 읽기
[y, fs] = audioread(audioFile);
% 소리 신호의 길이
signalLength = length(y);
% 소리 신호의 시간 벡터
t = (0:signalLength-1) / fs;
% 파형 그래프 그리기
figure;
plot(t, y);
xlabel('Time (s)');
ylabel('Amplitude');
title('Waveform');
% Attack, Decay, Sustain, Release를 위한 파라미터 설정
attackThreshold = -0.07; % Attack 구간의 시작을 정의하기 위한 임계값
decayThreshold = 0.1; % Decay 구간의 시작을 정의하기 위한 임계값
sustainThreshold = 0.05;% Sustain 구간의 시작을 정의하기 위한 임계값
releaseThreshold = 0.037;% Release 구간의 시작을 정의하기 위한 임계값
% Attack, Decay, Sustain, Release를 구하기 위한 인덱스 계산
attackIdx = find(abs(y) >= max(abs(y)) * attackThreshold, 1);
decayIdx = find(abs(y) < max(abs(y)) * attackThreshold & abs(y) >= max(abs(y)) * decayThreshold, 1);
sustainIdx = find(abs(y) < max(abs(y)) * decayThreshold & abs(y) >= max(abs(y)) * sustainThreshold, 1);
releaseIdx = find(abs(y) < max(abs(y)) * sustainThreshold & abs(y) >= max(abs(y)) * releaseThreshold, 1);
% Attack, Decay, Sustain, Release의 시간 계산
attackTime = t(attackIdx);
decayTime = t(decayIdx) - attackTime;
sustainTime = t(sustainIdx) - t(decayIdx);
releaseTime = t(releaseIdx) - t(sustainIdx);
% 결과 출력
fprintf('Attack Time: %.3f seconds\n', attackTime);
fprintf('Decay Time: %.3f seconds\n', decayTime);
fprintf('Sustain Time: %.3f seconds\n', sustainTime);
fprintf('Release Time: %.3f seconds\n', releaseTime);
이 코드는 주어진 음원 파일을 읽고, 해당 음원의 파형 그래프를 그리며, Attack, Decay, Sustain, Release의 각 구간의 시간을 계산하는 매트랩 코드입니다. 코드를 하나씩 분석해보겠습니다.
설명
- 음원 파일 경로 설정:
audioFile = '음원파일경로.wav';
분석할 음원 파일의 경로와 파일 이름을'음원파일경로.wav'
로 설정합니다. - 음원 파일 읽기:
[y, fs] = audioread(audioFile);audioread
함수를 사용하여 지정된 음원 파일(audioFile
)을 읽고, 음원 데이터를y
에 저장하고 샘플링 주파수를fs
에 저장합니다. - 소리 신호의 길이:
signalLength = length(y);length
함수를 사용하여 음원 데이터의 길이를 계산하고,signalLength
에 저장합니다. - 소리 신호의 시간 벡터:
t = (0:signalLength-1) / fs;signalLength
를 사용하여 시간 벡터t
를 생성합니다. 시간 벡터는 음원 데이터의 샘플링 주파수(fs
)에 기반하여 생성되며, 각 샘플의 시간을 나타냅니다. -
파형 그래프 그리기:
figure; plot(t, y); xlabel('Time (s)'); ylabel('Amplitude'); title('Waveform');
figure
함수를 사용하여 새로운 그래프 창을 열고,plot
함수를 사용하여 시간(t
)에 따른 음원 데이터(y
)의 파형 그래프를 그립니다.xlabel
,ylabel
,title
함수를 사용하여 각각 x축, y축, 그래프 제목의 레이블을 설정합니다. -
Attack, Decay, Sustain, Release를 위한 파라미터 설정:
attackThreshold = -0.07; decayThreshold = 0.1; sustainThreshold = 0.05; releaseThreshold = 0.037;
Attack, Decay, Sustain, Release 구간을 계산하기 위해 사용할 임계값들을 설정합니다.
-
Attack, Decay, Sustain, Release를 구하기 위한 인덱스 계산:
attackIdx = find(abs(y) >= max(abs(y)) * attackThreshold, 1); decayIdx = find(abs(y) < max(abs(y)) * attackThreshold & abs(y) >= max(abs(y)) * decayThreshold, 1); sustainIdx = find(abs(y) < max(abs(y)) * decayThreshold & abs(y) >= max(abs(y)) * sustainThreshold, 1); releaseIdx = find(abs(y) < max(abs(y)) * sustainThreshold & abs(y) >= max(abs(y)) * releaseThreshold, 1);
find
함수를 사용하여 음원 데이터
(y
)에서 각 구간의 시작 인덱스를 계산합니다. 각 임계값에 해당하는 조건을 만족하는 첫 번째 인덱스를 찾습니다. abs
함수를 사용하여 음원 데이터의 절대값을 취하고, max(abs(y))
를 사용하여 최대값을 구합니다.
-
Attack, Decay, Sustain, Release의 시간 계산:
attackTime = t(attackIdx); decayTime = t(decayIdx) - attackTime; sustainTime = t(sustainIdx) - t(decayIdx); releaseTime = t(releaseIdx) - t(sustainIdx);
각 구간의 시작 인덱스를 사용하여 시간(
t
) 값을 계산합니다. Attack 시간은 Attack 구간의 시작 시간(attackTime
)으로 설정하고, Decay, Sustain, Release 시간은 해당 구간의 시작 시간과 이전 구간의 끝 시간 간의 차이로 계산합니다. -
결과 출력:
fprintf('Attack Time: %.3f seconds\\n', attackTime); fprintf('Decay Time: %.3f seconds\\n', decayTime); fprintf('Sustain Time: %.3f seconds\\n', sustainTime); fprintf('Release Time: %.3f seconds\\n', releaseTime);
계산된 Attack, Decay, Sustain, Release 시간을 소수점 셋째 자리까지 출력합니다.
fprintf
함수를 사용하여 형식화된 출력을 수행합니다.
댓글남기기