PDA

Просмотр полной версии : Вопрос по Sound Tracker



jerri
20.02.2014, 17:16
Есть мелодия написанная в Sound Tracker (классическом)
как её заставить проиграться один раз и заткнуть навсегда?
средствами самого тракера это реально сделать?

Vitamin
20.02.2014, 17:21
Навсегда- только доработкой плеера.
Надолго- поставить длину в 255 позиций и забить неиспользуемые пустым паттерном.

denpopov
20.02.2014, 17:21
как её заставить проиграться один раз и заткнуть навсегда?

Gasman публиковал исходники демы Ninja Milkman Conspiracy, там есть дизассемблированный проигрыватель Sound Tracker с комментариями. может, поможет?

null_device
20.02.2014, 18:07
jerri, "посчитать" количество вызовов плейера, после инициализации мелодии, и прекратить его вызов по достижении "конца" мелодии. Добавить в конец мелодии "паузу", или "заткнуть" AY\YM - "вручную".

---------- Post added at 22:07 ---------- Previous post was at 21:47 ----------

Как вариант: попробовать "перекомпилировать" мелодию в Sound Tracker Pro. Там есть точка остановки мелодии adr+9.

Rindex
20.02.2014, 18:19
Как вариант: попробовать "перекомпилировать" мелодию в Sound Tracker Pro. Там есть точка остановки мелодии adr+9.

Можно, только надо полностью послушать мелодию в STPro, вполне возможно, что играть она будет по другому. Например, в обычном ST какой-нибудь звук можно отредактировать так, что он сам затухнет и потом будет тишина до следующей ноты, то STPro после затухания сам её проиграет ещё раз, там где в обычном уже тишина. Т.е. надо ставить R--, чтобы не было повторения.

Vitamin
20.02.2014, 18:20
Как вариант: попробовать "перекомпилировать" мелодию в Sound Tracker Pro. Там есть точка остановки мелодии adr+9.
И эта точка сама вызывается по достижению конца мелодии?

null_device
20.02.2014, 18:25
Vitamin, чего-то, малость "туплю". Запутала постановка вопроса ТС. ;)
Значит: только "считать" количество вызовов плейера и по достижении нужного значения вызвать процедуру "остановки" и "отключить" вызов плейера.

Vitamin
20.02.2014, 18:30
Значит: только "считать" количество вызовов плейера и по достижении нужного значения вызвать процедуру "остановки" и "отключить" вызов плейера.
Т.е. сначала узнать длительность мелодии (а если их несколько, то еще и табличку сделать), а потом еще сбоку состряпать "закат солнца вручную" со счетчиками и вызовами?;)

null_device
20.02.2014, 18:47
Vitamin, а есть более простой способ - поделитесь? :)


сначала узнать длительность мелодии (а если их несколько, то еще и табличку сделать), а потом еще сбоку состряпать "закат солнца вручную" со счетчиками и вызовами?

Есть мелодия написанная в Sound Tracker (классическом)

В случае ОДНОЙ мелодии, изыскиваем в памяти несколько ячеек для организайии "счетчика" (ибо, использовать для хранения регистры - это не по-джедайски). При инициализации мелодии, заносим в них вычисленное значение (каким образом это будет сделано - второй вопрос). На каждом цикле до перехода на плейер, проверяем это значение и уменьшаем его до тех пор, пока оно не будет равно 0 (иначе, переходим на процедуру "выключения" мелодии, а в ячейки заносим еденицу). Это, по вашему - очень сложная конструкция?

Vitamin
20.02.2014, 18:57
Vitamin, а есть более простой способ - поделитесь?
Предложил уже.
При средней длине мелодии в 10 позиций и скорости 5, имеем свободными 245 позиций по 64 строки по 5 фреймов что даст 26 минут тишины. Для некоторых ситуаций вполне себе подойдет.
Если надо именно навсегда- модифицировать плеер чтобы он отключал точку входа +6 по достижению конца.

null_device
20.02.2014, 19:03
как её заставить проиграться один раз и заткнуть навсегда?

Vitamin, т.е. по-вашему, предложенный мною способ - это "ламерство" и "индусский код", а предложенный вами способ "допиливания" мелодии или плеера - не "секс в гамаке и стоя"? :)

