Forum: Mikrocontroller und Digitale Elektronik neue melodie für chang wavetable tiny45


von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

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?

von jack (Gast)


Lesenswert?

>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 ;-)

von Axel R. (Gast)


Lesenswert?

>
> 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.

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

Für den, der jetzt keine Lust hat, sich MIDIOX usw. zu installieren:
der Output im Anhang.

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

un das Ergebins als asm.

An "EoS" am Ende denken, muss ich noch im xls einbauen (keine Lust mehr 
.)) )

von concept (Gast)


Lesenswert?

musik audio dds

Wavetable Melody Generator / Synthesizer

http://elm-chan.org/works/mxb/report.html

von Sonnenschein (Gast)


Lesenswert?

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..

von nixwisser (Gast)


Lesenswert?

Poste doch mal bitte eine WAV.Datei, wie sich das anhört.. (oder auch 
mehrere), mich interessiert das.

von wahrsager (Gast)


Lesenswert?

@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.

von Sonnenschein (Gast)


Lesenswert?

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.

von micha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.