PDA

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



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

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

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

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

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

key-jee
27.07.2006, 12: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, 15:15
Замучался уже.
Подскажите на конкретном примере как проиграть мелодию в im2?
мелодия с плеером pt3.
Т.е такой цикл
10 call 49152
20 n1 call 49157
30 halt
40 jp n1
50 ret

newart
29.12.2011, 15: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, 15:38
А вместе с прерываниями im2 как это будет выглядеть?
Хочу отдельно повесть музон на прерывания.

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

Vitamin
29.12.2011, 15: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, 15:43
Спасибо!!

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

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

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

Enigmatic
30.12.2011, 12: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, 16: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, 17:27
DimkaM, Это на каком клоне озу держишь?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

Shadow Maker
15.03.2012, 09: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, 18: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. Нашел нужный формат - и все заработало, как в цикле, так и на прерываниях.

romancha
26.03.2019, 11:52
Всем привет! Может кто поможет, перечитал всю тему и все равно не получилось, вставить в свой код музыку (tune.$c) с плеером сохраненную из VORTEX трекера II(((( В sjasme добавляю ...

ORG #C000
MUSIC INCBIN "tune.$c"

после вызываю CALL #C000, и вижу просто черный экран внизу A>K
и все...:v2_dizzy_facepalm:

goodboy
26.03.2019, 12:13
покажи полученный кодовый блок

romancha
26.03.2019, 13:29
покажи полученный кодовый блок



MODULE MainCode

entry LD A,71
LD (23693),A
XOR A ; border 0
CALL 8859 ; ========
CALL 3435
LD A,2
CALL 5633

MUSIC EQU #C000
LD A,1
LD (MUSIC+10),A
CALL MUSIC
EI
LPM
HALT
CALL MUSIC+5
LD A,(MUSIC+10)
RLA
JR NC,LPM
RET
;============================================

...... код игры

;============================================
ORG #C000
INCBIN "tune.$c"

ENDMODULE



tune.$c, сохранял как Hobeta with player.

goodboy
26.03.2019, 13:34
tune.$c, сохранял как Hobeta with player.
у файлов в формате hobeta вначале присутствует заголовок (17байт), при incbin его надо пропускать
(вроде можно явно указывать смещение)

romancha
26.03.2019, 13:43
у файлов в формате hobeta вначале присутствует заголовок (17байт), при incbin его надо пропускать
(вроде можно явно указывать смещение)

мда, а сколько нужно пропустить?

- - - Добавлено - - -


мда, а сколько нужно пропустить?

туплююю)))

- - - Добавлено - - -


у файлов в формате hobeta вначале присутствует заголовок (17байт), при incbin его надо пропускать
(вроде можно явно указывать смещение)

сейчас попробую!

- - - Добавлено - - -

БРАВО! ЗАИГРАЛО;))) СПАСИБИЩЕ, неделю голову ломал, откуда стартовать!

goodboy
26.03.2019, 13:44
как вариант смотри после компиляции что получилось в отладчике.
ну а так, да

incbin test.bin,7 ; include boe.bin but skip the first 7 bytes

romancha
26.03.2019, 13:51
Насколько я понимаю, только после того как доиграет музыка, будет выполнен остальной код программы?

Нужно вставлять , ну например заставку к игре в цикл музыки ? или нет перед циклом

goodboy
26.03.2019, 13:58
если нужна постоянно задействуй im2

romancha
26.03.2019, 14:01
если нужна постоянно задействуй im2

мдя, до прерываний еще не добрался) с этим делом нужно еще вникать, но все равно спасибо за СОВЕТ!

Enigmatic
26.03.2019, 15:21
Если очень хочется, то можно воспользоваться простенькой программкой из Zx-ревю помоему)
Тут мелодия откомпилирована по адресу 30000, можно что-то еще в цикл добавить
https://pp.userapi.com/c853628/v853628533/e91e/MAgTyAlpL80.jpg

romancha
26.03.2019, 15:35
Благодарю, я воспользовался именно этой программкой, музыка играет и при заставке и в самой игре, а отключить? CALL IMOFF? не так ли...

goodboy
26.03.2019, 15:47
только плейер заглуши (call init) после этого

mastermind
26.03.2019, 18:48
у файлов в формате hobeta вначале присутствует заголовок (17байт), при incbin его надо пропускать
(вроде можно явно указывать смещение)

В ужасме же есть для этого директива INCHOB: https://github.com/sjasmplus/sjasmplus/wiki#inchob-filenameoffsetlength

- - - Добавлено - - -


MUSIC INCBIN "tune.$c"
См. https://github.com/sjasmplus/sjasmplus/wiki#inchob-filenameoffsetlength

Dart Alver
26.03.2019, 23:11
LD A,#66
LD I,A
IM 2
Только I=#66 пожалуй не лучший выбор, если планируется работоспособность проги на оригинале.

Shiny
27.03.2019, 06:08
Какие вы молодцы. Не удивлюсь, что программа работает на разных компьютерах.

romancha
27.03.2019, 08:23
Только I=#66 пожалуй не лучший выбор, если планируется работоспособность проги на оригинале.
А почему так? наверное есть альтернатива

- - - Добавлено - - -


Если очень хочется, то можно воспользоваться простенькой программкой из Zx-ревю помоему)
Тут мелодия откомпилирована по адресу 30000, можно что-то еще в цикл добавить
https://pp.userapi.com/c853628/v853628533/e91e/MAgTyAlpL80.jpg
Кстати, вот в этом куске " LD (#66FF),HL ", почему задействован именно адрес #66FF ?

Shiny
27.03.2019, 09:12
Кстати, вот в этом куске " LD (#66FF),HL ", почему задействован именно адрес #66FF ?
изучи, как работает IM2

Destr
27.03.2019, 12:54
изучи, как работает IM2
Да сказал бы просто: При приходе перывания старший байт адреса перехода берётся из рег.I а младший с шины данных.
Там должно быть #FF на оригинале, но кучи клонов спека не оставляют выбора - всё-таки надо юзать табличку в 257 байт... :(

Shiny
28.03.2019, 12:55
Да сказал бы просто: При приходе перывания старший байт адреса перехода берётся из рег.I а младший с шины данных.
Там должно быть #FF на оригинале, но кучи клонов спека не оставляют выбора - всё-таки надо юзать табличку в 257 байт... :(

спасибочки! не знал

Biland
01.07.2021, 13:48
Скачал с zxart музыку в формате pt3. Проиграть её не могу. В pt3 есть же встроенный плеер или pt3 по другому адресу скомпилированы?

DEVICE ZXSPECTRUM128
org #9000

StartProg:
call #c000
ei
loops halt
call #c005
jr loops

org #c000
INCBIN "KUVO - Jester Molecule's revenge theme (2021).pt3" ;17

;INCBIN "KUVO - Jester Molecule's revenge theme (2021).$c",17 ;После VT экспорта

SAVESNA "test.sna",StartProg

В VT играет, и скомпилированная с плеером воспроизводит. Это получилось.

П.С.: Походу нет плеера строенного в фалах pt3 на zxart (по крайней мере, которые скачал).

Black Cat / Era CG
01.07.2021, 15:50
Насколько помню, pt3 - это как раз музло БЕЗ плеера.