jerri
20.02.2014, 19:12
Gasman публиковал исходники демы Ninja Milkman Conspiracy, там есть дизассемблированный проигрыватель Sound Tracker с комментариями. может, поможет?

где?

psb
20.02.2014, 19:13
да захачить плеер + закат вручную! универсально.

jerri
20.02.2014, 19:15
V
В случае ОДНОЙ мелодии, изыскиваем в памяти несколько ячеек для организайии "счетчика" (ибо, использовать для хранения регистры - это не по-джедайски). При инициализации мелодии, заносим в них вычисленное значение (каким образом это будет сделано - второй вопрос). На каждом цикле до перехода на плейер, проверяем это значение и уменьшаем его до тех пор, пока оно не будет равно 0 (иначе, переходим на процедуру "выключения" мелодии, а в ячейки заносим еденицу). Это, по вашему - очень сложная конструкция?

Да нет, мелодий много и огород с табличками городить не хочется.
есть исходники плеера STPro?

goodboy
20.02.2014, 19:24
где?
комментов там минимум

Vitamin
20.02.2014, 19:25
Vitamin, т.е. по-вашему, предложенный мною способ - это "ламерство" и "индусский код", а предложенный вами способ "допиливания" мелодии или плеера - не "секс в гамаке и стоя"?
Неужели я давал оценки ненаписанному коду типа "ламерство" или "индусский код"? Не припомню...
А вот оценку трудоемкости всех вариантов предлагаю выполнить самостоятельно.

null_device
20.02.2014, 19:28
мелодий много и огород с табличками городить не хочется.

Много - это сколько?
Никакого огорода - если все мелодии "находятся" в памяти, при их переключении добавляем в текст оператор, для занесения значения в "счетчик". В конечном счете - выбор за вами.

---------- Post added at 23:28 ---------- Previous post was at 23:25 ----------


Неужели я давал оценки ненаписанному коду типа "ламерство" или "индусский код"? Не припомню...
А вот оценку трудоемкости всех вариантов предлагаю выполнить самостоятельно.

Значит, просто показалось...
Трудоемкость, зависит от задачи, поставленной ТС - а она, до конца не ясна.

psb
20.02.2014, 19:29
да дайте бинарь музона с плеером, там один джамп поди поправить. +закат солнца (который можно заменить на вызов init)...

jerri
20.02.2014, 19:46
комментов там минимум

этот у меня есть
есть




l7cbc: ld a,(l7c64) ;вот это текущая позиция.
ld c,a
ld hl,song_length ;вот тут проверяем длину музла
cp (hl)
jp c,l7cc9

xor a ;а здесь зануляем нафиг
; вся муза тупо зациклена на начало.
ld c,a
l7cc9: inc a
ld (l7c64),a
ld l,c
ld h,00h
add hl,hl
ld de,(position_map)
add hl,de
ld c,(hl)
inc hl
ld a,(hl)
ld (l7f08),a


---------- Post added at 19:46 ---------- Previous post was at 19:44 ----------


Много - это сколько?
Никакого огорода - если все мелодии "находятся" в памяти, при их переключении добавляем в текст оператор, для занесения значения в "счетчик". В конечном счете - выбор за вами.

на данный момент 6 музык. но будут еще
половину надо проигрывать один раз - остальные пускать по кругу.

самый простой и наименее трудоемкий способ предложен Витамином
им и воспользуюсь.

denpopov
20.02.2014, 19:49
Кстати, я могу ошибаться, но кажется у Codebusters был правленый проигрыватель, там вместо ld a,0 ставится ld a,<номер патерна>, но я не нашел в исходнике и не помню, в какой деме такое было.

---------- Post added at 19:49 ---------- Previous post was at 19:49 ----------


xor a ;а здесь зануляем нафиг
; вся муза тупо зациклена на начало.
ld c,a
вот оно, похоже.

key-jee
21.02.2014, 00:16
Неужели я давал оценки ненаписанному коду типа "ламерство" или "индусский код"? Не припомню...
А вот оценку трудоемкости всех вариантов предлагаю выполнить самостоятельно.

Загрузить трек в Vortex Tracker и записать продолжительноть музона в фреймах из окошка прям над окном редактирования, конечно наиболее трудоемко, чем вставить более 200 пустых паттернов в конце трека в Sound Tracker..

