[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의 각 구간의 시간을 계산하는 매트랩 코드입니다. 코드를 하나씩 분석해보겠습니다.

설명

  1. 음원 파일 경로 설정: audioFile = '음원파일경로.wav'; 분석할 음원 파일의 경로와 파일 이름을 '음원파일경로.wav'로 설정합니다.
  2. 음원 파일 읽기: [y, fs] = audioread(audioFile);audioread 함수를 사용하여 지정된 음원 파일(audioFile)을 읽고, 음원 데이터를 y에 저장하고 샘플링 주파수를 fs에 저장합니다.
  3. 소리 신호의 길이: signalLength = length(y);length 함수를 사용하여 음원 데이터의 길이를 계산하고, signalLength에 저장합니다.
  4. 소리 신호의 시간 벡터: t = (0:signalLength-1) / fs;signalLength를 사용하여 시간 벡터 t를 생성합니다. 시간 벡터는 음원 데이터의 샘플링 주파수(fs)에 기반하여 생성되며, 각 샘플의 시간을 나타냅니다.
  5. 파형 그래프 그리기:

     figure;
     plot(t, y);
     xlabel('Time (s)');
     ylabel('Amplitude');
     title('Waveform');
        
    

    figure 함수를 사용하여 새로운 그래프 창을 열고, plot 함수를 사용하여 시간(t)에 따른 음원 데이터(y)의 파형 그래프를 그립니다. xlabel, ylabel, title 함수를 사용하여 각각 x축, y축, 그래프 제목의 레이블을 설정합니다.

  6. Attack, Decay, Sustain, Release를 위한 파라미터 설정:

     attackThreshold = -0.07;
     decayThreshold = 0.1;
     sustainThreshold = 0.05;
     releaseThreshold = 0.037;
        
    

    Attack, Decay, Sustain, Release 구간을 계산하기 위해 사용할 임계값들을 설정합니다.

  7. 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))를 사용하여 최대값을 구합니다.

  1. 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 시간은 해당 구간의 시작 시간과 이전 구간의 끝 시간 간의 차이로 계산합니다.

  2. 결과 출력:

     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 함수를 사용하여 형식화된 출력을 수행합니다.

댓글남기기