2011-03-20 2 views
5

MIDI (또는 WAV) 파일을 <frequency, duration>의 목록으로 변환하여이 사운드의 '이미지'를 재생할 수있는 스크립트/소프트웨어/알고리즘이 있습니까 예를 들어, C#의 System.Console.Beep(frequency, duration) 함수를 통해?MIDI 또는 WAV 파일을 주파수 및 기간 배열

+2

당신은 두 가지의 괴물 같은 질문을했습니다.MIDI와 WAV는 포맷뿐만 아니라 오디오를 저장하는 방식의 전체 컨셉과 완전히 다릅니다. MIDI는 오디오를 일련의 음표로 저장하기 때문에 주파수와 듀레이션 쌍을 추출하는 것은 쉽지 않습니다 (이 작업을 수행하기위한 특정 소프트웨어에 대해서는 잘 모릅니다. 매우 해킹 된 방식으로 그 작업을 수행했습니다.) . WAV는 디지털 샘플이므로 노트 데이터를 가져 오기 위해 주파수 분석 소프트웨어가 필요합니다. 그것은 가능하지만 100 % 정확하지는 않으며 완전히 다른 물고기 주전자가 아닙니다. 그래서 당신은 무엇을 원하니? – mgiuca

+0

적어도 미디 파일을 처리하는 방법 (그러나 WAV에 대한 원리는 궁금합니다. FFT가 충분하지 않은 곳에서 읽습니다.) – anonymous

+0

정말 매력적인 아이디어입니다. 아마도 WAV 파일을 가져 와서 주파수 도메인 (예 : FFT)으로 변환 한 다음 psycoacoustic 모델을 적용하여 사람이들을 수있는 단일 "삐"를 선택합니다. Photoshop의 "인상파"필터와 동등한 오디오 ... –

답변

2

MIDI, WAV 또는 기타 사운드 파일을 원시 오디오 샘플로 변환해야합니다. 그런 다음 샘플의 연속 블록 (일반적으로 각 블록을 50 % 겹침)에 대해 창 함수 (예 : 해닝)를 적용한 다음 FFT를 수행 한 다음 FFT 출력 빈의 크기를 취한 다음 오디오에 대해 보통 20 * log10 이 크기는 dB 값을 얻습니다.

+1

+1, 이것은 WAV에서는 문제가되지 않지만 MIDI에 대해서는이 방법을 사용하지 않아도됩니다. MIDI에 뭔가 있다면, 그것을 합성하고 다시 읽지 마십시오. – Brad

+0

@ 브래드 : 노트 정보 (물론 MIDI 데이터에서 직접 얻을 수있는 정보)를 원 하든지 아니면 완전한 오디오 스펙트럼을 원 하든지에 달려 있습니다. OP의 질문은 그가 원하는 "이미지"의 종류와 관련하여 매우 모호합니다 . –

+0

이 FFT 방법은 음악의 음표 또는 피치 주파수가 아닌 사운드의 근사 스펙트럼 주파수를 제공합니다. 지속 시간은 실제 노트 나 톤 버스트 길이의 정확한 측정 일 수도 있고 그렇지 않을 수도있는 FFT 윈도우의 시간 간격으로 양자화됩니다. – hotpaw2

1

폴 R의 설명은 WAV에 적합합니다.

MIDI의 경우 트랙을 선택하고 MIDI 데이터를 읽어야합니다. 어떤 트랙이 당신에게 달렸는지 어떻게 결정 하나, 실제로는 하나만 선택할 수 있습니다. PC 스피커에서 한 번에 하나의 "노트"만 가져올 수 있기 때문입니다.

C# MIDI 자습서 :. http://www.codeproject.com/KB/audio-video/MIDIToolkit.aspx 당신이에 읽을하면

, 당신의 MIDI 파일을 읽는 방법을 알아야 거기에서, 당신은 주파수와 지속 시간에 그 번역 할 수 있습니다. 지속 시간은 템포와 음표가 지속되는 틱 수에 따라 달라지며 피치는 음 번호와 그에 해당하는 주파수에 따라 달라집니다 (equal temperament). (정말로 미쳐지기를 원한다면 대체 튜닝을 처리 할 수도 있지만, 지금은 걱정할 필요가 없습니다.)

또한 NAudio has some MIDI classes for reading files으로 생각되지만, 완료되지 않았을 수 있습니다.

우리가 미쳤을 때 ... 효과적으로 실을 수 있다면 (이것은 거의 불가능할 것입니다. 그러나 ...), WAV 재생을 위해서는 PWM to drive the PC speaker and emulate PCM audio playback을 사용할 수 있습니다. 나는 이것을하기 위해 사용되는 오래된을 기억하고 있으며, 보통의 클릭과 땡땡 소리를 내 33MHz 노트북에서 잘 작동하는 Windows 3.1 용 드라이버가있었습니다. 관리되는 프레임 워크 (또는 실시간 우선 순위가없는 Windows 내)에서이 방법은 매우 어려울 수 있지만.

2

MIDI의 경우 사용자가 직접 파일을 구문 분석하거나 다음 두 가지 참조 (onetwo)를 권장하거나 MIDI 툴킷을 가져와야합니다. NET에 대해서는 모르겠지만 here is a Google search.

일단 알게되면 매우 쉽습니다. 툴킷을 사용하여 MIDI 파일을 읽으면 트랙 세트가 제공됩니다. 각 트랙은 이벤트의 시퀀스를 포함하며, 각각 이전 이벤트에 상대적인 타임 스탬프가 있습니다. 이벤트는 "메모 켜기", "메모 끄기"또는이 운동에 대해 무시할 수있는 수백 가지 다른 이벤트 중 하나 일 수 있으며 무시할 수 있습니다. "메모 온"및 "메모 오프"이벤트를 찾으십시오. 일반적으로 각 음표는 "음표 켜짐 (note on)"(볼륨이있는 특정 피치 및 속도와 함께)과 "음표 꺼짐"(나중에 동일한 피치 및 속도 0)을 따릅니다.

이 정보로 무장하면 4 분의 1 (시작 시간, 지속 시간, 피치, 속도)의 노트 테이블을 구성 할 수 있습니다. 시작 시간은 "노트 온"이벤트의 시간이고, 지속 시간은 시간 차이입니다 "note on"과 "note off"사이, pitch/velocity는 "note on"의 음높이/속도입니다. this formula을 사용하여 피치를 주파수로 변환 할 수 있습니다.

WAV/MP3/AAC/OGG와 관련하여 이들 모두는 Paul이 자신의 대답에서 제안한 것과 동일한 기술을 사용합니다.

관련 문제