Проблема с хранением этих данных в табличках тоже надуманна: никто не мешает добавить эти данные прям перед данными трека и брать их по offset-2 при/перед инициализацией плеера. В добавок прям в эти данные можно и заглушку на бесконечные музоны вставить (0 - трек зациклен, иначе - длина трека во фреймах)

Загружаем модули:


stc1 defw stc1_len: incbin "1.stc"
stc2 defw stc2_len: incbin "2.stc"
// повторять пока не закончатся треки (или память)

инициализируем:


ld hl,stc1
ld e,[hl]: inc hl: ld d,[hl]: inc hl
ex de,hl: ld [count+1],hl: ex de,hl
// тут переходим в стандартную процедуру инициализации

Плеер типа:


count
ld hl,0
ld a,h: or l: jr z,playnote // ловушка для зацикленных треков
dec hl
ld a,h: or l: jr z,exit // не вызывать проигрыватель если трек отыграл
ld [count+1],hl
playnote
call player.play
exit


ps. при желании можно даже нагуглить формат stc файлов и понять как для них вычислить продолжительность музыки кодом.. но там кода будет явно побольше чем 20 байт "табличек"

Vitamin
21.02.2014, 00:23
Загрузить трек в Vortex Tracker и записать продолжительноть музона в фреймах из окошка прям над окном редактирования, конечно наиболее трудоемко, чем вставить более 200 пустых паттернов в конце трека в Sound Tracker..
"Вставка 200 пустых паттернов"- это, скорее всего, лишь выставление длины мелодии в 255 позиций.


ps. при желании можно даже нагуглить формат stc файлов и понять как для них вычислить продолжительность музыки кодом.. но там кода будет явно побольше чем 20 байт "табличек"
Погугли. Формат сравнительно простой. А 20 байт "табличек" будут побольше переделки в плеере.

Топикстартер уже определился есличто:)

key-jee
21.02.2014, 03:44
А 20 байт "табличек" будут побольше переделки в плеере.
Ты издеваешься чтоли? Проблема же не в том чтобы научить плеер затыкать музон, а в том что

половину надо проигрывать один раз - остальные пускать по кругу.
Значит либо плееру надо передать информации о том зациклен ли музон и научить его глушить треки по завершению, либо научить плеер зацикливать музон на определённой позиции и передавать ему информацию о том на какую позицию его зацикливать (и добавить ещё пустой паттерн в конце трека - явно твой метод). То есть как минимум 1 байт данных все равно будет (в том что я описал 2 байта на трек, в том что предложил ты более 200 байт пустоты на трек).

Да и сама модификация плеера не будет намного короче (и быстрее) 22 байт надстройки над плеером из предыдущего поста (мне просто лень лезть в плеер, сорцов которого у меня нет, и смотреть что там и где).


Топикстартер уже определился есличто
Да мне просто доставляет, как програмер доказывает музакеру, что добавить 200+ байт пустоты в одном из самых интерфейсноубогих трекеров на спектруме удобнее, чем прописать один defw в текстовом редакторе.

jerri
21.02.2014, 10:02
key-jee, не забывай что ТС тоже программер и ему проще добавить 26 минут тишины в плеер чем шерстить еще один плеер.

drbars
21.02.2014, 11:43
jerri, юзай ST Flash Player (формат fls) - он значительно шустрее.

Во вложении recompiler, и исходник player'а (by Alex Raider) :)

jerri
21.02.2014, 13:41
drbars, спасибо конечно, но как то не срослось.
вот бы перекодировщик под Вин

drbars
21.02.2014, 15:56
drbars, спасибо конечно, но как то не срослось.
вот бы перекодировщик под Вин

Всё зависит от исходных требований.

denpopov
21.02.2014, 15:58
jerri, ты все же хочешь трек проиграть или есть другая цель?

jerri
21.02.2014, 16:38
denpopov, у меня есть несколько мелодий которые мне нужно играть сейчас.
если я сделаю продуманный плеер, то мне будет проще использовать его в будущих проектах.

denpopov
22.02.2014, 12:48
jerri, такое подойдет?

jerri
22.02.2014, 15:15
denpopov, такой у меня есть, я его уже допилил.

всем спасибо. проблему решил костылями.