호호...결국은 大친소님의 정책에 의해서 이런것까지 올리는군요..
자료명 : TMF Library 3.1(TMF Format 2.0 Player with Vertical
Retrace Syncronized Timer...길다..^^;) 입니다.
사용환경 : DOS 상, Real or V86 Mode에서 사용가..
최악의 지존파 시스템(286에서 터보를 끈 상태~^^;)
에서도 쌩쌩~ 돌아감...
소스 : 필요하신분은 사가욧! (음...이것까지 공개하면 제 밥벌이
는 어떻게~~)
-----------------------------------------------------------
그러면 간단한 소개를 ? 構黴윱求?...
아니...소개전에 광고하나...^^;
이번에 저와 형이 공동으로 게임을 하나 만들려고하는데요..
제목은 "또 다른..."이 아닌 Renderz이고요...
형제가 전부 프로그래머인 관계로 그래픽 디자이너와
음악 작곡자가 필요합니다..... 관심있으신 분은 메일 주세요~~
TMF Library 3.1은 Vertical Retrace 주기와 동조해서 움직이게
되어 있습니다...즉 쉽게 말하면 Hardware Scroll을 완벽!하게
지원해주는 것입니다...
테스트는 위에 있지만 286에서 터보를 끈 최악(?)의 상태에서도
잘 돌아갑니다...
그리고 ? 摸? 장점은 지금까지 나왔던 음악 라이브러리들이
지원하지 못한 여러가지 기능(볼륨조절, 연속연주, Fade,
중간부터의 연주, Overlap등...)을 포함하고 있습니다..
그러면 많이 많이 받기를 바라면서....파일내에 포함된
README.1ST와 TMFLIB3.DOC를 차례로 올리겠습니다...
P.S : 상업용으로는 사용하실 수 없습니다~...자세한건 README 파일에~
----------------------------------------------------------------
/*--------------------------------------------------------
\ \
\ TMF Library 3.1 \
\ \
\ Play function & Utilities for TMF Format 2.0 \
\ & Vertical Retrace Syncronized Timer \
\ \
\ 1995. 2. 9 \
\ by Ahn Young Hun \
\ (yunjr & DarkMage) \
---------------------------------------------------------*/
1. 이 라이브러리를 사용하기 전에......
서두를 시작하기 전에 우선 저는 몇몇분들에게 실망했다는 말부터 하고
싶습니다. 제가 1년전에 TMF Library 1.0을 하이텔 게제동 자료실에 올리
면서 소스를 약간 수정해서 마치 자신이 만든 것 처럼 행세하지 말 것을
당부했었는데, 역시 우려했던대로 그런 분들이 생겼습니다. 그 때 소스를
공개했던 것은 라이브러리 함수가 부족하니 보고 필요한 함수를 첨가하고
작동 원리를 이해하라는 배려였지 절대로 그런 뜻은 아니였습니다. 그일
때문에 저는 화가나서 버그가 있다는 메일에도 불구하고 버그를 제거한
라이브러리도 올리지 않고, 라이브러리 함수를 대폭 확장한 TMF Library
2.xx 버젼도 올리지 않았습니다. 저는 믿고 그렇게 소스까지 올렸는데 너
무 실망했습니다. 물론 그런분은 극소수이겠지만 다시는 그런 기대를 저
버리는 일은 하지 않으셨으면 합니다. 더불어 다른 관계없는 분들께는 사
과의 말을 올립니다.
원래는 소스까지 올리려고 준비까지 했었습니다. 저번 Library 1 .0에서
설명이 너무없고 코딩이 조잡했었기에 이번에 대폭 수정하고 애드립에 대
해 전혀 모르는 분이 봐도 무리가 없도록 설명을 많이 넣었습니다. (코드
가 30,000Byte 정도에 설명이 40,000Byte 정도) 하지만 저번 Library 1.0
때의 악몽이 되살아나 소스까지 공개하는 것은 결국 포기했습니다. 관계
없는 분들에게는 죄송하게 생각합니다.
그럼 본론으로 넘어가겠습니다.
TMF Library 3.1은 공개 라이브러리입니다. (공개라기 보다는 GNU 정신
에 입각한다고 하는게 좋겠죠. ) 상업적 목적이 아니라면 어떻게 쓰셔도
상 관없습니다. 하지만 이것만은 지켜주십시요.
<1> 절대 다른 자료실에 올려서는 안됩니다. 개인적으로 카피하는 것은
상관 없으나, 하이텔 게제동 자료실 이외의 곳에 이 라이브러리를 업
로드 해서는 안됩니다.
우선 하이텔의 게제동이라는 곳에 감사의 뜻(?)을 전한다는 의미도 있
고 그보다 더 중요한 것은 저의 보잘것 없는 실력을 다른곳에서까지 자랑
할 필요도 없다는 생각때문에서입니다.
<2> 만일 이 라이브러리를 상용이나 쉐어웨어등 상업적 목적에 사용 하
고 싶은 경우에는 우선 저와 상의를 거치고 적당한 타협점(?)을 찾아
서 허가를 받은 후 사용하십시요.
두번째 조항의 경우는 정당한 노력의 댓가라고 생각하니 더 이상 거론
은 않겠습니다.(그렇다고 돈 벌자는 것도 아니니 안심하세요~ ^^;)
<3> 이 프로그램으로 인해서 일어나는 다운현상에 대해서 제작자는 책
임을 지지 않습니다.
그렇다고 다운이 밥먹듯이 일어난다는 말은 아닙니다. (저의 경우 한번
도 일어난적이 없었습니다.) 타이머가 Vertical Retrace 주기를 에뮬레이
트하므로 느린 컴퓨터에서나 약간의 조작 실수로 다운이 일어날 소지가
있습니다. 그러니 핵심부분(하드웨어 스크롤과 음악 연주등)의 코딩에는
약간의 세심한 배려를 하시기 바랍니다.
2. TMF Library HISTORY
TMFLIB v3.1 -> 타이머를 Alter식으로 VR부분과 음악 부분으로 분리해
서 완벽한 Hardware Scroll & 팔레트등을 지원. Dual
Timer를 지원해서 텍스트 모드등에서도 TMF를 쓸 수 있
고, VR 지원이 필요 없는 부분에서는 더 정확하게 음악
을 연주할 수 있다. 최악의 상황(여기서는 286에서 Tur
-bo를 끈상태..^^;)에서도 무리없이 작동하는 안심설계
(?)를 구축!
TMFLIB v3.01 -> 페이드에 관한 버그제거, SetVSTimer 함수 추가로 화면
변경을 용이하게 함
TMFLIB v3.0 -> 타이머를 Vertical Retrace 주기와 동기화 시키고, 음
악 타이머, 시스템 타이머, 페이드 타이머등을 소프트
웨어적으로 처리함
TMFLIB v2.6a -> 주석 처리를 하고, 함수의 판독을 용이하게 함
TMFLIB v2.6 -> 도중 플레이 함수, 연주 후의 자동 연결 함수 첨가
TMFLIB v2 .5 -> After Play Call 함수등과 페이드 함수등을 추가
TMFLIB v2.4 -> 페이드 타이머와 유저 타이머의 체택
TMFLIB v2.1 -> 여러가지 연주 관련 유틸리티 함수들 추가
TMFLIB v2.0 -> TMF Format 2.0 지원
TMFLIB v1.1a -> 발견된 버그제거
TMFLIB v1.0 -> TMF Format 1.0 지원
3. 부탁의 말
이번에 제가 라이브러리를 공개한 이유는 아직도 잠재하고 있을 버그를
제거하기 위해서입니다. 원래는 몇몇분에게만 공개해서 제거하려고 했으
나 뜻대로 되지 않았습니다.(이것 때문에 다시한번 게제동분들께 실망했
어요. ) 그래서 이렇게 올립니다. 호응이 좋을 수록 빨리 버그를 제거한
라이브러리를 볼 수 있겠죠. 그리고 저의 개인적인 명성(?)을 위한 것도
있음을 부인하지는 않겠습니다. 그리고 부탁하고 싶은 것은 이번에는 제
발 위의 <1>, <2> 규칙을 지켜 달라는 것입니다.
4. 라이브러리를 사용하고 나서....
라이브러리를 사용하고 나시면 자신의 컴퓨터 사양을 적고 적용한 프로
그램(순수 음악 출력, 하드웨어 스크롤 프로그램, 팔레트 스크롤 프로그
램...등등)에서 잘 돌아가는지 메일 주세요. 아직 테스트가 완벽한게 아
니라? ? 더 필요합니다.
그 외 필요한 사항은 HiTel ID : DarkMage 로 문의하세요.
/*--------------------------------------------------------
\ \
\ TMF Library 3.1 \
\ \
\ Play function & Utilities for TMF Format 2.0 \
\ & Vertical Retrace SyncronizedTimer \
\ \
\ 1995. 2. 9 \
\ by Ahn Young Hun \
\ (yunjr & DarkMage) \
---------------------------------------------------------*/
1. TMF 음악 포맷이 나오기까지.
제 생각엔 게임 제작 하시는 분들 중 대다수가 음악 파일 포맷으로 IMS
포맷을 쓰고 있으리라고 생각됩니다(AdLib 호환용 음악의 경우에). IMS 파
일은 예전의 ROL 포맷 보다 ? ㈀竪? 작고, 제어도 훨씬쉽기 때문이겠죠.
하지만 저는 IMS 파일 포맷을 읽어 들이는 프로그램을 연구하다가 좀 짜
증나는 부분이 생겼습니다. 바로 AdLib Tool Kit의 ADLIB.C죠. 다 아시겠
지만 AdLib 카드의 Low Level 제어 부분인데, 너무 복잡하게 되어 있더군
요. 음악 연주의 경우 타이머 인터럽트를 제어해야 하니, 될 수 있으면 루
틴들을 줄여서 빨리 인터럽트를 끝내야지 다른 프로그램도 무리 없이 작동
될수 있지 않겠느냐는 생각이 머리 속을 빠르게 스쳐가더군요. 그래서 전
부터 생각해왔던 나만의 새로운 음악 포 맷이 탄생하게 된 것입니다. 더 제
어가 간단하고, 더 크기가 작고, 더 빠른 음악 포맷. 바로 TMF입니다.
2. TMF 음악 포맷이란?
TMF 음악 포맷은 크게 두가지의 장점과 한가지의 단점이 있습니다.
<1> 간단한 제어 & 빠른 속도
- (제어가 간단하니 당연히 속도가 빠르죠.)
TMF 포맷은 다른 라이브러리의 도움 없이 100라인 정도 되는 TI-
MEOUT 함수만으로 음악을 연주할 수 있습니다. 따라서 제어법이 다
른 음악 포맷인 ROL이나 IMS 보다 간단하고, 속도도 개선 되었습니
다.
<2> 파일의 크기
- IMS 포맷을 TMF 포맷으로 바꾸면서 파일의 크기가 줄어 들게 됩
니다. 대략 70~80% 정도로 줄어 들고, 110%를 넘지는 않습니다.
(대부분의 IMS 포맷을 TMF로 바꾸면 줄어들지만 좀 작은 IMS의 경
우 원래의 IMS 보다 약간 파일의 크기가 커집니다.)
<3> 연주 이외의 제어의 어려움
- 이것이 TMF 포맷의 가장 큰 단점이지만, 사실상 전문 연주 프로
그램이 아니고서는 별로 필요없다고 생각되는 기능입니다. TMF 포
맷의 특성상 단순한 연주 이외? ? 목적으로는 쓰기가 힘이 듭니다.
TMF는 거의 모든 연주 데이터를 파괴 시킨 상태로 저장되기 때문에
중간부터 연주를 한다던지...... 이런 것이 힘듭니다. 단순한 연주
만 가능합니다.(하지만 TMF Library 2.6a 이후 버젼에서는 이런 것
들도 가능피構? 하고 있습니다~~)
3. TMF 포맷의 원리
IMS 포맷의 경우 ROL에서 넘어 올때 데이터가 많이 파괴된 상태이지만
그래도 다시 ROL 포맷으로도 바꿀 수 있고, 여러가지 고차원적 제어 (예를
들자면 중간 부터 연주하는 것......)도 가능했었습니? ?. 그러나 IMS 포맷
에서 TMF 포맷으로 넘어 올때는 볼륨, 피치, 노트, 인스트루먼트등의 템포
를 제외한 모든 데이터가 파괴 되어 버립니다. (TMF Format Version 2.0에
서는 볼륨은 파괴되지 않음.) TMF 파일 포맷으로 만들때에는 그냥 AdLib
Card에 직접 쓰는 데이터만을 기록해 두기 때문입니다.
TMF 포맷이 100 라인도 안되는 짧은 함수로 연주 할 수 있는 이유가 바
로 이것 때문입니다. 그런데 안타깝게도 이렇게 카드에 쓰이는 어드래스와
데이터를 기록해서 저장하면 파일의 크기가 IMS의 약 2.5배 정도로 엄청나
게 늘? 爭ぐ? 됩니다. 이 데이터를 각 시간의 단위 마다 Pack 단위로 묶어
서 같은 데이터를 가지는 것은 1~2바이트의 짧은 코드로 변환 시키게 됩니
다. 그러니까 IMS 포맷의 명령으로 NoteOn이라는 명령이 있으면 거기에 따
라서 제어 되는 실제 AdLib Card의 입력도 같은 명령에서는 거의 똑같이
됩니다. 그러니 그런 데이터를 한 Pack 단위로 구성해서 압축을 해주는 방
식이죠.
4. TMF 포맷의 구성
<1> TMF Format Version 1.0 (이 라이브러리에서는 지원하지 않는 포
맷 방식입니다. 하? 嗤? Version 2.0의
기본이 되는 모델이니......)
Offset 0 : char id_byte[25]
- TMF 포맷인가를 판별하는 곳입니다.
25 바이트의 스트링 "TMF File by Ahn Young Hun"이 들어
있습니다.
Offset 25 : unsigned char d_mode
- 멜로디 모드인가 퍼큐시브 모드인가를 알려줍니다.
Offset 26 : unsigned basic_tempo
- 기본적인템포입니다.
Offset 28 : unsigned LCount
- Pack으로 저장된 데이터가 몇개 인지를 말합니다.
Offset 29 : 이후 부터는 Pack 데이터입니다.
먼저 제어에 대한 설명을 잠시 해야겠는데,
TMF 포맷의 음악 출력은 이렇게 되어있습니다.
Offset 0 : length
Offset 1 ~ length : Data
Offset 1 + length : Delay
length 는 뒤에 나올 Data의 양입니다.
Data는 기본적으로 2Byte씩으로 구성되어 있습니다.
첫 바이트는 어드레스, 두번째 바이트는 데이터...
그리고 어드레스에 0xe6이 오면 템포처리를 하게 되? 쨉?
템된 것을 뜻합니다.
그리고, length가 0x30보다 크다면 1Byte의 Pack 데이터이고,
length가 0x20보다 크고 0x30보다 작다면 2Byte의
Pack 데이터가 됩니다.
<2> TMF Format Version 2.0
TMF Format 2.0과 1.0이 다른 점은 세가지입니다.
id_code가 "TMF File Format Version 2"로 바뀌었고, 모든 템포 데이터
가 기존의 템포 데이터에서 298295 / 템포를 한 값으로바뀌었습니다. 이
렇게 하는 이유는 TMF 연주시 복잡한 계산을 최대한 없애려는 의도에서입
니다. ( 이 루틴이 없음으로 인해 예전에 자료실에 올렸던 TMF Library 1.0
이 TC 2.0에서 작동하지 않았었죠.) 그리고, 세번째 다른 것이 볼륨 조절
이 가능하다는 것인데, 이것 때문에 1.0에서의 "간단한 계산"이 조금 복잡
해 지게 되었습니다. 실제 연주 데이터에서 어드레스 부분에 0 ~ 0x15 사
이의 값이 오면 볼륨 조절 해야하는 값이 되고, 이때는 조금 복잡한 연산
을 거쳐서 볼륨 조절을 하게 됩니다.
5. MAKETMF (TMFFormat 2.0 Utility)
MAKETMF는 IMS 포맷을 TMF 포맷으로 바꾸어 주는 프로그램입니다. MAKE-
TMF imsf ile[.ims] [tmffile[.tmf]] [bankfile[.bnk]]로 하면 됩니다. ba-
nkfile을 안 적을 경우는 standard.bnk를, tmffile를 안 적을 경우는 ims-
file과 같은 이름으로 확장자만 달리하여 생성시킵니다. 예를 들어
C:\TMFLIB\MAKETMF TEST
라고 했다면 Test.ims와 Standard.bnk를 읽어서 Test.tmf를 만들게 되
죠.
TMF Format 2.0를 지원하는 것이며, 1.0과의 호환성은 없습니다.
6. TMF Library 3.1
실제TMF 포맷을 자신의 프로그램에서 사용가능하게 해주는 라이브러리
입니다. 원래 TMF 포맷이라는것이 하이 레 벨의 제어가 어렵다고 했는데,
이 라이브러리는 그런 것들을 완전히 해결해 놓았습니다. IMS 파일과 비슷
한 수준의 제어를 가능하게 해줍니다. 라이브러리 사용상의 주의 사항입니
다.
<1> 이 라이브러리는 TMF 파일을 복수개(10개까지) 로드해서 선곡할수
있습니다.하지만 fLoadTMF 함수를 써서 TMF 파일을 메모리로 로드 했
다고 해서 연주가 되는게 아니고, EndTMF 함수로 음악을 껐다고 해서
TMF가 메모리에서 사라지는게 아닙니다. 그러니 한번 로드된 TMF를
메모리에서 제거 시키려면 반드시 Remov eTMF 함수를 써야 되고, 로드
한 TMF를 연주하려면 fPlayTMF를 써야 합니다.
<2> 이 라이브러리는 음악이 로드 되어 있지 않거나, 드라이버가 인스
톨 되어 있지 않으면 작동을 하지 않습니다. 하지만 어떤 에러 메세
지도 발생 시키지 않게 됩니다. 그러니까 에러가 났다고 해서 프로그
램을 멈춰 버리거나 요란한 소리나 메세지가 나오는게 아니고, 정상
적으로 딴 프로그램을 작동 시킬 수 있도록 설계 되어 있습니다. 이
것은 음악이 없어도 프로그램은 진행 되어야 한다는 생각에 바탕을
두고 제작 되어졌습니다.
<3> 이 라이브러리는 LARGE 모델용으로 다른 메모리 모델에서는 사용할
수 없습니다.
<4> 이 라이브러리는 TMF 파일의 크기가 대략 120,000을 넘으면 읽지
못하게 됩니다. 복수개의 세그먼트 지정을 할 수도 있지만, 속도 문제
도 있고 해서 삭제해 버렸습니다. 하지만 아직까지 120,000이 넘는 파
일을 본적이 없으니 그리 문제 되지는 않으리라고 봅니다.
<5> 각 함수는 웬만한 안전 장치(?) 정도는 되어 있습니다. 예를 들면
fLoadTMF하는데 연주되고 있는 코? 躍? 로드하려면 당연히 음악을 끄고
그 코드의 메모리 할당을 해제 해야 되겠죠. 그런 간단한 장치나 준비
들은 함수내에 포함되어 있으니 마음 놓고 함수를 쓰세요~
<6> TimeOut(실제 타이머 연주 부분) 함수에서 음악이 끝났을 때는 우
선 순위 대로 시행하게 됩니다. TMF_FUNCTION이 최우선 순위이고, 함
수 호출이 끝나면 뒤의 TMF_CONTI, TNF_REWIND 등의 변수를 계속 체크
합니다. 다음이 TMF_CONTI이고, TMF_CONTI가 실행되면 Stack에서 pop
명령을 주는 것과 같이 한칸씩 밀려와서 다음 노래가 대기 됩니다. 그
리고 제일 마지막 순위가 TMF_REWIND입니다. 참고로 하세요.
<7> 모든 라이브러리의 설명은 tmflib3.h에 포함되어 있습니다.
7. Vertical Retrace 동기 타이머의 작동 원리
TMF Library 내부의 타이머의 명칭은 VSTimer(Vertical Retrace Syncro-
nized Timer)입니다. 화면의 Vertical Retrace 주기를 이용해서 타이머가
작동하게 됩니다. 이 VSTimer가 인스톨된 뒤Vertical Retrace가 일어나면
-> VR 이 일어나기 조금 전에 타이머 인터럽트가 일어난다.
-> 간단한 카운터 처리를 한 후 VR? ? 일어날때까지 기다린다.
-> 카운터를 갱신한 후 VS() 함수를 호출한다.
-> 음악 연주 카운터가 오버플로우 되었으면 음악을 연주한다.
-> 시스템 타이머 카운터가 오버플로우 되었으면 시스템 타이머 루틴을
호출한다.
-> 인터럽트에서 빠져나온다.
이런식으로 작동하게 됩니다. 그러니 VS 함수는 VR이 일어날 때 마다 호
출되는 함수입니다. 따라서 이 VS 함수에 하드웨어 스크롤이나 팔레트등
의 루틴을 넣으면 됩니다. 하지만 자동으로 호출되는 함수이므로 데이터
를 등록하는 방식으로 프로그래밍하는 것? ? 좋을 것입니다.
UpDate : -> v3.1
: 버젼 3.1에서는 위의 것보다 훨씬 더 복잡한 방법을 사용합니다.
Alter Timer로 한 주기에 두번의 인터럽트가 걸리게 프로그래밍
되었습니다. 그리고, VS도 VS_BEFORE_VR과 VS_AFTER_VR로 나누어
각각 VR이 일어나기 전, VR이 일어난 후에 호출되도록 되어 있습
니다.
- by DarkMage Cyllian Cominus -