MSU-1

Das sd2snes Support Forum

Moderator: ikari_01

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 17. August 2012, 19:01

Mal zwei doofe Fragen:

1) Kann man den/die MSU-1 auch dazu nutzen, nur High-Quality-Musik abzuspielen? Kann ich bald Wendy Koopa zu "Girls just wanna have fun" killen?
2) Wäre es möglich, z. B. nur auf der oberen Bildschirmhälfte ein Videoablaufen zu lassen, während die untere Hälfte "klassisch" mit Tiles und Sprites funktioniert? Ich habe da eine sehr unkonventionelle Idee...
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

Ocer R.
Foren-Fossil
Foren-Fossil
Beiträge: 2592
Registriert: 30. Dezember 2006, 18:00
+Positive Tradingpoints+: 166 von 166
Wohnort: Thüringen

Re: msu (Erklärung)

Beitrag von Ocer R. » 17. August 2012, 20:36

Sehr schön. Vielen Dank!

Benutzeravatar
wrampi
Mr SNES
Mr SNES
Beiträge: 1821
Registriert: 11. Januar 2009, 15:32
+Positive Tradingpoints+: 11 von 11
Wohnort: Lemförde

Re: msu (Erklärung)

Beitrag von wrampi » 19. August 2012, 02:00

@lytron
zu 1
im prinzip ja. nur du mußt dann im rom des spiels den soundchip hacken, so das er in den moment eine msu datei abspielt.
zu2
nein, das geht nicht. so hab ich das verstanden.
Tester vom SD2SNES
SD2SNES blog hier : http://sd2snes.de/blog/

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 19. August 2012, 07:42

Dannke für die Info, wrampi!

Hm. Das macht die Einsatzmöglichkeiten für die MSU-1 auch eher begrenzt. Damit kann man dann eben "nur" FMVs und nicht gesamplete Musik abspielen. Was ansich selbstverständlich schon Features sind, für die sich die SNES-Entwickler vor zwanzig Jahren die Beine ausgerissen hätten.

Apropos: Wahrscheinlich gibt es dann bald einen MSU-1-Hack von Tales of Phantasia? Da gab es doch einige Lieder, die aufgrund der Kompression total vergurkt wurden, oder? :wink:
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

Benutzeravatar
wrampi
Mr SNES
Mr SNES
Beiträge: 1821
Registriert: 11. Januar 2009, 15:32
+Positive Tradingpoints+: 11 von 11
Wohnort: Lemförde

Re: msu (Erklärung)

Beitrag von wrampi » 10. September 2012, 15:40

hab was hochgeladen. einmal bei rapidshare und es wird grade auch in der snes cloud hochgeladen. das war ein versprechen an fieserwolf, das ich das mache. vileicht hilft es ja ihn zu übereden auch was auf snes zumachen an musik.

https://rapidshare.com/files/1058253636 ... f-NETT.rar

ich mache die tage noch mehr, ob ihr es mögt oder nicht. :ugly:
Tester vom SD2SNES
SD2SNES blog hier : http://sd2snes.de/blog/

snoer
SNES-Programmer
SNES-Programmer
Beiträge: 249
Registriert: 27. Januar 2013, 13:10
+Positive Tradingpoints+: 5 von 5

Re: msu (Erklärung)

Beitrag von snoer » 24. März 2013, 22:16

http://forum.snesfreaks.com/viewtopic.p ... 41#p215741

hier ist luigibloods flashback msu hack

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 25. März 2013, 10:35

Hat hier jemand einen möglichst simplen MSU-(Sound)-Player-Sourcecode herumliegen? Ich würde mich gern mal damit beschäftigen, besonders mit dem Audiozeug (wie man Videos abspielen kann, ist gerade für mich eher zweitrangig), und es wäre leichter, wenn man bestehendes untersuchen kann, statt sich mit byuus Dev-Anleitung da von vorne reinzufrimeln. Man braucht ja das Rad nicht zweimal erfinden. ;)

ikari_01, hast du da noch was rumfliegen?
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

