PDA

Просмотр полной версии : Вставка AY музыки в программу



molodcov_alex
26.07.2006, 17:31
Подскажите, please, какой формат поэкономичнее (занимает меньше памяти и сам проигрыватель был бы попроще), ну и соответственно как с ним работать, желательно с примерами кода.

upd.
Итого: в Dizzy 1 из Dizzy S.A.C.K. (и во все прочие свои поделки) было всунуто примерно следующее: http://zx.pk.ru/showthread.php?p=301154#post301154

jtn
26.07.2006, 18:09
pt3, другие все вымерли.
если компилишь под #c000, то инициализация в самом начале call #c000, потом по таймеру 50гц делаешь call #c005, при этом мусорятся почти все регистры Z80

AAA
26.07.2006, 19:42
Я помню, что SOUND TRACKER в несколько раз быстрей чем ASM. Когда вешаешь музон ASM ваабще все тормозиться.

molodcov_alex
27.07.2006, 08:47
Спасибо! Уже пользуюсь "Vortex Tracker II v1.0 PT3 player for ZX Spectrum". Действительно экономично!

key-jee
27.07.2006, 10:21
Подскажите, please, какой формат поэкономичнее (занимает меньше памяти и сам проигрыватель был бы попроще)
В каком формате тебе музыкант музыку предоставил - тот и используй :wink:

shuran33
18.12.2010, 23:07
желательно с примерами кода.

А может кто-нибудь напишет пример кода?
Допустим у меня в образе записана РТ3-музыка. Я ее подгружаю в своей программе, и далее как мне ее заставить играть?:v2_confu:

null_device
18.12.2010, 23:14
Например, "воткнуть" в прерывания вызов плейера.. по-моему, так!
----
Обычно в проигрывателе существуют три точки: инициализации, проигрывания одного "такта" мелодии и остановки. Зная адреса этих точек пишется программа работающая в прерываниях, перед каждым вызовом проигрывателя сохраняющая "жизненно важные" регистры МП (например в стек), а после вызова их восстанавливающая.

shuran33
18.12.2010, 23:16
Значит чтобы играла музыка нужно каждый раз плеер "втыкать"? Тогда где посмотреть код простого плеера? Чтоб вставить его в программу.

AAA
18.12.2010, 23:18
Значит чтобы играла музыка нужно каждый раз плеер "втыкать"? Тогда где посмотреть код простого плеера? Чтоб вставить его в программу.

В исходниках от АААБАНД, тема в программировании, называеться исходники Мегадем. Во всех частях есть плеер, причем универсальный.

shuran33
18.12.2010, 23:19
AAA, понял. Сейчас посмотрю там.

null_device
18.12.2010, 23:23
Тогда где посмотреть код простого плеера? Чтоб вставить его в программу.

А, чем плох "родной", получающийся после компиляции? Или вам нужен "универсальный", для нескольких мелодий??

shuran33
18.12.2010, 23:25
Я даже не знаю. Но я так понимаю что если проигрывать несколько мелодий то лучше универсальный. А если одну то и "родной" отлично работает.

AAA
18.12.2010, 23:36
Я даже не знаю. Но я так понимаю что если проигрывать несколько мелодий то лучше универсальный. А если одну то и "родной" отлично работает.

Лучше родным если одну. Особенно АСМ. Но если нужна скорость и проигрывание разных мелодий pt2 pt3 asm st, то есть универсальный плеер. Хотя обязательно надо проверять после сборки. VNN на этом собаку уже съел, спроси его в личку или почту, он тебе все объяснит и пришлет.

3 мегадемы все таки написал и в каждой части по 5-10 мелодий разных сувал. Глюков было немеряно. Мелодия играет, а орнаменты сбиты и не сразу, а где нить в конце что то не так играет. Если такое не заметить музакер может обидеться что его шедевр не так звучит.

