2012-02-13 4 views
0

미디 파일을 추가해야합니다 : 헤더 (모든 파일에 동일) 및 기타 메타 정보를 남기고 음악/스코어 부분 만 복사하십시오. 필자는 writeBytes를 사용해야한다고 생각했기 때문에 이미 적절한 bytearrays에 MIDI 파일을 가지고 있습니다. 그러나 불행히도 가져 와서 복사해야하는 바이트를 찾을 수 없었습니다. 다음과 같이 표시됩니다.액션 스크립트 3에서 bytearray를 사용하여 미디 파일 추가하기

var newFileBytes:ByteArray=new ByteArray(); 
newFileBytes.writeBytes(firstMIDIBytes); 
newFileBytes.writeBytes(secondMIDIBytes,8); 

부분적으로 만 작동하며 파일을 재생할 수 있습니다. 첫 번째 부분을 완전히 그리고 두 번째 - 일부 메모 만 (다음 플레이어가 응답)

진실을 말하다. byteArrays는 MIDI 파일 구조와 같이 내 강한 측면이 아닙니다. 해결 방법을 제안 할 수 있습니까? 미리 감사드립니다.

+0

정말 미디 파일을 추가 하시겠습니까? 그것은 그들을 병합하는 것과 같은 것이 아닙니다 ... –

+0

IMHO 당신이 맞습니다. 방금 올바른 방식으로 질문을 편집했습니다. – gMirian

답변

0

내 의견에 따르면 이러한 파일을 병합하지 않고 추가하는 것이 좋습니다. 이 경우, 두 번째 파일의 데이터를 첫 번째 파일의 끝으로 단순히 두 드릴 수는 없습니다. MIDI 프로토콜은 대역폭 최적화되어 있으므로 이벤트 스트리밍과 관련하여 여러 가지 가정을합니다. 이러한 동작은 MIDI 데이터를 추가 할 때 특별히주의해야한다는 것을 의미합니다.

MIDI 파일은 실행 상태를 사용할 수 있습니다. 즉, 짝수는 상태 바이트를 생략 할 수 있습니다.이 경우 이벤트는 이전 이벤트의 상태 바이트를 사용해야합니다. 이것은 문제의 원인이 아닐지 모르지만 파일 헤더가 아닌 원시 MIDI 데이터 만 구문 분석한다는 것을 절대 확신합니까? 이 경우 모든 종류의 이상한 데이터가 유효한 MIDI 이벤트로 잘못 해석됩니다.

MIDI 파일의 이벤트는 시퀀스의 이전 이벤트에 대한 상대 오프셋을 사용합니다. 계산 방법은 약간 복잡하지만 MIDI 파일 헤더에 정의 된 몇 가지 속성 (예 : 템포, 초당 펄스 수 등)이 필요합니다. 이러한 이벤트를 제거하고 두 번째 파일의 속성이 다른 경우 이러한 이벤트의 타이밍이 잘못됩니다.

기본적으로 두 개의 MIDI 파일을 추가하는 유일한 방법은 시퀀서를 통해 재생하고 새 스트림에 다시 쓰는 것입니다. 바이트 배열을 추가하는 것은 아마도 많은 신비한 버그의 원인이 될 것입니다.

+0

답변 해 주셔서 감사합니다. "비 뮤지컬"데이터가 모두 같음, 템포, 펄스 등을 의미합니다.미디가 실제로 한 곡의 일부분이라고 상상해보십시오. 따라서 한 파일에서 다른 음악으로 "음악 데이터"만 복사해야합니다. 다른 모든 데이터는 동일합니다. 이 경우 IMHO 내가 복사해야 할 MIDI의 엔트리 포인트를 알고 있다면 (MThd 덩크 크랭크가 끝났음을 알고 실제 MTrk 덩어리가 시작됨에 따라 8 비트 위치 원인이 있음) 끝점 (트랙 데이터가 끝난 곳)에 대해 이 데이터를 붙여 넣으려고하는 MIDI를 어떻게 든이 파일을 병합 할 수 있습니다. XML 파일과 같이 복사/붙여 넣기하는 것처럼 잘못 생각할 수도 있습니다. – gMirian

0

MIDI 파일의 구조하면 바로 다음과 같은 이유를 들어, 더 많은 데이터를 "추가"하는 것을 허용하지 않습니다

  1. 를 각 트랙이 후 모든 메모를 렌더링, 트랙 이벤트의 종료로 종료 그 사건은 무의미하다.
  2. 각 트랙 헤더 청크는 뒤 따르는 데이터의 크기를 정의합니다. 새 데이터를 추가하더라도 모든 판독기는 새 트랙을 찾기 시작하기 전에 [크기] 바이트 만 읽습니다.
  3. MIDI 파일은 파일에 존재하는 트랙의 수를 정의합니다. 따라서 단일 MIDI 트랙의 바이트 배열을 추가하더라도 헤더 데이터의 트랙 수를 업데이트하지 않으면 모든 판독기가 덧붙였다.

데이터를 MIDI 파일에 추가하는 경우 파일 형식의 구조적 무결성을 유지해야합니다. 단순히 데이터를 추가한다고해서이를 수행하는 것은 아닙니다.

+0

답변을 주셔서 감사합니다. 유일한 해결책은 MIDI 파일을 ex : MusicXML에 "첨부"하여 최종 파일을 MIDI로 변환하는 것입니다. – gMirian

+1

질문에 답변 한 경우 Nik 또는 Nik의 답변을 수락하는 것을 고려하십시오. – LeffelMania

관련 문제