Die Weihnachtszeit ist vorüber und die Melodie klingel vom Mr.Chang hat sich als sehr brauchbar erwiesen. Klingt tatsächlich wie eine kleine Spieluhr - sehr schmuck :)) die mitgelieferten Melodien (mel.txt, mel1.txt, mel2.txt) habe ich tatsächlich in asm umgewandelt bekommen - kuzum - funktioniert, wie erwartet. Wie könnten die txt Dateien jedoch erstellt werden? Für Elise usw. geht einem ja nach einer gewissen Zeit schon auf den Geist... Hat jemand eine Ahnung, ob man das direkt aus eine MIDI Datei herausbekommt. Sicher hat Mr.Chang auch ein perl Script verwendet. Leider ist es nicht dabei:( Ich habe jetzt mal aus dem Netz einige MIDI Editoren gezogen, aber keines der Programme erlaubt ein entsprechenden Export, von Notenblättern mal abgesehen. Wenn da einer einen Tipp für mich hätte, würde ich mich jedenfalls freuen. SuFu hatte ich benutzt, google auch, danke. gnmidi habe ich probiert http://www.gnmidi.com/handbook/english/midi2txt.htm die Ausgabe müsste denn allerdings nochmal nachbearbeitet werden, denn Noteoff gibt es ja nicht und Attack ist fest eingestellt. Viele Grüße Axelr. EDIT wenn man die Noteneinschwingerei ähnlich der Envelopekurve am Ende der Note und nicht mit einem 1K Sample machen würde, könnte man evtl verschiedene Sustainbereiche und somit mehrere Instrumente generieren... (Nur so 'ne Idee, was haltet ihr davon?
>wenn man die Noteneinschwingerei ähnlich der Envelopekurve am Ende der >Note und nicht mit einem 1K Sample machen würde, könnte man evtl >verschiedene Sustainbereiche und somit mehrere Instrumente generieren... >(Nur so 'ne Idee, was haltet ihr davon? Na ja, für den Attack-Abschnitt ist ja nicht nur die Hüllkurve, sondern auch die darin enthaltenen Frequenzen charakteristisch. Also das Einschwingsample ist schon wichtig; nur die Hüllkurve zu manipulieren, würde wahrscheinlich ein bißchen seltsam klingen. Ich hab mal mit Synthesizern gearbeitet, wenn man den Attack abschneidet, erkennt man selbst gut gesampelte Instrumente nicht mehr. Der gute Chan hat schon gewußt, warum er sich die Spieluhr ausgesucht hat: Hier kann man eben mit einfachen Mitteln dem Original schon sehr nahe kommen. Was die Erstellung der Melodiedaten betrifft: Ist es nicht am einfachsten, die Tonfolge von Hand einzugeben? Die Zeiten(Zahlenfolge) kann man ja mit einem kleinen Programm (Delpi?) erzeugen. Wie werden eigentlich Pausen erzeugt? Bei dem Stück "Für Elise" kommt ja alle 30 Ticks ein Ton. >Die Weihnachtszeit ist vorüber und die Melodie klingel vom Mr.Chang Du machst ja aus Mr. Chan einen Chinesen ;-)
> > Du machst ja aus Mr. Chan einen Chinesen ;-) > Auweia, stimmt!! sry:) ich habe mal testweise den Attack-Teil weggelassen und muss Dir recht geben, leider...
1 | ;--------------------------------------------------------------------; |
2 | ; Note ON |
3 | ; |
4 | ;Call: AL[6:0] = key number |
5 | |
6 | note_on: |
7 | pushw Z |
8 | |
9 | mov ZL, AL |
10 | lsl ZL |
11 | clr ZH |
12 | addiw Z, tbl_pitch*2 |
13 | lpmw A, Z+ |
14 | |
15 | lds YL, NoteIdx |
16 | addi YL, 9 |
17 | cpi YL, 9*N_NOTE |
18 | brcs PC+2 |
19 | clr YL |
20 | sts NoteIdx, YL |
21 | clr YH |
22 | addiw Y, Notes |
23 | |
24 | ;ldiw B, wt_attack*2 |
25 | ldiw B, wt_loop*2 |
26 | cli |
27 | stdw Y+ns_freq, A |
28 | stdw Y+ns_rptr+1, B |
29 | sei |
30 | stdi Y+ns_lvl, 255 |
31 | std Y+ns_wrap, AL |
32 | std Y+ns_loop, _0 |
33 | std Y+ns_lp, _0 |
34 | |
35 | popw Z |
36 | ret |
37 | |
38 | |
39 | ;--------------------------------------------------------------------; |
nun macht der Attack-Teil leider nur einen Bruchteil der Spielzeit aus und schluckt 1K Flash. Mein Ansinnen war es, 2 verschiedene Instrumente einzubauen. Die Spieluhr für die Meoldie und einen weich ein- und ausklingendes Instrument für die Begleitung. >Wie werden eigentlich Pausen erzeugt? >Bei dem Stück "Für Elise" kommt ja alle 30 Ticks ein Ton. TmrS wird in der Hauptschleife mit dem aktuell eingelesenen Timetick verglichen, wenn augenblicklich keine Note zu spielen ist und die alte ausgeklungen ist, wird eben keine gespielt.
1 | start_play_snd: |
2 | ldiw Z, score*2 |
3 | play_snd: |
4 | cli |
5 | clrw _Tmr |
6 | clr _TmrS |
7 | sei |
8 | |
9 | pl_next: |
10 | lpmw B, Z+ ;timeticks laden, R18:R19<-LOW:HI |
11 | ;sbrc DL,2 |
12 | ;ser BL |
13 | rcall drv_decay |
14 | cli |
15 | cpw _Tmr, B ;timeticks vergleichen |
16 | sei |
17 | brcs PC-5 |
18 | pl_note: |
19 | lpm CL, Z+ ;note laden |
20 | cpi CL, EoS |
21 | breq sprung_rst |
22 | mov AL, CL |
23 | rcall note_on |
24 | andi CL, en |
25 | breq pl_note |
26 | rjmp pl_next |
27 | |
28 | sprung_rst: |
29 | rjmp reset |
ist schon jemandem eingefallen, was
1 | sbrc DL,2 |
2 | ser BL |
eigentlich macht? Register DL wird nirgentwo verwendet. Ich habs mal auskommentiert - keine Änderung im Ergebnis.
nun ist es mir gelungen, mittels MidiOx und MIDIYoke http://www.midiox.com/moxdown.htm http://www.midiox.com/zip/MidiYokeSetup.msi Midi-Dateien in asm zu wandeln. kllingt zwar etwas komisch, da das Event Not-Off nicht existiert, klingt aber schonmal ganz gut. ich habe exemplarisch mal den Song "Africa" von Toto ausgewählt und ein (leider etwas großes) Stück daraus herauskopiert. Sieht prinzipiell so aus:
1 | TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT |
2 | 1375970 2 1 147 73 0 4 C# 4 Note Off |
3 | 1376115 2 1 147 76 0 4 E 4 Note Off |
4 | 1376900 2 1 144 56 0 1 G# 2 Note Off |
5 | 1376908 2 1 144 61 0 1 C# 3 Note Off |
6 | 1376915 2 1 144 64 0 1 E 3 Note Off |
7 | 1376963 2 1 144 66 104 1 F# 3 Note On |
8 | 1376963 2 1 144 69 112 1 A 3 Note On |
9 | 1376963 2 1 144 57 104 1 A 2 Note On |
10 | 1376963 2 1 144 61 100 1 C# 3 Note On |
11 | 1377226 2 1 147 81 95 4 A 4 Note On |
12 | 1377458 2 1 147 81 0 4 A 4 Note Off |
13 | 1377573 2 1 147 81 90 4 A 4 Note On |
14 | 1377779 2 1 147 81 0 4 A 4 Note Off |
15 | 1377871 2 1 147 81 67 4 A 4 Note On |
16 | 1377976 2 1 147 81 0 4 A 4 Note Off |
17 | 1378063 2 1 147 81 86 4 A 4 Note On |
18 | 1378222 2 1 144 62 104 1 D 3 Note On |
19 | 1378230 2 1 144 61 0 1 C# 3 Note Off |
20 | 1378441 2 1 147 81 0 4 A 4 Note Off |
21 | 1378501 2 1 147 81 82 4 A 4 Note On |
22 | 1378753 2 1 147 81 0 4 A 4 Note Off |
23 | 1378826 2 1 147 81 86 4 A 4 Note On |
24 | 1379053 2 1 147 81 0 4 A 4 Note Off |
25 | 1379138 2 1 147 81 90 4 A 4 Note On |
26 | 1379390 2 1 147 81 0 4 A 4 Note Off |
27 | 1379476 2 1 144 62 0 1 D 3 Note Off |
28 | 1379476 2 1 147 81 105 4 A 4 Note On |
29 | 1379491 2 1 144 66 0 1 F# 3 Note Off |
im MIDIOX habe ich nur den Kanal 1 und 4 gefiltert und dann Excel bemüht, da ich meine Delphi CD nicht mehr lesen kann und eine Installation leider fehlgeschlagen ist :(( aus dem Mitschnitt wurde dann (auszugsweise)
1 | .db 1, 0, Fis3, A3, A2, Cis3|en, 34, 0, A4|en, 77, 0, A4|en, 115, 0, A4|en, 139 |
2 | .db 0, A4|en, 158, 0, D3|en, 193, 0, A4|en, 234, 0, A4|en, 17, 1, A4|en, 59, 1 |
3 | .db A4|en, 63, 1, E3, Cis3|en, 177, 1, Gis4|en, 201, 1, Gis4|en, 222, 1, B2, Gis2|en, 223 |
4 | .db 1, Gis3|en, 25, 2, A3|en, 85, 2, Gis3|en, 125, 2, Cis3, A2|en, 126, 2, A3|en, 126 |
5 | .db 2, Fis3|en, 162, 2, A4|en, 164, 2, Cis3, E3|en, 203, 2, A4|en, 203, 2, E3|en, 204 |
6 | .db 2, Cis3|en, 221, 2, A4|en, 223, 2, Cis3|en, 223, 2, E3|en, 241, 2, Cis3, A4|en, 242 |
7 | .db 2, E3|en, 2, 3, Cis3|en, 3, 3, E3|en, 5, 3, A4|en, 23, 3, D3|en, 24, 3 |
8 | .db Fis3|en, 27, 3, A4|en, 30, 3, D3|en, 44, 3, D3|en, 47, 3, Fis3|en, 48, 3, A4|en |
9 | .db 86, 3, Fis3, D3, A4|en, 124, 3, D3|en, 124, 3, Fis3|en, 126, 3, A4|en, 162, 3 |
10 | .db Cis3|en, 163, 3, A4|en, 164, 3, E3|en, 187, 3, E3|en, 188, 3, Cis3|en, 241, 3, E3|en |
11 | .db 242, 3, Cis3|en, 245, 3, A4|en, 3, 4, Cis3|en, 6, 4, E3|en, 9, 4, A4|en, 25 |
12 | .db 4, B2, E3|en, 29, 4, Gis4|en, 63, 4, E3|en, 66, 4, B2|en, 80, 4, Gis4|en, 92 |
13 | .db 4, B2, Gis2|en, 93, 4, Gis3|en, 151, 4, A3|en, 211, 4, Gis3|en, 253, 4, Fis3, A3|en |
14 | .db 254, 4, A2|en, 254, 4, Cis3|en, 31, 5, E3|en, 33, 5, A4, Cis3|en, 72, 5, A4|en |
Am Ende muss dann noch 255,5,EoS eingetragen werden. Die gesamte Prozedur ist etwas aufwändig und im Excelblatt 8siehe Anhang8 im VBA Modul1 in der Sub midi2asm zusehen. erst wird die Textdatei (bei mir Africa_1_4_1.txt) eingelesen und die NoteOff ereignisse entfernt. dann werden die Noten+Oktave "vereint". gleiche Zeiten suchen und alle Noten in eine Reihe schreiben. nicht mehr benötigte zeilen löschen Zeit aufarbeiten (8ms Timticks) Breich zum markieren bestimmen und bereich markieren (Zeit+Noten) Bereich in neues Tabellenblatt kopieren und den Bereich dann im Neuen Blatt als Textdatei exportieren. Nun in der erstellten textdatei alle kommas in Leerzeichen wandeln und doppelte Leerzeichen am Ende der textdatei eintfernen. Zum Schluss das Perl Script drüberjagen lassen...
Für den, der jetzt keine Lust hat, sich MIDIOX usw. zu installieren: der Output im Anhang.
un das Ergebins als asm. An "EoS" am Ende denken, muss ich noch im xls einbauen (keine Lust mehr .)) )
Hallo Axel, ich habe hier im Forum schon einige Threads zu Chans Programm gefunden, aber eine Frage ist noch offen (keine Ahnung von ASM): Wie werden die Noten auf Kanäle verteilt? Also in welchen Register kommen z.B. diese Werte? .db 1, 0, Fis3, A3, A2, Cis3|en Ich versuche gerade, das Ganze in C nachzumachen..
Poste doch mal bitte eine WAV.Datei, wie sich das anhört.. (oder auch mehrere), mich interessiert das.
@Axel Wie hat er das gemacht? wahrscheinlich einfach das Notenblatt hergenommen. "Für Elise" ist einfach, weil sich leicht alle Notenlängen und -Höhen normieren lassen.
Also ich hatte gedacht, dass die Noten auf noch freie Kanäle verteilt werden, aber: "Because number of channles is small, when a number of notes are on at a time, old notes are overwritten and canceled by new one." Einen Mitschnitt gibt es auf der o.g. Site.
Hi , Axel Rühl (axelr) ! Könntest du etwas genauer erklären, wie du aus MIDI-datei die codes für melody.asm erstellt hast? Ich komme nicht mal MidiOx zurecht...:(
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.