null_device
18.12.2010, 23:38
Вот тут (http://zx.pk.ru/showpost.php?p=257422&postcount=28) пример программы обработки прерываний в режиме IM2. Там же где-то образ с "наглядным" примером, как это должно работать на основе мелодии STP.

Enigmatic
29.12.2011, 14:15
Замучался уже.
Подскажите на конкретном примере как проиграть мелодию в im2?
мелодия с плеером pt3.
Т.е такой цикл
10 call 49152
20 n1 call 49157
30 halt
40 jp n1
50 ret

newart
29.12.2011, 14:35
Замучался уже.
Подскажите на конкретном примере как проиграть мелодию в im2?
мелодия с плеером pt3.
Т.е такой цикл
10 call 49152
20 n1 call 49157
30 halt
40 jp n1
50 ret



org #6000
call #c000
ei
loop halt
call #c005
jp loop

org #c000
incbin "music.m"

Enigmatic
29.12.2011, 14:38
А вместе с прерываниями im2 как это будет выглядеть?
Хочу отдельно повесть музон на прерывания.

null_device
29.12.2011, 14:40
Enigmatic, в 14 посте, была дана ссылка на обработчик прерываний, в котором можно играть музыку (а также, листинги для "подготовки" и запуска скомпилированной мелодии и вторых прерываний их последующей "остановки").
Мелодию с проигрывателем - "в студию"! (или адреса инициализации, проигрывателя и остановки).
----
Простейшая "мулька" (http://zx.pk.ru/attachment.php?attachmentid=16070&d=1266023242) для создания im2-обработчика..

Vitamin
29.12.2011, 14:41
Компиляция из кусков:



CALL 49152
CALL SETIM2
LOOP:
LD A,191
IN A,(254)
RRA
JR NC,EXIT
HALT
JR LOOP
EXIT:
JP SETIM1

SETIM2 LD HL,INTTAB
LD DE,INTTAB+1
LD (HL),PLAYER
LD BC,256
LDIR
DI
LD A,'INTTAB
LD I,A
IM 2
EI
RET

SETIM1 DI
LD A,63
LD I,A
IM 1
EI
RET

ORG '$*257
PLAYER PUSH AF,BC,DE,HL
EXX
EX AF,AF'
PUSH AF,BC,DE,HL
PUSH IX,IY
CALL MUSIC+5 ;MUSIC+6 for old players
POP IY,IX
POP HL,DE,BC,AF
EXX
EX AF,AF'
POP HL,DE,BC,AF
EI
RET

INTTAB EQU #B000 ;257 bytes at #xx00

MUSIC INCBIN "music.C"

Enigmatic
29.12.2011, 14:43
Спасибо!!

Killer
29.12.2011, 23:02
А вместе с прерываниями im2 как это будет выглядеть?
Хочу отдельно повесть музон на прерывания.
Возьми любую демку без частей или гифт и посмотри как там сделано!!!

DimkaM
30.12.2011, 08:00
Для прерываний юзаю IM1, намного удобней и проще.

jerri
30.12.2011, 09:51
DimkaM, а ты всегда в прерывание укладываешься?

Enigmatic
30.12.2011, 11:59
Возьми любую демку без частей или гифт и посмотри как там сделано!!!
Я уже разобрался.
Вот кому мож пригодится:

org 46000
call 30000 ;ин.музыки
jp start
start ld hl,inter
ld (#66ff),hl
ld a,#66
ld i,a
im 2
ei
ret
inter push hl
push de
push bc
push af
push ix
call 30005 ;воспроизведение музыки,можно
всунуть +еще индикатор или цикл.бег.строку
pop ix
pop af
pop bc
pop de
pop hl
jp #38
imoff di
ld a,63
ld i,a
im 1
ei
ret
по адресу 30000 или люб.другой должна лежать музыка.В цикл можно вставить еще и анализатор музыки,бег строку...
Использовать можно в бейсике:
10 загрузил музыку
20 загрузил саму прогу code 46000
30 randomize usr 46000

DimkaM
30.12.2011, 15:10
DimkaM, а ты всегда в прерывание укладываешься?разве есть разница IM2 vs IM1 ?
Наверно имеется ввиду Халт с юзаньем Бейсиковского обработчика. Я обычно в 0-3ффф ОЗУ держу.
start ld hl,inter
ld (#66ff),hl
ld a,#66
ld i,a
im 2
ei
ret
А разве таблица не нужна?

jerri
30.12.2011, 16:27
DimkaM, Это на каком клоне озу держишь?

---------- Post added at 17:27 ---------- Previous post was at 17:26 ----------

Enigmatic, таблица нужна для нормальной обработки им2

DimkaM
30.12.2011, 21:45
DimkaM, Это на каком клоне озу держишь?пентева,незнаю правда потянет ли оно на клон спека.

Killer
30.12.2011, 22:05
таблица нужна для нормальной обработки им2
Это только на клонах. В оригинальных спеках так и делается. В некоторых клонах прерывания по IM2 не правильно отрабатываются, для этого нужна таблица ( лишняя трата 256 байт)

VNN_KCS
30.12.2011, 23:12
В некоторых клонах прерывания по IM2 не правильно отрабатываются, для этого нужна таблица ( лишняя трата 256 байт)
Вот только не надо. Сделай простейшее - в вектор вставь #3f. Получится адрес #FFFF. В #FFFF запиши #18. Получится JR #FFF4. В #FFF4 запиши JP куда нада. И никаких таблиц, занимающих 257 байт.
Правда для проги, не переключающей странички. Хотя и там можно сделать соотв. изменения.

goodboy
30.12.2011, 23:41
Сделай простейшее - в вектор вставь #3f. Получится адрес #FFFF у меня в пзу из (#3fff) совсем другие числа читаются.

Killer
31.12.2011, 06:50
Вот только не надо. Сделай простейшее - в вектор вставь #3f. Получится адрес #FFFF. В #FFFF запиши #18. Получится JR #FFF4. В #FFF4 запиши JP куда нада. И никаких таблиц, занимающих 257 байт.
Правда для проги, не переключающей странички. Хотя и там можно сделать соотв. изменения.
Не во всех ПЗУ по адресу #3fff считывается #ffff. Было много самописных прошивок.

VNN_KCS
31.12.2011, 11:32
у меня в пзу из (#3fff) совсем другие числа читаются.
Тады - "ОЙ" ). Щас стоко всяких прошивок...

jerri
01.01.2012, 00:20
Это только на клонах. В оригинальных спеках так и делается. В некоторых клонах прерывания по IM2 не правильно отрабатываются, для этого нужна таблица ( лишняя трата 256 байт)

Это вообще-то из правил хорошего тона

не ставить I в slowram
делать для IM2 табличку

и именно про фирменные машины ;)
ты поручишься что какойнить interface1 не будет сыпать мусор на шину оригинального спека?

Killer
01.01.2012, 09:19
ты поручишься что какойнить interface1 не будет сыпать мусор на шину оригинального спека?
Хмм, сильно сомневаюсь что при подключенной перифирии мусора на шине не будет.

GriV
04.01.2012, 15:02
2VNN> Ай ай ай, такой большой, а табличку для прерываний упрощённую используешь... :)

---------- Post added at 15:02 ---------- Previous post was at 15:01 ----------


не ставить I в slowram
делать для IM2 табличку
Залог надёжного ИМ2. Сокращайте, убирайте, делайте по-своему. А потом будете удивляться, что даже в эмуле через раз работает.

psb
04.01.2012, 18:10
2VNN> Ай ай ай, такой большой, а табличку для прерываний упрощённую используешь...
просто он для нормальных компов делает;)

DevL
11.03.2012, 16:06
есть разные куски, тут и там - может есть один но полный кусок кода для проигрывания на AY?
неважно насколько много циклов занимает, но важно исходники, что бы себе подключить проще и собрать прогу.

Shadow Maker
15.03.2012, 08:43
Ну вот например. Это я кусок кода cj покромсал, который он мне когда-то давал. Если такую кучу не надо сохранять на прерываниях - убери. Можно вообще сразу поместить куда надо обработчик и обойтись без ldir. Код для sjasmplus.

Это если я правильно понял, что ты хочешь проигрывать с прерываний. Если просто проигрывать - сделай тупо loop call music+5: jr loop и всё.



imtab equ #be00 //таблица вектора прерываний (257 байт)
int_jump equ #bdbd //обработчик

start
di:ld sp,#6000
xor a:out (#fe),a
// прерывания
ld hl,imtab:ld a,h,i,a
ld a,low int_jump
ld (hl),a:inc l:jr nz,$-2
inc h:ld (hl),a
ld hl,obrab,e,a,d,a,bc,obrab_len:ldir
im 2
call music // init music
ei

loop
halt
jr loop


obrab //обработчик прерываний (работает с адреса #bdbd)
push af,hl,bc,de,ix,iy
exx
push hl,de,bc
ex af,af'
push af
call music+5
pop af
ex af,af'
pop bc,de,hl
exx
pop iy,ix,de,bc,hl,af
ei
ret
obrab_len equ $-obrab

music incbin "music.cod" //пт3-модуль с плеером

DevL
16.03.2012, 17:59
2 Shadow Maker

спасибо, нашел исходники
//пт3-модуль с плеером

щас переделаю для IAR или другого , но на PC ...

Zeroxor
07.02.2015, 12:06
Добрый день. Есть такая проблема - ну никак не получается проиграть музыку, экспортированную из Vortex Tracker II. Экспортирую в формате hobeta with player, на адрес #C000. Из Бейсика загружаю на адрес 49152. Длина музыки с плеером из VT немногим меньше 6 КБ. Кодовый кусочек загружаю по адресу 45000, длина... да вот он, собственно, весь (как рекомендует и VT, и в этой теме был такой же кусочек кода):

CALL #C000
EI
LOOP CALL #C005
HALT
JP LOOP
RET

Результат - эмулятор сбрасывается.

Собственно, вопрос: что я делаю не так? Понятно, что причина ошибки на моей стороне, но в чем она заключается - никак не могу понять.

Vitamin
07.02.2015, 12:51
Экспортирую в формате hobeta with player
А в образе диска он в формате хобеты лежит или просто кодовым блоком?
Если вызов из бейсика, то перез загрузкой кода модуля или управляющего кода надо сделать CLEAR.

Zeroxor
07.02.2015, 13:07
А в образе диска он в формате хобеты лежит или просто кодовым блоком?
Если вызов из бейсика, то перез загрузкой кода модуля или управляющего кода надо сделать CLEAR.
Я делал сохранение и в формате AY - это же и есть кодовый блок, если я правильно понимаю?
Делаю CLEAR 44999, потому как кодовый блок запускаю с 45000 (а я, кажется, об этом писал).

Vitamin
07.02.2015, 13:25
Я делал сохранение и в формате AY - это же и есть кодовый блок, если я правильно понимаю?
Нет. Это более сложный формат.
Можно TRD со всеми необходимыми файлами? (загрузчик, код инициализации, модуль)

denpopov
07.02.2015, 13:26
Собственно, вопрос: что я делаю не так? Понятно, что причина ошибки на моей стороне, но в чем она заключается - никак не могу понять.

Я не дохожу до такого изврата с хобетой, но по идее перед использованием проигрывателя, его нужно проинициализировать:

ld hl,song: call INIT

здесь song - адрес музона.

и на экспортируемый файл хотелось бы взглянуть вообще-то.

Zeroxor
07.02.2015, 14:30
Vitamin, denpopov: спасибо большое. Разобрался. Ошибка была в том, что не понимал, что же именно сохраняет мне Vortex Tracker. Нашел нужный формат - и все заработало, как в цикле, так и на прерываниях.