snoer
SNES-Programmer
SNES-Programmer
Beiträge: 249
Registriert: 27. Januar 2013, 13:10
+Positive Tradingpoints+: 5 von 5

Re: msu (Erklärung)

Beitrag von snoer » 25. März 2013, 12:23

hier ist der player von luigiblood
http://www.mediafire.com/download.php?qzsvikjlldlklwp
edit: ist aber ohne quellcode soweit ich das sehe.

hab den link hierher.
http://www.nesforum.fr/showthread.php?tid=166&pid=1547
(da gibts auch ein screenshot)

Benutzeravatar
ChronoMoogle
snesfreaks.com-Team
snesfreaks.com-Team
Beiträge: 9895
Registriert: 26. Februar 2007, 14:56
+Positive Tradingpoints+: 98 von 98
Wohnort: Nippon
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von ChronoMoogle » 25. März 2013, 13:22

lytron hat geschrieben:Ich würde mich gern mal damit beschäftigen
Ihatovo Monogatari-Orchestration Hack? Ihatovo Monogatari-Orchestration Hack.
Bild
| Mein YT Channel | Mein Twitter | Ich suche | Ich verkaufe | Foren SuFu |
...weil Terranigma einfach das Größte ist!

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 25. März 2013, 13:34

ChronoMoogle hat geschrieben:
lytron hat geschrieben:Ich würde mich gern mal damit beschäftigen
Ihatovo Monogatari-Orchestration Hack? Ihatovo Monogatari-Orchestration Hack.
:oops:
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

Benutzeravatar
Ramsis
SNES-Freak
SNES-Freak
Beiträge: 538
Registriert: 29. Dezember 2011, 15:33
+Positive Tradingpoints+: 3 von 3
Wohnort: Löwenhöhle :3
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von Ramsis » 25. März 2013, 15:47

lytron hat geschrieben:Hat hier jemand einen möglichst simplen MSU-(Sound)-Player-Sourcecode herumliegen? (...)

ikari_01, hast du da noch was rumfliegen?
Ich bin zwar nicht ikari_01, aber ich hab da gewissermaßen noch was rumfliegen. :D

Der Code selber ist simpel und lässt sich im Prinzip direkt in eins der bekannten Beispiel-Homebrew-ROMs einpflanzen. Ich hab vor einiger Zeit testweise nevikstis Starter-Kit benutzt, man kann aber auch ein beliebiges anderes nehmen.

Wichtig ist, dass man dem SPC700 quasi miteilt, dass er Passthrough aktiviert, bevor PCM wiedergegeben werden kann. Diese Info habe ich von ikari selbst (hier). Irgendwie klappte das Ganze bei meinem ersten Test trotzdem nicht. Ich hab dann irgendwo gelesen, dass man zusätzlich noch die Echo Volume auf beiden Kanälen deaktivieren muss - weiß leider nicht mehr, wo. (Finde auch gerade den Dev-Guide nicht mehr online, den ich benutzt habe - es war nicht der von byuu.)

Hier also der relevante Code-Teil (!), einzusetzen in eine Main-Sektion. Der SPC-Upload-Code stammt von ikari/blargg/necronomfive (?), der Maschinen-Code für den SPC700 von ikari (glaube ich). Der Starterkit kann am besten mit WLA DX kompiliert werden. Die WAV-Dateien müssen natürlich erst mit einem Tool (hieß wav2msu und war auch von ikari, IIRC) konvertiert und entsprechend benannt werden (track-01.pcm oder so).

Wenn's denn mal läuft - und das tat es letztlich - macht das Ganze durchaus Laune. :D

Code: Alles auswählen

; *************************** DEFINES

; status bits

	.DEFINE XY_8BIT			$10
	.DEFINE A_8BIT			$20



; SPC700 I/O registers

	.equ APUIO0			$2140
	.equ APUIO1			$2141
	.equ APUIO2			$2142
	.equ APUIO3			$2143



; MSU1 registers

	.define MSU_STATUS		$2000
	.define MSU_READ		$2001
	.define MSU_ID			$2002
	.define MSU_SEEK		$2000
	.define MSU_TRACK		$2004
	.define MSU_VOLUME		$2006
	.define MSU_CONTROL		$2007



