kategoria: AMOS
[#1] Kilka pytań z obsługi modułów przez AMCAF
Piszę sobie dzisiaj w Amosie odtwarzacz muzyki i mam narazie 3 pytania.

1. Chciałem dodać obsługę przewijania utworu i teraz w instrukcji AMCAF pisze coś takiego:
PT CPATTERN
function: return the current song position
songpos=Pt Cpattern
This function returns the current pattern/song position.
This can be used to restart a song at a given position when you stopped the music with Pt Stop.

Czy mam jakoś użyć tej funkcji, aby przeskakiwać pomiędzy patternami?
Print Pt Cpattern wyświetla nr aktualnego patternu, ale nie potrafię zmienić go na następny, a o to mi chodzi, aby można przewijać dany utwór.

2. Jak napisać przechodzenie do następnego utworu po ukończeniu aktualnego? Póki co odtwarzany plik jest domyślnie zapętlony.

3. Wyświetlane są nazwy plików, jednak po całej ścieżce i brakuje miejsca na ekranie. Dopisałem Right$, aby napisy nie wychodziły za daleko, ale to nie o to chodzi (wiadomo). Jak wyczytać z bezwzględnej ścieżki pliku samą jego nazwę? Przykład:
PLIK$="DH4:MUZYKA/XTD - UTWOR.MOD"
Print Right$(PLIK$,15)

Chodzi mi o to, by z bezwzględnej nazwy pliku (która zawiera pełną ścieżkę) program wyłapał pierwszy znak "/" z prawej strony i wyświetlał jedynie nazwę pliku, czyli ciąg tekstowy po tym znaku.

Chciałem napisać playerek taki niezależny od systemu. Posiadający obsługę playlisty oraz zapisywanie do 100 utworów. Jestem już na dobrej drodze, chociaż obsługa niektórych rzeczy nie wyszła zbyt intuicyjnie.
[#2] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #1

Spróbuj tak najpierw załaduj mod 'a , zrób np tak _mod_pattern=6 następnie PT CPATTERN=_mod_pattern i daj Pt Play... Teoretycznie powinno zadziałać... No chyba że Pt Play, Pt Stop, PT CPATTERN z wystawioną zmienną... Jeżeli w Amosie można ustawić zmienna Timer i ja potem odczytywać powinno się dać też z PT CPATTERN. Nie sprawdzałem tego nigdy więc trochę piszę w ciemno.
[#3] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #2

Nie działa.
Imploder Load "modul.mod",-3
POZYCJA=5

'Komendy ktore sprawdzilem:
Pt Cpattern=5
Pt Cpattern=POZYCJA 
Inc Pt Cpattern
Pt Cpattern,5


Sprawdzałem przykłady AMCAF i nie ma tam w tych dwóch playerkach opcji przewijania. Jest jedynie zmiana tempa poprzez CIA Speed. Trudno jeśli nie da się, to nie będzie tej opcji u mnie w odtwarzaczu.

Teraz pozostają jeszcze te dwa moje pytania odnośnie wyświetlania samej nazwy pliku oraz przechodzenia do następnego utworu. Kwestia jest taka, że jak sprawdzić, kiedy jest koniec danego modułu?
[#4] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #3

Rozumiem że ładujesz plik spakowany Impluderem... A w ogóle gra ci muza jak ją tak ładujesz?
Powinno być chyba tak
reserve as work (lub data jak wolisz) chip nr banku,wielkość pliku
load "nazwa pliku",nr zarezerwowanego wyżej bank'u
pt play nr banku
potem pt stop
Pt Cpattern=5
pt play nr banku
lub Pt Continue
zamiast pt play po Pt Cpattern

chyba że Pt Play BANK,POSITION ale to działa z AMCAF 1.5 i sprawdź jeszcze ten dokument.
[#5] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #1

Wyciągnięcie nazwy pliku:

PLIK$="DH4:MUZYKA/XTD - UTWOR.MOD"

NAZWA$=""

For I=Len(PLIK$) To 1 Step -1
  M$=Mid$(PLIK$,I,1)
  If M$<>"/"
    NAZWA$=M$+NAZWA$
  Else
    Exit
  End If
Next

Print NAZWA$
1
[#6] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #4

We wszystkim, co piszę i używam muzyki tak właśnie ładuję Imploderem. Sama komenda Pt Cpattern=5 wywala mi błąd. Mogę jedynie z tej komendy wyciągnąć wartość i przypisać do zmiennej, np. POZYCJA=Pt Cpattern.
Zawsze ładowałem tak:
Imploder Load "plik.mod",-3
Pt Play 3
...
Pt Stop
...
Pt Continue


@Szafir: Właśnie o to mi chodziło jeden problem z głowy dzięki. Mam problemy z rozeznaniem się w tych komendach tekstowych, mimo że mam książkę po polsku z Amosa.
1
[#7] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #4

Wpadłem na pewien pomysł.

Do przewijania w przód może być tak:
Pt Play 3
TEMPO=CIASpeed
If MouseKey=1
   CIASpeed=2000 : 'lub ile fabryka dała :-)
   Else CIASpeed=TEMPO
End If


Gorzej z przewijaniem wstecz
[#8] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #7

Chwila, chwila ale Pt Play BANK,POSITION działa. gdzie POSITION to kolejny nr patternu. Teraz sprawdzałem.
[#9] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #6

Pt Cpattern jest funkcją, a nie komendą. Zapis Pt Cpattern=5 stosuje się do zmiennych, nie do komend. No, podstawy amosa.
[#10] Re: Kilka pytań z obsługi modułów przez AMCAF

@cholok, post #9

Dzięki za wytłumaczenie.

Znajdziesz mi jeszcze pomysł, jak wyczytać koniec odtwarzania danego modułu, tak by program wiedział że ma odtwarzać następny?
[#11] Re: Kilka pytań z obsługi modułów przez AMCAF

@cholok, post #9

Nie do końca bo są zmienne takie jak np. Timer gdzie możesz ustalić na początku jej wartość. Nie zawsze to tak działa jak piszesz.

Ostatnia aktualizacja: 10.07.2022 11:31:35 przez jimiche
[#12] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #11

Odniosłem się tylko do tego konkretnego przypadku. Timer jest zmienną zarezerwowaną przez AMOS i działa jak każda zmienna: można ustalać jej wartość i można przypisywać jej wartość. To oczywiste. Pt CPattern jest funkcją. To są czyste podstawy: komenda/instrukcja, funkcje, zmienne. W manualu zawsze jest napisane co jest czym.
[#13] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #10

Sam player nie ma takiej funkcji, więc musiałbyś dość regularnie odczytywać pozycję modułu i patternu. Wcześniej trzeba przeanalizować strukturę modułu i odczytać jego długość. Trzeba więc znać format modułu (ogólnie dostępny) i polubić funkcje typu Peek.
[#14] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #10

Vumeter, trochę bokiem, bokiem. :P Ale może wystarczy.

Ostatnia aktualizacja: 10.07.2022 12:23:10 przez Stoopi
[#15] Re: Kilka pytań z obsługi modułów przez AMCAF

@Stoopi, post #14

Z przewijaniem poradziłem sobie.
POZYCJA=Pt Cpattern
If ... Then Pt Play 3,POZYCJA+1 : 'Przewijanie do przodu
If ... Then Pt Play 3,POZYCJA-1 : 'Przewijanie do tylu


Zacząłem walczyć z suwakiem od głośności. Póki co przemieszcza się i pogłaśnia/ przycisza, ale jeszcze muszę to usprawnić.

@cholok: PEEK to odczyt z banku pamięci, ale koniec banku pamięci to nie będzie koniec odgrywanego utworu przecież.

Ostatnia aktualizacja: 10.07.2022 15:20:27 przez tukinem
1
[#16] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #15

Cpattern zwraca nr patternu, nie pozycji. Pozycja nie musi być taka sama jak pattern. Przykładowo utwór może składać się z 4 patternów odgrywanych na 7 elementowej liście. Jak myślisz, że patterny są po kolei odgrywane w modułach, to się mylisz. Jest to możliwe, ale bardzo rzadkie.

Co się stanie jak pozycja+1 > max pozycja?

PEEK to odczyt z banku pamięci, ale koniec banku pamięci to nie będzie koniec odgrywanego utworu przecież.

Nikt tego nawet nie sugerował.
[#17] Re: Kilka pytań z obsługi modułów przez AMCAF

@cholok, post #16

nie Cpattern zwraca chyba jednak kolejny po sobie pattern a nie jaki numer paternu gra i raczej jestem tego pewny bo tak sobie robiłem synchra w grogon meets un amor.
[#18] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #15

nie napisałem ci tej funkcji w kontekscie przewijania. to była odpowiedz na inne pytanie.
[#19] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #17

No faktycznie. Zmyliła mnie funkcja pt cpos.
[#20] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #10

dobra chyba to pomoże
, i teraz napisano tam że długość (w patternach?) utworu jest zapisana pod offsetem 950...
więc robimy tak

Po załadowaniu do pamięci mod'a

_dlugosc_moda=peek(start(numer banku)+950)
...
Teraz jak to sprawdzam to podaję tą wartość zawszę większą o 1 bo te patterny są liczone od 0 nie od 1. Ale puki co to chyba działa. Więc najlepiej jeszcze zrobić if pt cpattern>_dlugosc_moda-1 then stop. Tylko wtedy chyba nie odegra ostatniego patternu. Trzeba by jeszcze sprawdzić przy tym ostatnim patternie ostatni Pt Cpos<63

Ostatnia aktualizacja: 10.07.2022 17:11:05 przez jimiche

Ostatnia aktualizacja: 10.07.2022 17:13:55 przez jimiche
[#21] Re: Kilka pytań z obsługi modułów przez AMCAF

@cholok, post #16

Pisze w manualu, że Pt Cpattern zwraca pozycję utworu. Skoro mi działa, to w czym problem?
PT CPATTERN
function: return the current song position
songpos=Pt Cpattern
This function returns the current pattern/song position.
This can be used to restart a song at a given position when you stopped the music with Pt Stop.

PT CPOS
function: return the current pattern line
row=Pt Cpos
This function returns the current 'row' of the songs current pattern. The returned value is a number between 0 and 63.


Natomiast nic nie pisze o ilości patternów, znaku końca utworu, długości utworu itd...
[#22] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #20

Zaraz sprawdzę to, ale z tego co zauważyłem, to niektóre moduły mi bardzo dziwnie grają. Nie ma ich dużo, no ale już wyłapałem 2 sztuki Ten odtwarzacz z AMCAFa nie jest tak dobry, jak Hippoplayer, ale i tak jest lepszy niż ten z AMOSa.
[#23] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #21

Może zainteresuj się doom Extension.

Ostatnia aktualizacja: 10.07.2022 18:00:54 przez jimiche
[#24] Re: Kilka pytań z obsługi modułów przez AMCAF

@jimiche, post #23

Sprawdziłem na Amidze, bo tam piszę ten programik i wychodzi na to, że warunkiem przejścia do następnego utworu jest sprawdzenie tego, co napisałeś: Peek (Start(BANK)+950)-1 oraz Pt Cpos=63, aby ostatni pattern został odegrany do końca. U mnie to wygląda tak:
Trap DLUGOSC=Peek(Start(3)+950) 'Tarp jest po to, aby nie wywalal glupot, gdy nie jest zaladowany zaden modul
POZYCJA_MUZYKI=Pt Cpattern
If DLUGOSC>0 and POZYCJA_MUZYKI=DLUGOSC-1 and Pt Cpos=63 : 'AKCJA' : End If


W takiej formie mi to działa na jednym króciutkim module z Farmigi, który ma 2 patterny. Odgrywa go do końca.

PS. Skąd pobrać ten dodatek? Bo tylko informacje o tym dodatku znalazłem.

Ostatnia aktualizacja: 10.07.2022 18:36:36 przez tukinem
1
[#25] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #24

Jendak nie zawsze działa ten mój kod. Są moduły, gdzie jest w ostatnim patternie przeskok do tyłu w połowie patternu. Wtedy on nie jest odgrywany do końca i program nie wie, że to już koniec. Nie da się chyba wyczytać, jak odtwarzacz napotyka przeskok do innego patternu.
[#26] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #25

Wiesz jak długie (czasowo) są konkretne utwory, więc możesz użyć timera żeby sprawdzać czy moduł się już skończył. Trochę to toporna metoda, ale powinna zadziałać.
[#27] Re: Kilka pytań z obsługi modułów przez AMCAF

@mastaszek, post #26

"Czasowo" nie wiem jak długie są. Wiem ile mają patternów. Mam jeszcze taki pomysł, żeby program odliczał patterny do końca. Jeśli dojdzie do 0, to wtedy przeskok do następnego pliku. Np. mając Pt Pos=0, czyli gra pierwsza nuta w danym patternie, to zostaje odliczony pierwszy pattern. Nie mogę dać Pt Pos=63, bo w wielu modułach są przeskoki w połowie patternu i odtwarzanie nie dojedzie do danego momentu.

Po drugie timera nie użyję, bo użyłem go już do ustawienia klatek w programie:
If Timer>=3
   Timer=0 : Bob Update : Wait Vbl
End If
[#28] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #25

Nie da się prosto określić czy muzyka w module została odegrana do końca. Teoretycznie to jest przejście całej listy kolejności odtwarzania patternów w module lub zatrzymanie odtwarzania komendą F00. Ale niestety w wielu modułach są pozostawione puste patterny, albo komendy E6x lub EEx co wstrzymuje odtwarzanie, ale prymitywne playery nie będą wiedzieć, że odtwarzana jest cisza. Za pomocą komendy E6x da się stworzyć nieskończoną pętlę co też się zdarza.
W modułach z gier często spotykane są subsongi czyli niezależne zapętlenia listy odtwarzania patternów przy użyciu komendy Bxx. I to też sprawę dodatkowo komplikuje, więc jeśli chodzi o uniwersalną metodę która skutecznie określi kiedy kończy się dowolny moduł to raczej nie jest takie proste.
[#29] Re: Kilka pytań z obsługi modułów przez AMCAF

@nogorg, post #28

W modułach z gier często spotykane są subsongi czyli niezależne zapętlenia listy odtwarzania patternów przy użyciu komendy Bxx. I to też sprawę dodatkowo komplikuje, więc jeśli chodzi o uniwersalną metodę która skutecznie określi kiedy kończy się dowolny moduł to raczej nie jest takie proste.


Chyba nawet wiem, którą grę miałeś na myśli. W Pinball Dreams to zjawisko jest zastosowane. Dlatego chyba jedynie będzie zliczanie ilości aktywnych patternów i odliczanie programowo.

Jutro wrzucę ten program na tyle, ile zdołałem napisać. Chciałem teraz, jednak mam problem z czcionką w programie. Z ADF nie mogę wczytać pomimo skopiowanie pliku .font i jego katalogu. Muszą być w systemie, więc póki co nie wrzucam go.
[#30] Re: Kilka pytań z obsługi modułów przez AMCAF

@tukinem, post #29

W sumie ok. Wrzucam go, a jeśli ktoś będzie chciał przetestować, to musi sobie z tego ADFa skopiować plik .font do SYS:Fonts. Na zielonym wyświetlaczu po prawej na dole jest wyświetlany nr aktualnego utworu. Jeśli chcemy go zamienić na inny to ładujemy kolejny plik. Jeśli chcemy następny załadować, to trzeba przejść do następnego tracka. Oto screen z programu:

Na dole jest taki pasek, bo wyszedł koniec Rainbowa. To skutek tego, że grafika i program powstały na prawdziwej Amidze i dostosowałem długość Rainbowa do wyświetlania na monitorze z Amigi

Aha. Najważniejsze. ADF nie jest bootowalny!

Ostatnia aktualizacja: 10.07.2022 21:09:31 przez tukinem
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem