Среда, 14.04.2021, 10:12
Вы вошли как Гость | Группа "Гости" | RSS

Главная Регистрация Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Модератор форума: Nemesis_c  
Форум » Elektropage.ru » Other » GEMS sound driver research (копипаста с соникретро)
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:

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
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,


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:

* 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
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-го года написать не могут?

начинай biggrin

Мальчик, девочка... какая в жопу разница..
Nemesis_cДата: Понедельник, 17.10.2011, 06:21 | Сообщение # 5

Сообщений: 1147
Статус: Offline

главное нАчать...
SmokeДата: Вторник, 18.10.2011, 20:45 | Сообщение # 6

 Get Serious!
Сообщений: 551
Статус: Offline

Почти начал. Разбираю формат голосов гемса.
* 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

Ох, это не скоро будет, тут есть одна заковырка, портящая всю малину
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

Сообщений: 1147
Статус: Offline

куда я попал?.. одни маньяки кругом...
SmokeДата: Воскресенье, 23.10.2011, 22:56 | Сообщение # 12

 Get Serious!
Сообщений: 551
Статус: Offline

Да, мы такие! biggrin
Меж тем конвертер выдает теперь полноценную мелодию (правда с потерей каналов) в формате standart SMPS 68k, с голосами и с прочей нужной лабудой внутри. Пол дела сделано.
И еще интересная вещь, которую я обнаружил. Величина ожидания после проигрывания ноты оказывается равна разности делея и продолжительности звучания этой ноты (duration), а не просто делею, как после выполнения команды. Так что делей это по сути заданное время на выполнение того или иного действия (команда или воспроизведение ноты).

Вот сам ром, если кому интересно, с мелодией из Zero Tolerance на драйвере SMPS z80. Номер мелодии -- $D
Прикрепления: ROM.bin(192.0 Kb)

r57shellДата: Воскресенье, 23.10.2011, 23:38 | Сообщение # 13

Сообщений: 632
Статус: Offline

хм, глючно всёравно.
Это... может ещё замутить драйвер MP3?) короче эт громко сказано. Я с звуком в сеге не разбирался,
вопрос собственно какой: какое можно самое высокое качество выдавать, например если весь ром - один трек.
(с учётом того, что надо уметь во время этого воспроизводить звуки, вопли, пинки, взрывы).

Мальчик, девочка... какая в жопу разница..
Nemesis_cДата: Понедельник, 24.10.2011, 02:42 | Сообщение # 14

Сообщений: 1147
Статус: Offline

Quote (Smoke)
У кого-нибудь остался GEMS development kit? А то захожу на хидден-пэлас, а он чета глючит и я не могу скачать. http://www.hidden-palace.org/?releases/44

Quote (Nemesis)
у меня есть. сегодня ближе к вечеру скину
Добавлено позже:
оказалось, что нету. видимо удалил вместе с досбоксом.

таки нашел.. в аттаче
Прикрепления: GEMS.zip(341.7 Kb)
SmokeДата: Понедельник, 24.10.2011, 02:54 | Сообщение # 15

 Get Serious!
Сообщений: 551
Статус: Offline

Nemesis_c, спасибо, но хидден пэлас уже заработал и я уже оттуда стянул недавно smile
Quote (r57shell)
хм, глючно всёравно. Это... может ещё замутить драйвер MP3?) короче эт громко сказано. Я с звуком в сеге не разбирался, вопрос собственно какой: какое можно самое высокое качество выдавать, например если весь ром - один трек. (с учётом того, что надо уметь во время этого воспроизводить звуки, вопли, пинки, взрывы).

Да там я цикл не задал, забыл сделать. Звуки, вопли, пинки, взрывы это тоже PCM-ки будут, а DAC канал всего один, так что не прокатит. А так максимум вроде можно 22кГц. Хотя по идее можно хоть 44кГц задать, но наверно з80 уже не потянет

Nemesis_cДата: Понедельник, 24.10.2011, 03:45 | Сообщение # 16

Сообщений: 1147
Статус: 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
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. И нота будет звучать столько сколько надо. В общем йа счастлив. Осталось только разобраться с еще одним геморроем -- циклы.

Добавлено позже:

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
Циклы пока не поддерживаются, также как и модуляция. Звучит не совсем идентично, но очень похоже. Ваши мысли?
Прикрепления: 1414264.bin(224.0 Kb)

Nemesis_cДата: Четверг, 03.11.2011, 05:13 | Сообщение # 25

Сообщений: 1147
Статус: Offline

Есть ощущение, что чего-то не хватает.. или может скорость не та, а так - шикарно ok

Добавлено позже:

не.. прислушался - отлично biggrin
вектормэна не оценю адекватно т.к. играл в него давным давно и не много.
как-то я проглядел вообще твое сообщение.. только сегодня увидел..
SmokeДата: Четверг, 03.11.2011, 05:22 | Сообщение # 26

 Get Serious!
Сообщений: 551
Статус: Offline

Скорость немного не та и громкость некоторых голосов скачет. Вечно у меня с ней проблемы. дело в том, что в гемсе единица громкости больше, чем единица громкости в смпс и я не могу задать громкость такую же как в оригинале (макс значение $7F и при нем все равно не так тихо как надо). Придется уменьшать громкость самого инструмента, причем выборочно (отдам задачу юзеру).
Сегодня тестил робокопа против терминатора и червя джима. В джиме используется DAC, поэтому добавил поддержку, теперь ударные будут в мелодии. А в робокопе даже PSG используется в некоторых мелодиях. Завтра и это добавлю. В общем дело близиться к завершению наверно. Допилю траблу с громкостью и все наверно. Еще ближе к оригиналу уже хз как сделать. Но так вроде тоже нормально, если учесть то, что раньше и этого нельзя было сделать smile
Robocop vs The Terminator
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
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

Сообщений: 1147
Статус: Offline

r57shell, даешь конвертер в sound images smile
SmokeДата: Понедельник, 07.11.2011, 15:56 | Сообщение # 28

 Get Serious!
Сообщений: 551
Статус: Offline

Comix Zone
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

Сообщений: 1147
Статус: Offline

В комикс зон, если не ошибаюсь, вся музыка от сборной команды roadkill.. можно выгуглить - послушать с вокалом.. не тухло так.
SmokeДата: Среда, 09.11.2011, 03:15 | Сообщение # 30

 Get Serious!
Сообщений: 551
Статус: Offline

Да и в игре тоже неплохо звучит. Сконвертил даже без багов, двумя кликами =)))

Форум » Elektropage.ru » Other » GEMS sound driver research (копипаста с соникретро)
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »

Select language:
Nemesis_c, r57shell, Smoke, Lipetsk, GoodBye (aka vfiuchcikicshuusrch) & Segaman © 2021
Хостинг от uCoz