GEMS sound driver research
| |
Smoke | Дата: Вторник, 11.10.2011, 21:50 | Сообщение # 1 |
Get Serious! Сообщений: 551 Статус: Offline
| So in the spirit of the new year, I decided to give you all what I know about GEMS's sequence format. I don't know everything yet, but I will soon enough
First, read this post from a while ago. That post describes GEMS's general layout; this post describes the sequence format. From my notes:
CODE The demonstration code for the Ship game included in the GEMS devkit shows that the song data format is very simple:
[pointers to songs] song 0 [number of channels] [pointers to channels] song 1 [number of channels] [pointers to channels] ... song 0 channel 0 [sequencer data] song 0 channel 1 [sequencer data] ...
However, we don't know the format of the sequencer data, which is stored as raw data in the code. Fortunately, the GEMS devkit also contains the source code to the Z80 driver, as comments in the file GEMS\Z80.ASM. I went through the sound driver and documented the sequencer data format. Here is what I found by observing both the driver and how Sonic Spinball's sequencer data works.
The driver is basically an infinite loop of the form
if a note is to be played play note for a given amount of time, known as "duration" release note else perform the command wait a specific amount of time, known as "delay" (except for some commands)
Each channel has their own delay and duration value, so you can set the duration and delay for a group of notes first, then issue the notes sequentially. This implies that unlike most sound drivers (and unlike most people's expectation of how music would be stored), GEMS expects the duration BEFORE the note.
Sequencer commands always start with a byte denoting what the command does.
| 7 6 | 5 4 3 2 1 0 | |-------|-------------| |Command|Datum |
Command 00 N - Note. 01 Bit 5 off Note Bit 5 on Other command 10 R - Duration. Consecutive Rs are combined BEFORE processing. 11 D - Delay. Consecutive Ds are combined BEFORE processing. Datum If N, the whole byte is the note value: FM/Tone 0 is C0, 1 is C#0/Db0, ..., 95 is B7 Noise (?) DAC For backwards compatibility with something (the comment is cut off for some reason), take note: 48 (C4) is sample 0, 49 (C#4) is 1, ..., 95 (B7) is 47, 0 (C0) is 48, 1 (C#0) is 49, ..., 47 (B4) is 95 (96?) (?) If R, is the length of the duration in subbeats. If D, is the length of the delay in subbeats.
0-$5F: Notes $60-$72: Commands $80-BF: Duration Values $C0-FF: Delay Values
In the case that the Command bits are 01, a new table of commands is used in which the entire byte is the command:
Byte Command $60 End of sequence. Used for sfx and jingles to end the song. $61 Change patch - next byte in the sequence is the new patch number. $62 (?) (byte parameter) $63 No operation $64 Start loop. Next byte in the sequence is the number of iterations, or 127 for an infinte loop. Loops are stored in a stack. $65 End loop. This completes the loop at the top of the stack. $66 Toggle retrigger mode. (?) $67Toggle sustain mode. (?) $68 Set tempo for entire song. Next byte is tempo - 40 in beats per minute. (?) $69 Mute, though how it works is weird and involves MIDI channels (?) $6A Set channel priority. Priority goes from 0 (least) to 127 (most). $6B Start another song; next byte is the song number. Unsure if this merely saves the current song on the stack (todo) $6C Pitch bend. Next byte is the low byte of bend data (?), followed by high byte. $6D Set song to use SFX timebase. $6E Set DAC sample playback rate to value of the next byte (?). $6F Jump to position indicicated in next two bytes (lower byte first). $70 Store a byte into one of 32 byte-sized "mailboxes." Next byte is the mailbox number, followed by the value. $71 Conditional branch (if statement). The bytes thereafter take the form [mailbox #][condition][mailbox #][location]. Condition Test 1 mailbox != mailbox 2 mailbox > mailbox 3 mailbox >= mailbox 4 mailbox < mailbox 5 mailbox <= mailbox all other mailbox == mailbox If the expression yields true, the address given is jumped to; if false, do nothing. BEWARE: the address to jump to is a byte that is always offset from 0 — the if statement can only jump to addresses 0 through 255! $72 Even more functionality! Next byte is the command, followed by value Command Action 0 Stop sequence. (?) 1 Pause sequence. (?) 2 Resume all. Value ignred (but must still be specified). 3 Pause music. (?) Value ignred (but must still be specified). 4 Set master volume to value. Volume goes from 0 (loudest) to 127 (softest), just like the YM2612 FM operators's TL field. 5 Set channel volume to value. Volume goes from 0 (loudest) to 127 (softest), just like the YM2612 FM operators's TL field. all other Do nothing.
All other command values are ignored (" *** THIS COULD USE SOME FANCY ERROR DETECTION RIGHT ABOUT NOW"). After a command is executed (except $60, $64, $65, $6F, and the R and D commands), delays are processed.
There is one important thing to note: sequences are not assigned output audio channels. The current output channel of the sequence depends on the current voice, so a sequence can change output channels on the fly. Except for voices that take advantage of FM channel 3 multifrequency mode, FM channels are specified at runtime by an allocator method (think malloc()), so there is no way of knowing what FM channel a sequence would output to until it's time to actually play the note! This is a problem, and I've already seen it explode into a mess of hackery when I wrote my GEMS to SMPS converter. I think I'm going to have to start it over again.
Ну что, мысли? Напишем конвертер в смпс и обратно, а то они с 10-го года написать не могут?
|
|
| |
Smoke | Дата: Среда, 12.10.2011, 19:44 | Сообщение # 2 |
Get Serious! Сообщений: 551 Статус: Offline
| Еще инфа с соникретро Quote (Andlabs) It looks like a GEMS to SMPS converter program would need to recognize that sequences (the music data), DAC samples, and patches (the FM and PSG voices) would be in separate files, and that the sequences file would contain all the songs. That is,
music\Sequences.bin music\Patches.bin music\DAC.bin
So a program would wind up having to ask for at least the Sequences and Patches file as well as the ID of the sequence they wish to convert. On the flipside, there would have to be a small tool to extract DAC samples; integration into the game is, well, just like whatever other samples of people saying FUCK THAT SHIT you can get into the ROM.
Here is the format of the Sequences file:
Offsets of definitions of all sequences [two bytes each] Definitions of all sequence [1 byte for number of channels n; 2n bytes for offsets of each channel] Channel data
Here's Ship's, as an example:
CODE * * Sequence Offset Table *
dc.b $04,$00; Offset to sequence #0: 4 dc.b $11,$00; Offset to sequence #1: 17 * * Sequence Descriptors *
* Sequence 0 "BMX, 32 bar loop" dc.b $06; channel count = 6 dc.b $14,$00; offset to channel 0 = 20 dc.b $76,$02; offset to channel 1 = 630 dc.b $C1,$04; offset to channel 2 = 1217 dc.b $28,$06; offset to channel 3 = 1576 dc.b $BE,$08; offset to channel 4 = 2238 dc.b $E0,$09; offset to channel 5 = 2528 * Sequence 1 "Ship fire" dc.b $01; channel count = 1 dc.b $DE,$0A; offset to channel 0 = 2782 * * Sequence Channel Data *
* Sequence 0, Channel 0: dc.b $C0,$68,$4A,$61,$00,$64,$7F,$FC dc.b $63,$86,$C6,$1F,$21,$24,$84,$C4 ... dc.b $30,$83,$30,$84,$30,$83,$30,$C0 dc.b $65,$60 * Sequence 0, Channel 1: dc.b $C0,$61,$01,$64,$7F,$C0,$63,$84 dc.b $C6,$37,$83,$37,$84,$37,$83,$37 ...
No pointers to worry about! The only problem is that you have to adjust the header offsets if you change the data. Perhaps labels may help? I don't know why Technopop didn't do this.
Now we just need to figure out what the data format is.
The other data types are similar. While Mikel only pointed to three types of banks, Ship's source indicates that there is also a modulation bank (MBANK); Ship does not use it; the MBANK.ASM file has no data (only header comments). Does Sonic Spinball use it?
And seriously, take a look at Ship's source. It's in the GEMS archive, in directory SHIP\MUSIC.
|
|
| |
Smoke | Дата: Среда, 12.10.2011, 21:05 | Сообщение # 3 |
Get Serious! Сообщений: 551 Статус: Offline
| Beyond Zero Tolerance Code ROM:0006410C mus_point: ; DATA XREF: mus_pointo ROM:0006410C ; sub_6466A+2t ROM:0006410C move.l #mus_point,-(sp) ; Здесь должны быть указатели вавок ROM:00064112 move.l #sequences,-(sp) ; нотные последовательности ROM:00064118 move.l #word_60CB0,-(sp) ROM:0006411E move.l #patches,-(sp) ; голоса ROM:00064124 bsr.w sub_642FA ROM:00064128 adda.w #$10,sp ROM:0006412C rts ROM:0006412C ; End of function mus_point
|
|
| |
r57shell | Дата: Четверг, 13.10.2011, 03:40 | Сообщение # 4 |
Сообщений: 632 Статус: Offline
| Quote (Smoke) Ну что, мысли? Напишем конвертер в смпс и обратно, а то они с 10-го года написать не могут? начинай
Мальчик, девочка... какая в жопу разница..
|
|
| |
Nemesis_c | Дата: Понедельник, 17.10.2011, 06:21 | Сообщение # 5 |
Сообщений: 1148 Статус: Offline
| главное нАчать...
|
|
| |
Smoke | Дата: Вторник, 18.10.2011, 20:45 | Сообщение # 6 |
Get Serious! Сообщений: 551 Статус: Offline
| Почти начал. Разбираю формат голосов гемса. Code * Patch 0 "NEGFEEDB.FM": FM dc.b 0 dc.b $0C,$00,$06,$F4,$03,$10,$1F,$00 dc.b $00,$25,$03,$08,$1F,$1F,$0C,$18 dc.b $03,$11,$1F,$11,$10,$28,$01,$04 dc.b $1D,$10,$14,$1B,$1F,$FF,$1F,$FF dc.b $1F,$FF,$1F,$FF,$0F,$00 $00 -- $0C -- $00 -- $06 -- Algorithm (первые 3 бита)/Feedback(следующие 3 бита) $F4 -- $03 -- Operator 1 Detune (следующие 3 бита)/Operator 1 Mult (первые 4 бита) $10 -- Operator 1 TLevel (все 8 бит) $1F -- Operator 1 KScale (последние 3 бита)/Operator 1 Attack (первые 5 бит) $00 -- Operator 1 Decay (первые 5 бит)/AM ON/OFF (последний 8 бит) $00 -- Operator 1 Sustain (первые 5 бит) $25 -- Operator 1 SLevel (последние 4 бита)/Operator 1 Release (первые 4 бита) $03 -- Operator 2 Detune (следующие 3 бита)/Operator 2 Mult (первые 4 бита) $08 -- Operator 2 TLevel (все 8 бит) $1F -- Operator 2 KScale (следующие 3 бита)/Operator 2 Attack (первые 5 бит) $1F -- Operator 2 Decay (первые 5 бит)/AM ON/OFF (последний 8 бит) $0C -- Operator 2 Sustain (первые 5 бит) $18 -- Operator 2 SLevel (последние 4 бита)/Operator 2 Release (первые 4 бита) $03 -- Operator 3 Detune (следующие 3 бита)/Operator 3 Mult (первые 4 бита) $11 -- Operator 3 TLevel (все 8 бит) $1F -- Operator 3 KScale (последние 3 бита)/Operator 3 Attack (первые 5 бит) $11 -- Operator 3 Decay (первые 5 бит)/AM ON/OFF (последний 8 бит) $10 -- Operator 3 Sustain (первые 5 бит) $28 -- Operator 3 SLevel (последние 4 бита)/Operator 3 Release (первые 4 бита) $01 -- Operator 4 Detune (следующие 3 бита)/Operator 4 Mult (первые 4 бита) $04 -- Operator 4 TLevel (все 8 бит) $1D -- Operator 4 KScale (последние 3 бита)/Operator 4 Attack (первые 5 бит) $10 -- Operator 4 Decay (первые 5 бит)/AM ON/OFF (последний 8 бит) $14 -- Operator 4 Sustain (первые 5 бит) $1B -- Operator 4 SLevel (последние 4 бита)/Operator 4 Release (первые 4 бита) $1FFF -- Operator 1 Ch3 Frequency $1FFF -- Operator 2 Ch3 Frequency $1FFF -- Operator 3 Ch3 Frequency $1FFF -- Operator 4 Ch3 Frequency
|
|
| |
r57shell | Дата: Среда, 19.10.2011, 19:13 | Сообщение # 7 |
Сообщений: 632 Статус: Offline
| Когда сделаешь - сообщи мне, и я расскажу как работает Sound Images (который в RRR), чтобы тоже конвертать ^^. у меня создаётся очучение что они похожи.
Мальчик, девочка... какая в жопу разница..
|
|
| |
Smoke | Дата: Среда, 19.10.2011, 19:37 | Сообщение # 8 |
Get Serious! Сообщений: 551 Статус: Offline
| Ох, это не скоро будет, тут есть одна заковырка, портящая всю малину Quote 1.2) Dynamic Voice Allocation -------------------------------
The GEMS system does not actually contain 16 synthesizers, but rather 10 hardware voices, each capable of generating one note at a time. In addition, each hardware voice only supports certain kinds of patches. GEMS uses dynamic voice allocation to automatically route each note from each MIDI channel to an appropriate hardware voice. To do this, GEMS checks which patch was most recently selected on the note's channel, and then checks which hardware voices support that type of patch. A free voice of that type is then loaded with the particular parameters of the patch and triggered at the note's pitch. The composer is therefore relieved of the task of assigning specific notes to specific hardware channels, and need only be concerned that at any time the Genesis's total voice capability for each type of patch is not exceeded.
Typically, game music should be composed to not exceed the hardware limitations of the Genesis. With the limited number of voices, however, the music will often keep all of those voices busy. The limits therefore are likely to be exceeded when sound effects are triggered from the game, on top of the music. A priority setting feature is provided on a channel by channel basis (much like a program change) to indicate to the voice allocation software which music voices are least important when looking for voices to steal for sound effects. Короче гемс юзает свои 16 каналов звука, а у СМД как мы знаем всего каналов максимум может быть 10 (6 FM + 1 DAC + 3 PSG). Поэтому нотные последовательности каналов гемса помещаются в хардварные каналы в зависимости от типа используемого голоса (FM/DAC/PSG) и в зависимости от того свободен в данное время канал или нет. Меняет он их на лету короче. С этим могут быть проблемы. Надо как-то будет высчитывать при конвертации.
А голоса конвертнуть проще простого, скоро будет готово.
|
|
| |
Smoke | Дата: Суббота, 22.10.2011, 01:03 | Сообщение # 9 |
Get Serious! Сообщений: 551 Статус: Offline
| Голоса конвертируются теперь один-в-один. Приступил к кодингу проги для конвертации мелодий. Сконвертил тестовый канал -- работает как надо. В общем пока сделаю, чтобы мелодии, содержащие меньше 6 каналов конвертировались нормально, а потом уже сложнее. Надо будет реализовать это динамическое распределение нот по каналам FM/PSG/DAC. Уже есть кое-какие мысли. И мелодия скорей всего не будет использовать прыжки ($F6 flag), т.к не знаю как привязать время звучания с кол-вом байт. Флаги цикла будут скорей всего, ну и мелодия будет побольше весить, т.к. конвертироваться будет без оптимизаци пока (типа если duration или delay не изменялись в процессе, второй раз их можно не писать).
|
|
| |
Smoke | Дата: Суббота, 22.10.2011, 22:36 | Сообщение # 10 |
Get Serious! Сообщений: 551 Статус: Offline
| Все, добился похожего звучания мелодии. Теперь надо обучить прогу вставлять нужные голоса из банка по номеру и переписывать поинтеры под SMPS z80. Ну и я долго сидел не понимал какая величина у единицы времени в гемсе и когда выполняются эти таинственные дэлеи. Оказывается почти после каждой команды и после каждой ноты (!). Это пока не реализовал и поэтому один канал обгоняет другой. В общем осталось немного и можно будет конвертить гемсовые мелодии, правда с потерей каналов (если их больше 6). Потом уже буду пытаться реализовать динамическое распределение нот по каналам.
|
|
| |
Nemesis_c | Дата: Воскресенье, 23.10.2011, 05:45 | Сообщение # 11 |
Сообщений: 1148 Статус: Offline
| куда я попал?.. одни маньяки кругом...
|
|
| | |
r57shell | Дата: Воскресенье, 23.10.2011, 23:38 | Сообщение # 13 |
Сообщений: 632 Статус: Offline
| хм, глючно всёравно. Это... может ещё замутить драйвер MP3?) короче эт громко сказано. Я с звуком в сеге не разбирался, вопрос собственно какой: какое можно самое высокое качество выдавать, например если весь ром - один трек. (с учётом того, что надо уметь во время этого воспроизводить звуки, вопли, пинки, взрывы).
Мальчик, девочка... какая в жопу разница..
|
|
| |
Nemesis_c | Дата: Понедельник, 24.10.2011, 02:42 | Сообщение # 14 |
Сообщений: 1148 Статус: Offline
|
Quote (Nemesis) у меня есть. сегодня ближе к вечеру скину Добавлено позже: оказалось, что нету. видимо удалил вместе с досбоксом.
таки нашел.. в аттаче
|
|
| |
Smoke | Дата: Понедельник, 24.10.2011, 02:54 | Сообщение # 15 |
Get Serious! Сообщений: 551 Статус: Offline
| Nemesis_c, спасибо, но хидден пэлас уже заработал и я уже оттуда стянул недавно Quote (r57shell) хм, глючно всёравно. Это... может ещё замутить драйвер MP3?) короче эт громко сказано. Я с звуком в сеге не разбирался, вопрос собственно какой: какое можно самое высокое качество выдавать, например если весь ром - один трек. (с учётом того, что надо уметь во время этого воспроизводить звуки, вопли, пинки, взрывы). Да там я цикл не задал, забыл сделать. Звуки, вопли, пинки, взрывы это тоже PCM-ки будут, а DAC канал всего один, так что не прокатит. А так максимум вроде можно 22кГц. Хотя по идее можно хоть 44кГц задать, но наверно з80 уже не потянет
|
|
| |
Nemesis_c | Дата: Понедельник, 24.10.2011, 03:45 | Сообщение # 16 |
Сообщений: 1148 Статус: Offline
| а я здесь нашел среди исходников.. http://gilgalad.arc-nova.org/
|
|
| |
r57shell | Дата: Понедельник, 24.10.2011, 14:49 | Сообщение # 17 |
Сообщений: 632 Статус: Offline
| Quote (Smoke) Звуки, вопли, пинки, взрывы это тоже PCM-ки будут, а DAC канал всего один а что, вопли пинки нельзя два сразу?
вообще мне охото музыко + воплипинки, где музыко максимум качества, даже если прийдётся извращатся, типа менять каждый раз сэмпл, или ещё какой-нибудь изврат.
Мальчик, девочка... какая в жопу разница..
|
|
| |
Smoke | Дата: Понедельник, 24.10.2011, 23:13 | Сообщение # 18 |
Get Serious! Сообщений: 551 Статус: Offline
| Тогда придется останавливать воспроизведение PCM музыки и воспроизводить PCM звуки (пинки вопли). И то и то одновременно проигрывать не получиться.
Dune 2: The Battle for Arrakis Code mus_point: ROM:0002DCE8 lea unk_2DCE4,a0 ROM:0002DCEC move.l a0,-(sp) ROM:0002DCEE move.l a0,-(sp) ROM:0002DCF0 move.l a0,-(sp) ROM:0002DCF2 move.l a0,-(sp) ROM:0002DCF4 jsr sub_1624 ROM:0002DCF8 lea $10(sp),sp ROM:0002DCFC pea (DAC).l ROM:0002DD02 pea (sequences).l ROM:0002DD08 pea (modulation).l ROM:0002DD0E pea (patches).l ROM:0002DD14 jsr sub_1624 ROM:0002DD18 lea $10(sp),sp ROM:0002DD1C rts
|
|
| |
r57shell | Дата: Вторник, 25.10.2011, 00:08 | Сообщение # 19 |
Сообщений: 632 Статус: Offline
| Блин хватит клинить, я не говорил что надо музыку PCM, я говорил ... как-нибудь, даже если прийдётся извращаться.
Мальчик, девочка... какая в жопу разница..
|
|
| |
Smoke | Дата: Вторник, 25.10.2011, 01:16 | Сообщение # 20 |
Get Serious! Сообщений: 551 Статус: Offline
| Quote (r57shell) хм, глючно всёравно. Это... может ещё замутить драйвер MP3?) короче эт громко сказано. Я с звуком в сеге не разбирался, вопрос собственно какой: какое можно самое высокое качество выдавать, например если весь ром - один трек. (с учётом того, что надо уметь во время этого воспроизводить звуки, вопли, пинки, взрывы). Так какую музыку? Просто мелодию через ямаху и PSG чтоли, плюс звуки? А то в начале про мп3 писал, и я подумал, что ты про оцифровки. Говори конкретно, а то я нифига не въезжаю
|
|
| |
r57shell | Дата: Вторник, 25.10.2011, 03:33 | Сообщение # 21 |
Сообщений: 632 Статус: Offline
| конкретно... представим музыку - функцией от времени, на определённом промежутке точнее.... f(t) t - время, которое от 0 до len (len - длина музыки) теперь введём метрику.... (расстояние от одной музыки до другой, типо насколько ближе одна к другой) например такую |f-g| = max |f(t)-g(t)| , где g(t) - другая музыка. максимум по t от 0 до len. g - это будет то, что играет наш драйвер. теперь, вот собсно надеюсь понятно, что надо этот |f-g| свести к минимуму. чем меньше |f-g| тем точнее к "оригиналу" (который f) мы получим g. дак вот мой вопрос состоит в том, что мне ПОФИГУ как будет это организованно - т.к. я не разбирался со звуком в сеге. но мне охото уметь достигать реализуемого минимума |f-g| для конкретного g, который выбран до минимизации. то есть, чтобы я мог выбрать любой музон f, затем каким-то шаманством получить такой g, что |f-g| - минимально то есть, если есть даже g1, такой что |f-g1| < |f-g| то g1 - не реализовать на сеге. вот так вот. есть вопросы? в некоторую конкретику просто не могу уйти, т.к. выбор метода - это уже какое-то из решений, а я задал именно такой общий вопрос.
Мальчик, девочка... какая в жопу разница..
|
|
| |
Smoke | Дата: Вторник, 25.10.2011, 05:06 | Сообщение # 22 |
Get Serious! Сообщений: 551 Статус: Offline
| Понятно. Ты хочешь знать на сколько близка будет музыка на сеге к оригиналу. Как я и говорил, вавки до 22кГц примерно (цифры неточные), с шаманством может быть до 44кГц (хотя сомневаюсь) и конечно 8 бит. Для "трекерной" музыки 10 звуковых каналов, причем в одной мелодии могут задействоваться до 127 инструментов (голосов). Если оригинал примерно в этих пределах лежит, то можно получить достаточно похожую музыку к оригиналу.
|
|
| |
r57shell | Дата: Вторник, 25.10.2011, 15:39 | Сообщение # 23 |
Сообщений: 632 Статус: Offline
| нет, ты меня снова не понял. ты говоришь о стандартных путях... PCM - с которым будет без звуков - не подойдёт, Т.к. я сказал надо с пинками и взрывами. А про трекерную музыку ты сказал нечто похожее на: "как MIDI подгонишь, так может и получиться" Я не ищю лёгких путей. Нужно рассматривать все варианты, даже например такой: сэмплы как известно тоже чем-то загружаются... Кто мешает во время игры одного семпла менять другой семпл? (эти твои 127 голосов которые) с целью потом проиграть этот изменённый. к тому же, ямаха как синтезатор, должна уметь менять высоту семпла итд итп второй вариант: подобрать такой набор 127 сэмплов, которым потом приближать музон.... то есть, в каждый промежуток времени, выбирать наиподходящий сэмпл, с конкретной высотой, чтобы сыграть маленький отрезок. тогда этот сэмпл нельзя назвать инструментом, т.к. он не будет звучать как инструмент, но можно чего-нибудь достичь.
как известно за счёт преобразования фурье или рядов фурье можно любую функцию (в данном случае - музыку) очень близко представить в виде композиции гармоник. (синус - гармоника) например MP3 использует похожий метод - приближает синусами, и их коэффициенты хранит.
третий вариант - всю трекерную музыку играть в наивысоком темпе, с минимальными семплами... а высоту звука задавать высотой ноты. а сглаживание и прочее - подобрать соответствующие сэмплы.
вариантов дофига, нужно подумать... очевидно, что многие могут отброситься из-за того, что их не реализовать. например первый вариант, может отброситься если нет возможности подменять БЫСТРО сэмпл на другой, во время игры ямахой какого-то. эт я говорил только о ямахе почти... я знаю что она есть, не знаю как работает ))), остальное вообще т.к. не смотрел - то и не говорю ничего.
Мальчик, девочка... какая в жопу разница..
|
|
| |
Smoke | Дата: Вторник, 01.11.2011, 02:41 | Сообщение # 24 |
Get Serious! Сообщений: 551 Статус: Offline
| Да, но допустим есть такая ситуация, что имеем миди с 16 каналами. Причем в каждую единицу времени в каждом канале проигрывается какая-либо нота. Как мы раскидаем мидишные каналы по каналам сеги, чтобы все проигрывалось идентично. Ведь взяв любую точку времени, мы видим, что одновременно проигрывается 16 нот, причем разных инструментов. Это уже имхо невозможно сделать. А твои предложенные методы там используются. Только в третьем для сглаживания и прочего используется частотная модуляция.
Добавлено позже:
Адская посдстава. Динамическое распределение по каналам сделал, самое сложное было. И тут запарка: в гемсе максимальная продолжительность делея или ноты может быть больше $7F (в смпс максимум $7F). С делеем нормально, просто пишем в смпс $807F сколько надо. Первй байт это пустая нота. А с обычной нотой это не прокатывает. Допустим есть нота $A1, которая играет $11F единиц времени. Т.е уместить ее продолжительность в пол-байта уж точно не получиться. А если записать $A17F, $A17F, $A17F, $A122, то просто нота $A последовательно сыграет 3 раза медленно и 4 раз быстрей. А надо всего один раз, но долго (равный этим 4-м проигрываниям). Вот дерьмо, а!
Есть конечно такая вещь, как dividing timing, это величина всей мелодии (не одного отдельного канала), на которую умножается продолжительность звучания ноты. Но если она будет большая, тоже не пойдет, т.к. долгие ноты будут проигрыаться нужное время, а быстрые нет. А отдельно для канала dividing timing задать нельзя. Ад короче. Хоть сам движок модить, да я z80 не очень хорошо знаю
Добавлено позже:
Аааа, все-таки СМПС ис вери осом драйвер! Есть такой флаг $E7 (Prevents next note from attacking), который как я всегда думал стопарит следующую ноту. Оказывается, он продливает звучание предыдущей. Например, если нужно проиграть ноту $A1 продолжительностью $11F, то надо записать $A17F, $E77F, $E17F, $E122. И нота будет звучать столько сколько надо. В общем йа счастлив. Осталось только разобраться с еще одним геморроем -- циклы.
Добавлено позже:
Vectorman Code ROM:001FF0DC mus_point: ; CODE XREF: ROM:00009E8Ap ROM:001FF0DC move.l #DAC,-(sp) ROM:001FF0E2 move.l #Sequences,-(sp) ROM:001FF0E8 move.l #Modulation,-(sp) ROM:001FF0EE move.l #Patches,-(sp) ROM:001FF0F4 jsr sub_1FEE24 ROM:001FF0F8 adda.w #$10,sp ROM:001FF0FC jsr sub_1FEF46 ROM:001FF100 jsr sub_1FF0C2 ROM:001FF104 rts ROM:001FF104 ; End of function mus_point
Добавлено позже:
Вот чего получилось наделать соу фар. Конвертированный музон: $D, $F и $10 Циклы пока не поддерживаются, также как и модуляция. Звучит не совсем идентично, но очень похоже. Ваши мысли?
|
|
| | |
Smoke | Дата: Четверг, 03.11.2011, 05:22 | Сообщение # 26 |
Get Serious! Сообщений: 551 Статус: Offline
| Скорость немного не та и громкость некоторых голосов скачет. Вечно у меня с ней проблемы. дело в том, что в гемсе единица громкости больше, чем единица громкости в смпс и я не могу задать громкость такую же как в оригинале (макс значение $7F и при нем все равно не так тихо как надо). Придется уменьшать громкость самого инструмента, причем выборочно (отдам задачу юзеру). Сегодня тестил робокопа против терминатора и червя джима. В джиме используется DAC, поэтому добавил поддержку, теперь ударные будут в мелодии. А в робокопе даже PSG используется в некоторых мелодиях. Завтра и это добавлю. В общем дело близиться к завершению наверно. Допилю траблу с громкостью и все наверно. Еще ближе к оригиналу уже хз как сделать. Но так вроде тоже нормально, если учесть то, что раньше и этого нельзя было сделать Robocop vs The Terminator Code ROM:00180B5C mus_point: ; CODE XREF: ROM:0017B4EAp ROM:00180B5C pea (DAC).l ROM:00180B62 pea (Sequences).l ROM:00180B68 pea (Modulation).l ROM:00180B6E pea (Patches).l ROM:00180B74 jsr sub_1CAA1C ROM:00180B7A adda.l #$10,sp ROM:00180B80 movem.l d0/a0/a6,-(sp) ROM:00180B84 jsr sub_1CAAC6 ROM:00180B8A movem.l (sp)+,d0/a0/a6 ROM:00180B8E move.b #0,(byte_FFFE96).l ROM:00180B96 clr.w (word_FFFE94).l ROM:00180B9C cmpi.b #$12,(byte_FFF1A8).l ROM:00180BA4 bne.w loc_180BD0 ROM:00180BA8 cmpi.b #$34,(byte_FFF1B0).l ; '4' ROM:00180BB0 bne.w loc_180BD0 ROM:00180BB4 cmpi.b #$56,(byte_FFF1BC).l ; 'V' ROM:00180BBC bne.w loc_180BD0 ROM:00180BC0 cmpi.b #$78,(byte_FFF1C4).l ; 'x' ROM:00180BC8 bne.w loc_180BD0 ROM:00180BCC bra.w loc_180C12
Earthworm Jim Code ROM:00247576 mus_point: ; CODE XREF: ROM:002456D2p ROM:00247576 pea (DAC).l ROM:0024757C pea (sequences).l ROM:00247582 pea (Modulation).l ROM:00247588 pea (Patches).l ROM:0024758E jsr sub_2CBCBC ROM:00247594 adda.l #$10,sp
|
|
| |
Nemesis_c | Дата: Суббота, 05.11.2011, 03:55 | Сообщение # 27 |
Сообщений: 1148 Статус: Offline
| r57shell, даешь конвертер в sound images
|
|
| |
Smoke | Дата: Понедельник, 07.11.2011, 15:56 | Сообщение # 28 |
Get Serious! Сообщений: 551 Статус: Offline
| Comix Zone Code ROM:001CB742 mus_point: ; CODE XREF: RESERV0+184p ROM:001CB742 pea (DAC).l ROM:001CB748 pea (Sequences).l ROM:001CB74E pea (Modulation).l ROM:001CB754 pea (Patches).l ROM:001CB75A bsr.w sub_1CB5CC ROM:001CB75E lea $10(sp),sp ROM:001CB762 rts ROM:001CB762 ; End of function mus_point
|
|
| |
Nemesis_c | Дата: Вторник, 08.11.2011, 07:51 | Сообщение # 29 |
Сообщений: 1148 Статус: Offline
| В комикс зон, если не ошибаюсь, вся музыка от сборной команды roadkill.. можно выгуглить - послушать с вокалом.. не тухло так.
|
|
| |
Smoke | Дата: Среда, 09.11.2011, 03:15 | Сообщение # 30 |
Get Serious! Сообщений: 551 Статус: Offline
| Да и в игре тоже неплохо звучит. Сконвертил даже без багов, двумя кликами =)))
|
|
| |
|