; *************************** MAIN CODE

CheckForMSU:
	lda MSU_ID
	cmp #'S'
	beq +
	brl NoMSU
+	lda MSU_ID+1
	cmp #'-'
	bne NoMSU
	lda MSU_ID+2
	cmp #'M'
	bne NoMSU
	lda MSU_ID+3
	cmp #'S'
	bne NoMSU
	lda MSU_ID+4
	cmp #'U'
	bne NoMSU
	lda MSU_ID+5
	cmp #'1'
	bne NoMSU



MSUFound:
; SPC700 pass-through enabling needed, source: http://board.byuu.org/viewtopic.php?p=65217#p65217

	php
	sep #A_8BIT
	rep #XY_8BIT

	sei					; Disable NMI & IRQ
	stz $4200

; ---- Begin upload

	ldy #$0002
	jsr spc_begin_upload

; ---- Upload SPC700 pass-through code

	ldx #$0000
-
	lda.w spccode,x
	jsr spc_upload_byte
	inx
	cpy #41					; size of spc code
	bne -

; ---- Execute loader

	ldy #$0002
	jsr spc_execute

	lda #$81				; VBlank NMI + Auto Joypad Read
	sta $4200				; re-enable VBlank NMI
	cli
	plp

	SetCursorPos 0, 0
	PrintString "Playing a PCM tune :-)\n"
	jsr PlayTrack
;	lda MSU_STATUS
;	sta temp
;	PrintHexNum temp
	bra ForeverLoader



NoMSU:
	SetCursorPos 0, 0
	PrintString "No MSU1 media enhancement hardware found!"
	bra ForeverLoader



PlayTrack:
;	ldx #$0000
;	stx MSU_SEEK				; zero out data port address
;	stx MSU_SEEK+2

;-	bit MSU_STATUS				; wait for the data port busy bit to clear
;	bmi -

	lda #$00
	sta MSU_VOLUME
	ldx #$0001
	stx MSU_TRACK
-	bit MSU_STATUS	; Wait for the Audio Busy bit to clear.
	bvs -
	lda #$01	; Set audio state to play, no repeat.
	sta MSU_CONTROL
	lda #$00
-	inc a
	wai
	sta MSU_VOLUME
	cmp #$FF
	bne -
	; The MSU1 will now start playing.
	; Use lda #$03 to play a song repeatedly.
rts



ForeverLoader:
	lda #$81
	sta $4200				; turn on NMI

ForeverLoop:
	wai					; wait for next frame
	bra ForeverLoop



; ************************ SPC700 pass-through *************************

spc_begin_upload:
	sty APUIO2				; Set address

	ldy #$BBAA				; Wait for SPC
-
	cpy APUIO0
	bne -

	lda #$CC				; Send acknowledgement
	sta APUIO1
	sta APUIO0

-       					; Wait for acknowledgement
	cmp APUIO0
	bne -

	ldy #0					; Initialize index
rts



spc_upload_byte:
	sta APUIO1

	tya					; Signal it's ready
	sta APUIO0
-     						; Wait for acknowledgement
	cmp APUIO0
	bne -

	iny

rts



spc_execute:
	sty APUIO2

	stz APUIO1

	lda APUIO0
	inc a
	inc a
	sta APUIO0

; Wait for acknowledgement
-
	cmp APUIO0
	bne -

rts



spccode:
	.byt $e8, $6c		; - MOV A, #$6c ; FLG register
	.byt $c4, $f2		; MOV $f2, A
	.byt $e8, $20		; MOV A, #$20   ; unmute, disable echo
	.byt $c4, $f3		; MOV $f3, A
	.byt $78, $20, $f3	; CMP $f3, #$20
	.byt $d0, $f3		; BNE -

	.byt $e8, $2c		; - MOV A, #$2c ; Echo volume left
	.byt $c4, $f2		; MOV $f2, A
	.byt $e8, $00		; MOV A, #$00   ; silent
	.byt $c4, $f3		; MOV $f3, A
	.byt $78, $00, $f3	; CMP $f3, #$00
	.byt $d0, $f3		; BNE -

	.byt $e8, $3c		; - MOV A, #$3c ; Echo volume right
	.byt $c4, $f2		; MOV $f2, A
	.byt $e8, $00		; MOV A, #$00   ; silent
	.byt $c4, $f3		; MOV $f3, A
	.byt $78, $00, $f3	; CMP $f3, #$00
	.byt $d0, $f3		; BNE -

	.byt $2f, $fe		; - BRA -

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 25. März 2013, 15:53

