mikrocontroller.net

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


Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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...
;--------------------------------------------------------------------;
; Note ON
;
;Call: AL[6:0] = key number

note_on:
  pushw  Z

  mov  ZL, AL
  lsl  ZL
  clr  ZH
  addiw  Z, tbl_pitch*2
  lpmw  A, Z+

  lds  YL, NoteIdx
  addi  YL, 9
  cpi  YL, 9*N_NOTE
  brcs  PC+2
  clr  YL
  sts  NoteIdx, YL
  clr  YH
  addiw  Y, Notes

  ;ldiw  B, wt_attack*2
  ldiw  B, wt_loop*2
  cli
  stdw  Y+ns_freq, A
  stdw  Y+ns_rptr+1, B
  sei
  stdi  Y+ns_lvl, 255
  std  Y+ns_wrap, AL
  std  Y+ns_loop, _0
  std  Y+ns_lp, _0

  popw  Z
  ret


;--------------------------------------------------------------------;


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.
start_play_snd:
  ldiw  Z, score*2
play_snd:
  cli
  clrw  _Tmr
  clr  _TmrS
  sei

pl_next:
  lpmw  B, Z+  ;timeticks laden, R18:R19<-LOW:HI
  ;sbrc  DL,2
  ;ser    BL
  rcall  drv_decay
  cli
  cpw  _Tmr, B    ;timeticks vergleichen
  sei
  brcs  PC-5
pl_note:
  lpm  CL, Z+    ;note laden
  cpi  CL, EoS
  breq  sprung_rst
  mov  AL, CL
   rcall  note_on
  andi  CL, en
  breq  pl_note
  rjmp  pl_next

sprung_rst:
rjmp  reset

ist schon jemandem eingefallen, was
 sbrc  DL,2
 ser    BL
eigentlich macht? Register DL wird nirgentwo verwendet. Ich habs mal 
auskommentiert - keine Änderung im Ergebnis.

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
TIMESTAMP IN PORT STATUS DATA1 DATA2 CHAN NOTE EVENT               
   1375970  2   1    147    73     0    4  C# 4 Note Off              
   1376115  2   1    147    76     0    4  E  4 Note Off              
   1376900  2   1    144    56     0    1  G# 2 Note Off              
   1376908  2   1    144    61     0    1  C# 3 Note Off              
   1376915  2   1    144    64     0    1  E  3 Note Off              
   1376963  2   1    144    66   104    1  F# 3 Note On               
   1376963  2   1    144    69   112    1  A  3 Note On               
   1376963  2   1    144    57   104    1  A  2 Note On               
   1376963  2   1    144    61   100    1  C# 3 Note On               
   1377226  2   1    147    81    95    4  A  4 Note On               
   1377458  2   1    147    81     0    4  A  4 Note Off              
   1377573  2   1    147    81    90    4  A  4 Note On               
   1377779  2   1    147    81     0    4  A  4 Note Off              
   1377871  2   1    147    81    67    4  A  4 Note On               
   1377976  2   1    147    81     0    4  A  4 Note Off              
   1378063  2   1    147    81    86    4  A  4 Note On               
   1378222  2   1    144    62   104    1  D  3 Note On               
   1378230  2   1    144    61     0    1  C# 3 Note Off              
   1378441  2   1    147    81     0    4  A  4 Note Off              
   1378501  2   1    147    81    82    4  A  4 Note On               
   1378753  2   1    147    81     0    4  A  4 Note Off              
   1378826  2   1    147    81    86    4  A  4 Note On               
   1379053  2   1    147    81     0    4  A  4 Note Off              
   1379138  2   1    147    81    90    4  A  4 Note On               
   1379390  2   1    147    81     0    4  A  4 Note Off              
   1379476  2   1    144    62     0    1  D  3 Note Off              
   1379476  2   1    147    81   105    4  A  4 Note On               
   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)
  .db 1, 0, Fis3, A3, A2, Cis3|en, 34, 0, A4|en, 77, 0, A4|en, 115, 0, A4|en, 139
  .db 0, A4|en, 158, 0, D3|en, 193, 0, A4|en, 234, 0, A4|en, 17, 1, A4|en, 59, 1
  .db A4|en, 63, 1, E3, Cis3|en, 177, 1, Gis4|en, 201, 1, Gis4|en, 222, 1, B2, Gis2|en, 223
  .db 1, Gis3|en, 25, 2, A3|en, 85, 2, Gis3|en, 125, 2, Cis3, A2|en, 126, 2, A3|en, 126
  .db 2, Fis3|en, 162, 2, A4|en, 164, 2, Cis3, E3|en, 203, 2, A4|en, 203, 2, E3|en, 204
  .db 2, Cis3|en, 221, 2, A4|en, 223, 2, Cis3|en, 223, 2, E3|en, 241, 2, Cis3, A4|en, 242
  .db 2, E3|en, 2, 3, Cis3|en, 3, 3, E3|en, 5, 3, A4|en, 23, 3, D3|en, 24, 3
  .db Fis3|en, 27, 3, A4|en, 30, 3, D3|en, 44, 3, D3|en, 47, 3, Fis3|en, 48, 3, A4|en
  .db 86, 3, Fis3, D3, A4|en, 124, 3, D3|en, 124, 3, Fis3|en, 126, 3, A4|en, 162, 3
  .db Cis3|en, 163, 3, A4|en, 164, 3, E3|en, 187, 3, E3|en, 188, 3, Cis3|en, 241, 3, E3|en
  .db 242, 3, Cis3|en, 245, 3, A4|en, 3, 4, Cis3|en, 6, 4, E3|en, 9, 4, A4|en, 25
  .db 4, B2, E3|en, 29, 4, Gis4|en, 63, 4, E3|en, 66, 4, B2|en, 80, 4, Gis4|en, 92
  .db 4, B2, Gis2|en, 93, 4, Gis3|en, 151, 4, A3|en, 211, 4, Gis3|en, 253, 4, Fis3, A3|en
  .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...

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

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

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
un das Ergebins als asm.

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

Autor: concept (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
musik audio dds

Wavetable Melody Generator / Synthesizer

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

Autor: Sonnenschein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: nixwisser (Gast)
Datum:

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

Autor: wahrsager (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonnenschein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...:(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.