So böse sind die auch nicht!Zitat von Sternthaler
Aber vor allem sind es andere foren die midh zu ihm ziehen
Hallo zusammen,
da ich auch ein Asuro-Musiker werden wollte, gibt es hier auch mal etwas von mir.
Nachdem ich da so ein paar Noten eintippen wollte, meine Frau aber erst stundenlang nach der Schreibweise in den Notenblättern ausquetchen musste und mein Sohn dann die Geduld aufbrachte mir die ersten Noten zu übersetzen habe ich beschlossen nicht auf den 'guten Ton', sondern auf 'mehr Ton' umzusatteln.
Eigendlich sollte "The entertainer" eure Ohren erreichen, nun sind es die ersten beiden Notenzeilen, und die noch falsch,
---> aber dafür verbrauche ich nun pro Note nur noch EIN BYTE, und nicht mehr VIER BYTE.
Das zumindest wollte ich euch nicht vorenthalten.
Kleiner Tipp, für die, die es nocht nicht wissen: Wenn man beim abspielen die Zahnräder mit den ODO-Scheiben leicht festhält, dann ist das Scheppern gerade im Bass-Bereich gut zu unterdrücken.
P.S.: Beim Einschalten des Asuros unbedingt die Ohren zuhalten.
P.P.S.: Weitere Erklärungen sind im Source enthalten. Is ja schon spät geworden![]()
Lieber Asuro programieren als arbeiten gehen.
So böse sind die auch nicht!Zitat von Sternthaler
Aber vor allem sind es andere foren die midh zu ihm ziehen
Hallo Sternthaler,
super!Zitat von Sternthaler
guter Tipp!Zitat von Sternthaler
Mit deiner Hilfe wird der ASURO ja noch zum Profi-Musiker!// Werte von B7 und H7 getauscht, da falsch definiert.
// Neue Toene von H2 bis AS4, und C8
// C8 weil es am Klavier die letzte Taste ist.
// Runter bis H2, da dann genau 62 Toene plus _OFF und STOP-Code vorhanden sind.
// Die Formel: RUNDEN (25,957 * EXP (0,0577620678 * [Tonnummer]); 0) ergibt
// fehlerfrei die passende Frequenz.
// Die [Tonnummer] ergibt sich aus: [Tonindex] + 25
// Der Tonindex beginnt bei 0, und somit die Tonnummer bei 25 mit dem Ton A2,
// da dies laut http://www.sengpielaudio.com/Rechner-notennamen.htm nun mal
// so ist.
// Die Toene mit den Tonnummern 1 bis 25 sind auf der Bass-Seite vom Klavier
// auch noch vorhanden, koennen aber hier nicht mehr dargestellt werden, da
// sonst mehr als 64 Toene/_OFF/STOP und somit mehr als 6 Bits benoetigt
// wuerden. Dies geht aber nicht, da die restlichen 2 Bits fuer die Tondauer
// benutzt werden.
Nun mal eine dumme Anfänger-Frage:
du definierst erst auf "herkömmliche" Art:
uint16_t rechts []
uint16_t links []
später "sparsam":
uint8_t rechts []
uint8_t links []
abgespielt wird das:
StereoSound (rechts, links);
mir ist nicht klar welche Variante der ASURO jetzt abspielt.
Bei unseren Liedern gibt noch die Unterscheidung angestossene und gebundene Töne und ausserdem Triolen:
Die Originalfunktion von robo.fr ist ohne blinkende LEDs.Code:#define zweig 1500 //g : gebunden #define vierg 750 #define achtg 375 #define triog 250 #define einsa 2980 // a : angestossen #define zweia 1480 #define viera 730 #define achta 355 #define trioa 230 #define anst 20 // anstoss #define _OFF 0 #define STOP 0 //------------------------------------------------------------------------------------------------- //amzaing grace 1.Stimme uint16_t amazing_grace_1[]={ C5,achtg, F5,achtg, _OFF,anst, F5,zweia, _OFF,anst, A5,trioa, G5,triog, F5,triog, _OFF,anst, A5,zweia, _OFF,anst, A5,achta, G5,achtg, _OFF,anst, F5,zweia, _OFF,anst, D5,viera, _OFF,anst, C5,zweia, //------------------------------------------------------------------------------------------------- _OFF,anst, C5,achta, F5,achtg, _OFF,anst, F5,zweia, _OFF,anst, A5,trioa, G5,triog, F5,triog, _OFF,anst, A5,zweia, _OFF,anst, G5,achta, A5,achtg, _OFF,anst, C6,zweia, C6,zweig, C6,vierg, //------------------------------------------------------------------------------------------------- _OFF,anst, A5,achta, C6,achtg, _OFF,anst, C6,zweia, _OFF,anst, A5,trioa, G5,triog, F5,triog, _OFF,anst, A5,zweia, _OFF,anst, A5,achta, G5,achtg, _OFF,anst, F5,zweia, _OFF,anst, D5,viera, _OFF,anst, C5,zweia, //------------------------------------------------------------------------------------------------- _OFF,anst, C5,achta, F5,achtg, _OFF,anst, F5,zweia, _OFF,anst, A5,trioa, G5,triog, F5,triog, _OFF,anst, A5,zweia, _OFF,anst, G5,viera, _OFF,anst, F5,zweia, F5,zweig, F5,vierg, STOP,STOP }; //------------------------------------------------------------------------------------------------- //amzaing grace 2.Stimme uint16_t amazing_grace_2[]={ C5,achtg, A4,achtg, _OFF,anst, A4,zweia, _OFF,anst, C5,trioa, H4,triog, A4,triog, _OFF,anst, C5,zweia, _OFF,anst, C5,achta, DES5,achtg, _OFF,anst, D5,zweia, _OFF,anst, H4,viera, _OFF,anst, A4,zweia, //------------------------------------------------------------------------------------------------- _OFF,anst, C5,achta, A4,achtg, _OFF,anst, A4,zweia, _OFF,anst, C5,trioa, H4,triog, A4,triog, _OFF,anst, C5,zweia, _OFF,anst, E5,achta, F5,achtg, _OFF,anst, E5,zweia, E5,zweig, E5,vierg, //------------------------------------------------------------------------------------------------- _OFF,anst, F5,achta, A5,achtg, _OFF,anst, A5,zweia, _OFF,anst, F5,trioa, C5,triog, D5,triog, _OFF,anst, C5,zweia, _OFF,anst, DES5,viera, _OFF,anst, D5,zweia, _OFF,anst, H4,viera, _OFF,anst, A4,zweia, //------------------------------------------------------------------------------------------------- _OFF,anst, C5,achta, A4,achtg, _OFF,anst, A4,zweia, _OFF,anst, C5,trioa, H4,triog, A4,triog, _OFF,anst, C5,zweia, _OFF,anst, H4,achtg, _OFF,anst, A4,zweia, A4,zweig, A4,vierg, STOP,STOP };
Diese habe ich laienhaft (nach dem Prinzip Versuch u. Irrtum) eingebaut.
Vielleicht kannst du dir das mal anschauen und evtl. verbessern (die StatusLED geht immer erst nach dem ersten Ton an.)? - Wäre nett!
Gruss
M.
Hallo M1.R,
es gibt keine dummen Fragen, nur dumme Antworten.
Such mal im Source nach "USE_FREQUENCE".Zitat von M1.R
Hinter dem Versions-Kommentar sind 2 alternativ zu verwendende Zeilen:
//#define USE_FREQUENCE JA
#undef USE_FREQUENCE
Wenn du nun weiter im Source sucht, tauchen die Stellen Code auf, die dann alternativ beim compilieren übersetzt werden. Somit wird bei der hier vorgenommenen Einstellung nur das übersetzt, was hinter den 'unscheinbaren' #else-Zeilen im Code steht.
Schreibst du:
#define USE_FREQUENCE JA
//#undef USE_FREQUENCE
dann werden die Teile hinter "#ifdef USE_FREQUENCE" (bis zum #else) kompiliert.
Ach du meine Güte. Davon hat mir meine Frau gar nichts gesagt.Zitat von M1.R
Tut mir leid das geht so nun nicht bei meiner aktuellen Version.
Wenn ich mir die von dir angegeben Defines ansehe, beziehen sich die Namen (angestossen, ..) ja auf die Tonlängen.
Genau hier habe ich aber nur 2 Bit's zur Verfügung und somit eben nur 4 verschieden Zeitmöglichkeiten.
Mal sehen, ob man die Daten pro Note 'irgendwie' auf 10 oder 11 Bit's erweitern kann. (Natürlich komprimiert, so dass man nicht 2 Byte verbraucht) Dann hätte man für die Zeitangaben 4 oder 5 Bit's (16 oder 32) Zeitangaben zur Verfügung.
P.S.: Ist schon toll, was ihr mit Noten zaubert. Geduld, Wissen und ein gutes Ohr fehlen mir da für die Musik.
P.P.S.: Die Blinkefunktion ist doch ganz in Ordnung. Aber mal sehen, was da noch zu 'verbessern' ist.
Bis später.
Lieber Asuro programieren als arbeiten gehen.
Hallo Sternthaler,
aha! danke!Zitat von Sternthaler
meine Led - Blinkerei scheint doch nicht richtig zu funktionieren:
bei deinem Lied bleibt die rechte BackLED immer an, obwohl in deiner rechten Melodie auch OFF-Töne sind.
Eigentlich sollte die Rechte nur bei rechten Tönen, die Linke nur bei linken Tönen leuchten... ???
ganz toll wäre auch noch die Lautstärke zu definieren
wie hier: void Sound(uint16_t freq, uint16_t duration_msec, uint8_t amplitude);
und wenn dann noch der letze Ton leiser werden würde...
Gruss
M.
Hallo M1.R,
ich bin bis jetzt noch nicht dazu gekommen nach den LED's zu sehen. Es kann aber natürlich sein, dass ich bei meiner Version etwas kaputt gemacht habe und die LED deshalb jetzt nicht mehr ausgeht. Bitte noch etwas Geduld.
Wo hast denn du den Funktionsaufruf her?
Amplitude bei den Motoren kann ich mir ja jetzt nur über verschiedenen Motor-Leistungen vorstellen.
Wenn das Sinn macht, bleibt nur noch die Frage wie viele Lautstärkestufen sollen es den sein?
2 Bit wären da eine datentechnisch gute Lösung.
- 6 Bit Frequenz (62 Möglichkeiten; 1 Ton aus; 1 Stop)
- 4 Bit Dauer (16 Möglichkeiten. Müsten auch deine angestossenen Töne beinhalten)
- 2 Bit Lautstärke (Also 4 Möglichkeiten + Ton aus)
------
= 12 Bit bzw 1,5 Byte. Damit kann man relativ einfach komprimieren.
Lieber Asuro programieren als arbeiten gehen.
Lib 2.7: asuro.h - sound.cZitat von Sternthaler
GrussCode:void Sound ( uint16_t freq, uint16_t duration_msec, uint8_t amplitude) { uint16_t n,k,wait_tics; uint32_t period_usec,dauer_usec; period_usec = 1000000L / freq; dauer_usec = 1000 * duration_msec; k = dauer_usec / period_usec; //IR Interuptfreq=36KHz //Wavefreq=18KHz wait_tics = 18000 / freq; MotorSpeed (amplitude, amplitude); for (n = 0; n < k; n++) { MotorDir (FWD, FWD); Sleep (wait_tics); MotorDir (RWD, RWD); Sleep (wait_tics); } MotorSpeed (0, 0); } #define BEEP sound (1000, 100, 255)
M.
Peinlich![]()
Genau die LIB beacker ich ja mit.
(Mal nachsehen, ob ich dafür die Kommentare geschrieben/formatiert habe. --> Leider ja. Sound scheint bis vor kurzem nicht so mein Hauptaugenmerk gewesen zu sein. Immerhin war meine Vermutung schon ganz gut, dass es über die Motorleistung geht.)
Was ist mit den 2 Bit? Würden dir die reichen?
Lieber Asuro programieren als arbeiten gehen.
So, eine neue Version.
Ich habe mal ein bisschen 'ausgemistet' und einiges in H-Dateien verlegt.
Ausserdem ist diese Version AKTUELL NICHT allgemein zu nutzen, sondern soll nur 4 verschiedene Lautstärken demonstrieren.
Die Lautstärke kommt noch nicht aus den Daten zu jeder einzelnen Note, sondern wird erst mal nur als Parameter an die Funktion StereoSound() weitergegeben.
Die Blinkerei mit den LED's beginnt nun auf alle Fälle schon mit der ersten Note.
Lieber Asuro programieren als arbeiten gehen.
Hallo Sternthaler,
du bist aber schnell!Zitat von Sternthaler
Da es mir ebenso geht wie dirZitat von Sternthaler
bin ich in dieser Hinsicht leider vollkommen abhängig von meinem Sohn. Er wird sagen können, wieviele verschiedene Lautstärken man braucht. Bis morgen abend ist er allerdings noch weg.Zitat von Sternthaler
Um rauszufinden, ab welcher "Geschwindigkeit" man überhaupt etwas hört, habe ich ein Testprogramm (nur 1 Motor) geschrieben.
Mit "bloßen" Ohren höre ich ab ungefähr 20 etwas. Mit Mikro und Verstärker schon ab 1!
nochmal zu unseren gebundenen und angestoßenen Tönen:Code:// lautstärke test #include "asuro.h" void Sound1(uint16_t freq, uint16_t duration_msec, uint8_t amplitude) { uint16_t wait_tics; uint32_t n,k,period_usec,dauer_usec; period_usec=1000000L/freq; dauer_usec=1000*(uint32_t)duration_msec; k=dauer_usec/period_usec; //IR Interuptfreq=36KHz //Wavefreq=18KHz wait_tics=18000/freq; MotorSpeed(amplitude, 0); for(n=0;n<k;n++) { MotorDir(FWD,FWD); Sleep(wait_tics); MotorDir(RWD,RWD); Sleep(wait_tics); } MotorSpeed(0,0); } int main(void) { Init(); BackLED(ON,ON); StatusLED(RED); Sound1 (1000, 1000, 1); StatusLED(YELLOW); Sound1 (1000, 1000, 2); StatusLED(GREEN); Sound1 (1000, 1000, 3); StatusLED(RED); Sound1 (1000, 1000, 4); StatusLED(YELLOW); Sound1 (1000, 1000, 5); StatusLED(GREEN); Sound1 (1000, 1000, 6); StatusLED(RED); Sound1 (1000, 1000, 7); StatusLED(YELLOW); Sound1 (1000, 1000, 8); StatusLED(GREEN); Sound1 (1000, 1000, 9); BackLED(OFF,OFF); StatusLED(RED); Sound1 (1000, 1000, 10); StatusLED(YELLOW); Sound1 (1000, 1000, 20); StatusLED(GREEN); Sound1 (1000, 1000, 30); StatusLED(RED); Sound1 (1000, 1000, 40); StatusLED(YELLOW); Sound1 (1000, 1000, 50); StatusLED(GREEN); Sound1 (1000, 1000, 60); StatusLED(RED); Sound1 (1000, 1000, 70); StatusLED(YELLOW); Sound1 (1000, 1000, 80); StatusLED(GREEN); Sound1 (1000, 1000, 90); StatusLED(RED); Sound1 (1000, 1000, 100); StatusLED(YELLOW); Sound1 (1000, 1000, 110); StatusLED(GREEN); Sound1 (1000, 1000, 120); StatusLED(RED); Sound1 (1000, 1000, 130); StatusLED(YELLOW); Sound1 (1000, 1000, 140); StatusLED(GREEN); Sound1 (1000, 1000, 150); StatusLED(RED); Sound1 (1000, 1000, 160); StatusLED(YELLOW); Sound1 (1000, 1000, 170); StatusLED(GREEN); Sound1 (1000, 1000, 180); StatusLED(RED); Sound1 (1000, 1000, 190); StatusLED(YELLOW); Sound1 (1000, 1000, 200); StatusLED(GREEN); Sound1 (1000, 1000, 210); StatusLED(RED); Sound1 (1000, 1000, 220); StatusLED(YELLOW); Sound1 (1000, 1000, 230); StatusLED(GREEN); Sound1 (1000, 1000, 240); StatusLED(RED); Sound1 (1000, 1000, 250); StatusLED(OFF); while (1); return 0; }
für jede Tonlänge gibt es ja beide Varianten, wobei sich der angestoßene Ton aus zwei Tönen zusammensetzt: 20ms aus und dann Länge angestoßen = gebundener Ton - 20ms.
Das bedeutet, dass man in der Melodie für die angestoßenen Töne immer zwei Töne schreiben muss.
Beispiel:
#define vierg 750 //viertel gebunden
#define viera 730 //viertel angestoßen
#define anst 20 //Anstoßzeit = Differenz
Ein angestoßener Ton::
_OFF,anst,
F5,viera,
Vielleicht fällt dir hierzu ja auch noch eine Vereinfachung ein?
Gruss
M.
PS: Wenn es dir gelingt, den ASURO gleichzeitig während er Musik macht auch noch fahren zu lassen, bekommst du von mir einen ASURO-MUSIK-ORDEN!![]()
Lesezeichen