Öhm, UI! O_O

Hallöle Ramsis,

ich hatte nicht mit dir gerechnet, das ist alles! ;)

Danke dir für den Code, ich werde mich da mal reinfuchsen und dann nochmal ein Statement zu geben. Bitte vergib, wenn das ein bisschen brauchen wird. :D
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

d4s
Moderator
Moderator
Beiträge: 345
Registriert: 13. Juni 2006, 16:11
+Positive Tradingpoints+: 1 von 1
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von d4s » 25. März 2013, 21:47

lytron hat geschrieben: 2) Wäre es möglich, z. B. nur auf der oberen Bildschirmhälfte ein Videoablaufen zu lassen, während die untere Hälfte "klassisch" mit Tiles und Sprites funktioniert? Ich habe da eine sehr unkonventionelle Idee...
Das ist selbstverständlich möglich.
Bevor du hier aber auf die falsche Fährte kommst:
Das MSU1 bietet keinerlei Spezialfeatures, die dich beim Abspielen von Videos unterstützen oder es gar automatisieren.
Alles, was das MSU1 bereitstellt, sind eine Menge Speicher und Audio-Tracks.
Den Videoplayer und alles, was dazu gehört, musst du selbst schreiben, wenn du nicht gerade die Dünnbrettbohrervariante wählst und den Player aus Ikaris Videodemo unverändert übernimmst, so wie das der ein oder andere ohne Programmierkenntnis bereits getan hat.
In letzterem Fall kannst du das von dir genannte natürlich knicken.

Problematisch ist, dass beim SNES weder die Größe des VRAM noch die Bandbreite dorthin ausreichen, um bei nativer Auflösung Vollbildvideo mit 256 Farben bei akzeptablen Framerates zu ermöglichen.

Die beiden vorhandenen Player gehen daher Kompromisse ein:
Ikaris Player zeigt das Video rundherum mit dicken schwarzen Balken.
Mein Player zeigt das Video von einem schwarzen Balken oben abgesehen in Vollbild, ist aber auf 15 Farben pro 8x8 Tile begrenzt. Ausserdem führt der zugehörige Videokonverter ähnlich aussehende Tiles zusammen, um die benötigte Bandbreite zu begrenzen. Dies sind die Gründe für die "Blöckchenbildung", die szenenabhängig mal mehr, mal weniger auffällt.

Wenn du ernsthaft daran interessiert bist, was auf MSU1 zu machen, empfehle ich dir einen Blick in den Super Road Blaster Sourcecode (z.B. hier: https://github.com/DocSchoko/SNES-Super ... msu1.65816 ) zu werfen.
Im Gegensatz zu Codeschnipseln aus Tutorials hat der den Vorteil, bereits einige Zeit im praktischen Einsatz gereift und auf verschiedenen SNES-Varianten getestet worden zu sein.
Dort werden auch Eigenarten des sd2snes behandelt, die zu debuggen einige Mühe gekostet hat.

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: msu (Erklärung)

Beitrag von lytron » 26. März 2013, 06:44

Vielen lieben Dank euch! :)

Ich möchte mich in jedem Fall damit mal intensiv auseinandersetzen, deswegen bin ich für die bisherige Materialsammlung sehr dankbar. Aber bittet erwartet bei meinem bisherigen Arbeitstempo nicht allzubald Ergebnisse! ;)

Ich werde mich auf jeden Fall damit näher beschäftigen, danke! :)
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

MStar
SNES-Newbie
SNES-Newbie
Beiträge: 1
Registriert: 9. Oktober 2013, 01:48

MSU-1

Beitrag von MStar » 20. Oktober 2013, 16:31

Hi!

Ich versuche mich gerade mit dem Konvertieren von Videos für den MSU1 und das Chrono Trigger Intro bereitet mir ziemliche Kopfschmerzen. Ich bekomme es einfach nicht hin Bild und Ton synchron zu halten.
Zuvor habe ich mit dem Vandread Video geübt und dort keine Probleme gehabt.


Hier mal mein Vorgehen für das Vandread Video, für Chrono Trigger habe ich einfach die Dateinamen ausgetauscht:
versteckter Inhalt:
System: Windows XP
SD2SNES: v0.1.5
Video: JCD-Vandread-Overdrive_Remastered[XVID].avi
Tools: ImageMagick-6.8.7-0-Q8-x86-dll.exe und ffmpeg aus dem selben Paket
msu1conv.exe und msu1vid.sfc von ikari_01
wav2msu von Kawa


1. Audio extrahieren

Code: Alles auswählen

ffmpeg -i "JCD-Vandread-Overdrive_Remastered[XVID].avi" -vn "vandread.wav"

2. Wave in PCM konvertieren

Code: Alles auswählen

wav2msu "vandread.wav"

3. Image Sequenz erstellen

Code: Alles auswählen

ffmpeg -i "JCD-Vandread-Overdrive_Remastered[XVID].avi" -s 224x144 -f image2 -vcodec targa "img_seq\%08d.tga"

4. Farbtiefe der extrahierten Bilder verringern

Code: Alles auswählen

set sourcepath=img_seq\
set destpath=img_seq_c_red\
set filemask=*.tga

for %%f in ("%sourcepath%%filemask%") do (
  "D:\Programme\Videobearbeitung\ImageMagick-6.8.7-Q8\convert" "%sourcepath%%%~nxf" -dither FloydSteinberg -type Palette "%destpath%%%~nxf"
)

5. MSU Datei mit den vorher erstellten Bildern aufbauen (im img_seq_c_red Verzeichnis)

Code: Alles auswählen

msu1conv

6. Mit einem Hexeditor in der MSU Datei die Bytes [2] bis [4] auf die richtige Framerate anpassen (29.97 fps = 02 02 01).

Code: Alles auswählen

31 0F 02 02 01 00 00 00 ...

7. Dateinamen anpassen

Code: Alles auswählen

vandread.msu
vandread-0.pcm
vandread.sfc

Wenn ich mein SNES auf 60Hz stelle läuft das Video jetzt unter sd2snes problemlos und Bild sowie Ton sind von Anfang bis Ende synchron.


Nun zum Chrono Trigger Opening:
versteckter Inhalt:
Video: Chrono_Trigger_Intro.mp4 (Qualität: medium)


Hier kommt es bei Punkt 3 zu folgender Meldung:

Code: Alles auswählen

Seems stream 0 codec frame rate differs from container frame rate: 59.83 (29917/500) -> 59.75 (239/4)
Und tatsächlich wird eine Bildsequenz mit umgerechnet 60 fps erstellt, obwohl der eigentliche Videostream mit 29.97 Frames läuft.
Edit: Es sind keine ~60 fps sondern die ~30 Frames werden bei der Ausgabe einfach verdoppelt.

Dummerweise läuft das Video selbst dann noch zu langsam, wenn ich die Framerate erzwinge:

Code: Alles auswählen

ffmpeg -i "Chrono_Trigger_Intro.mp4" -s 224x144 -f image2 -r 29.97 -vcodec targa "img_seq\%08d.tga"
Das einzige was ich bisher machen konnte ist, die Framerate durch Probieren in ffmpeg so zu erzwingen, dass Bild und Ton einigermaßen synchron sind. In der MSU Datei stelle ich die Frames dann auf 29.97.
Aber das kanns ja nicht sein. Wo liegt mein Fehler? Ist die Videoquelle einfach Müll oder entgehen mir da wichtige Schritte die ich noch durchführen müsste?
Zuletzt geändert von MStar am 20. Oktober 2013, 18:48, insgesamt 1-mal geändert.

Antworten