LISP for dummies? - [b]Ausführliches[/b] Tutorial online?

  • Im Moment scheitere ich schon an so etwas:


    (setf numvar 15.4)
    (print numvar)


    (string numvar) geht auch nicht...


    Die Tutorials, die ich im Netz gefunden habe, beschreiben nur recht kurz die Funktionen, allerdings ohne Beispiele. Gibt es also Einführungen für Anfänger, die gleichzeitig etwas gründlicher sind?


    Gruß
    Alexander

  • Peter Seibel - Practical Common Lisp: http://www.gigamonkeys.com/book/
    David Touretzky - Gentle Introduction into Common Lisp: http://www.cs.cmu.edu/~dst/LispBook/


    auf deutsch weiss ich jetzt grad' leider nichts aus dem Kopf, wo man aber auch noch nachschauen kann ist das Common Lisp Wiki http://www.cliki.net


    Wenn's speziell um XLisp und Nyquist geht: die PlugIns von David Sky auf der SourceForge Download Seite sind alle recht einfach, da habe ich am Anfang eigentlich am meisten draus gelernt. - Die findest Du unter http://audacity.sourceforge.net/download/nyquistplugins

  • Weil ich's gestern auf die Schnelle nicht gefunden hatte: für Leute, die alles ganz genau wissen müssen gibt's dann auch noch offizielle die Komplettversion:


    Guy Steele - Common Lisp - The Language (2nd Edition): http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html


    Ist aber ein Riesen-Ding (2000 Seiten oder so) und das brauchst Du wirklich nur wenn Du nicht weisst ob Du jetzt was falsch eingetippt hast oder der Interpreter eine Macke hat.

  • Um das Maß voll zu machen, noch einige Bücher, die ich inzwischen gefunden habe. Vielleicht können andere Anfänger damit etwas Zeit beim Suchen sparen.
    Mit einem Download-Manager kann man sich auch die html-Versionen gut auf die Festplatte kopieren.


    Aber mein banales Problem der Typenkonversion (setf numvar 123.4) (print numvar) habe ich noch nicht gelöst... :eek:


    Lamkins, Successful LISP
    http://psg.com/~dlamkins/sl/cover.html


    Steele, Common Lisp the Language
    http://www.supelec.fr/docs/cltl/clm/clm.html


    Touretzky, Common Lisp: A Gentle Introduction to Symbolic Computation
    http://www.cs.cmu.edu/~dst/LispBook/


    Shapiro, Common LISP, an iteractive approach
    http://www.cse.buffalo.edu/pub…Commonlisp/commonLisp.pdf


    Allen, Dhagat, LISP primer
    http://mypage.iu.edu/~colallen/lp/


    Seibel, Practical common LISP
    http://www.gigamonkeys.com/book/


    Gruß
    Alexander

  • (setf numvar 123.4) weist der Variablen numvar den FLONUM Wert 123.4 zu.


    (print numvar) ohne spezielle Zielangabe sendet in CommonLisp den Inhalt der Variablen nach STANDARD-OUTPUT, das ist im allgemeinen der Bildschirm.


    Das genaue Verhalten der PRINT Funktion hängt aber stark vom jeweiligen Lisp Dialekt ab. Wenn Du z.B. die FLONUM Variable zum Ausdrucken in einen String verwandeln willst (oder bei manchen Lisp Dialekten sogar musst) brauchst Du die FORMAT Funktion.


    Deshalb dumme Frage: geht's um CommonLisp oder um XLisp (Nyquist) oder wie heisst der Interpreter ?

  • Hm, es geht um Nyquist.
    Ich wollte einfach nur beat.ny schrittweise an meine Ziele anpassen:


    In einer Schleife gibt
    (if (and p (> v thres)) (setq l (cons (list c "B") l)))


    "B" aus, das steht in der Textspur an der Stelle eine erkannten Schlages.


    "Beat" funktioniert natürlich auch,
    (setf ausgabe "Beat") und dann ...(list c ausgabe )... klappt ebenso.


    c scheint die Zeit an der aktuellen Position zu sein. Wenn ich jetzt eine concat-Funktion hätte, um so etwas wie (concat "Beat at "(string c)) zu schrieben, hätte ich die genaue Zeit des Schlages.


    Ich habe auf die Schnelle als einzigen Editor mit Syntax-Highlighting für LISP nur "J" 0.21 gefunden. Der hat einen LISP-Interpreter mit eingebaut, ist aber umständlich zu konfigurieren.


    Sowohl Nyquist als auch der J-LISP-Interpreter meckern bei (print numvar).

  • War spät ...


    Sorry, obiges Beispiel (print numvar) funktioniert in J.
    Das Problem in beat.ny in Nyquist ist ein anderes:


    ..
    a) (setf Stringpart (string 132.4))
    b) (setf Stringpart "Club")


    (setf Outstring (strcat "Beat " Stringpart))
    ..
    (if (and p (> v thres)) (setq l (cons (list c Outstring) l)))


    a) funktioniert, b) funktioniert nicht.

  • Es gibt in XLisp eine strcat Funktion (http://audacity.fuchsi.de/down…sp-ref/xlisp-ref-260.html), die im Prinzip genauso funktioniert wie concat, nur wenn ich ehrlich sein soll muss ich das jetzt auch erst ausprobieren. (Ich helf Dir aber suchen, das soll jetzt nicht das Problem sein weil die Idee ist mal nicht schlecht).


    Der Standard Lisp Editor mit Syntax Highlighting und allem drum und dran ist halt immer noch Emacs (http://www.gnu.org), aber da brauchst Du meist auch erstmal ein Viertel Jahr bis Du Dich da reingelesen hast. Ich selber nehm meist JEdit (http://www.jedit.org) weil da kannst Du auch alles so hinkonfigurieren, wie Du es brauchst und genauso wie Emacs oder Vim läuft der auf Windows, Mac und Linux, da brauche ich mich also nicht in zwanzig verschiedene Sachen reinzulesen wenn ich das selbe machen will.


    Ich werd' das nachher mal ausprobieren ob wir das mit den Sekundenlabels in Nyquist irgendwie hinkriegen. Bis nachher.

  • Nochmal Nachfrage: kannst Du mir hier mal den ganzen Code reinkopieren (also einmal langt plus dann die Zeilen, was funktioniert und was nicht) weil das Problem ist folgendes: "c" und "l" sind Lokalvariablen der "do" Schleife. Kommt also drauf an, welchen Wert Du wo genau zuweist (z.B. innerhalb der Schleife oder ausserhalb der Schleife).

  • Beatfinder mit Zeitanzeige:


  • Ganz herzlichen Dank für die Mühe! Es geht also mit (format...


    Wenn ich jetzt die zeitliche Auflösung bis auf die Größe der Samplerate erhöhen will, muß ich beat.ny doch besser verstehen, denn einfach den Inkrementschritt von c zu verkleinern bringt den Algorithmus durcheinander.


    (force-srate 1000
    resamplet mit 1000Hz?


    Jedit habe ich mir jetzt installiert. Kein großer Unterschied zu "J", aber immerhin muß man nicht in den File/open|save-Dialogen die Ordnerstruktur per Hand hintippern.


    Klammerebenen unterstützt Jedit ja jetzt schon. Hast Du irgendein LISP-spezifisches Plugin?


    Für die allerersten Schritte habe ich das Lisp, das in "J" eingebaut ist, benutzt. Gibt es da bessere/sinnvollere für Anfänger?


    Nochmal vielen Dank!
    Alexander

  • JEdit ist im Prinzip das gleiche Thema wie Emacs: die Standardinstallation ist relativ witzlos, da musst Du ewig dran rumkonfigurieren bis dass es so läuft wie Du das haben willst, ausserdem ist es relativ umständlich Nyquist in JEdit zum Laufen zu kriegen, das geht mit Emacs einfacher (sofern in Emacs überhaupt irgendwas einfach geht ...). Für Emacs arbeite ich mit Steven Jones gerade an einem Nyquist Mode mit Syntax Highlighting, falls da Interesse besteht.


    Hast Du irgendein LISP-spezifisches Plugin?


    Das Nyquist Zeug für JEdit hab' ich mir alles selber geschrieben (ist auch ehrlich gesagt nur zur Hälfte fertig). Ein Lisp Modus für Common Lisp ist aber schon dabei nur XLisp ist halt teilweise anders und Du musst JEdit auch noch beibringen, dass .ny-Dateien Lisp-Code sind. Ich kann Dir mal die komplette Installation als zip-file zusammenpacken, dann kannst Du ja mal ausprobieren, ob Du damit was anfangen kannst (dank Java brauchst Du nichts richtig zu installieren ausser Java selbst halt).


    Code
    (force-srate 1000 ... ) ;; resampelt auf 1000 Hz (das Plugin rechnet dann schneller)
    (setq c (+ c 0.001))    ;; erhöht c mit jedem Schleifendurchlauf um ein tausendstel


    Wenn Du nur Bassfrequenzen filtern (erkennen) willst kannst Du z.B. auch mit (force-srate 500 ... ) auf 500 Hz resampeln und musst dann aber mit (setq c (+ c 0.002)) um jeweils ein fünfhundertstel inkrementieren usw.


    Sekunden ausrechnen in Nyquist geht normalerweise so: Audacity übergibt an Nyquist drei Variablen:


    Zitat


    [m] s ;; sind die Tondaten
    len ;; soll eigentlich die Länge sein, ist in Wirklichkeit die Anzahl der Samples
    [#]*sound-srate[/#]* ;; ist die Samplefrequenz der Tonspur[/m]


    - Aufpassen, die Samplefrequenz der Tonspur ist nicht unbedingt die gleiche Frequenz wie die Projekt Rate! -


    Wenn Du jetzt die Länge des Tonstücks in Sekunden ausrechnen willst musst Du die Anzahl der Samples "len" durch die Samplefrequenz [#]*sound-srate*[/#] teilen:


    Zitat


    [m] (setf sekunden (/ len [#]*sound-srate[/#]*))[/m]

  • Vielen Dank für die Infos.


    Werde mich da mal durchfusseln. Im Moment reicht mir noch der Nyquist prompt unter Effekte/Nyquist.
    Damit kann ich die Effekte z.B der snd-follow -Funktion schön sehen.


    Ich merke, ich brauche etwas anderes:
    die Erkennung von Impulsen mit der exakten Angabe ihres Zeitpunktes (es geht um die zeitliche Analyse des Tickens von Uhren im Vgl. zB. zu Funkuhr- oder Quarzweckerimpulsen, um danach den Gang der Uhr beurteilen zu können, ohne einen Tag warten zu müssen, bis man es auch am Sekundenzeiger sieht).


    Gesucht ist also eher eine Funktion, die erkennt:
    a) "hier ist ein Impuls mit einer sehr steilen aufsteigenden Flanke, z.B.3000Hz und Abfall mit 100 Hz", also ein Sägezahn, gefolgt von lauteren Geräuschen


    b) "hier ist der Beginn einer leisen Schwingung (Freq 1000 bis 3000 Hz) die sich aus dem Hintergrundrauschen deutlich heraushebt", gefolgt von lauteren Geräuschen.


    Der Peak eines Uhrtickens wäre leichter zu erkennen, ist aber zu unpräzise.


    Dann folgen nur noch relativ einfache Rechnungen:


    1 a) Abweichung Signal b) von ganzen Sekunden: Ungenauigkeit der Samplefrequenz der Soundkarte
    1 b) Schwankungen der Frequenz von Signal b) im Sample (Jitter)


    2. Abweichung Signal a) von b) zu Anfang und zu Ende des Samples (ca 60 sek)


    3. Abweichung Signal a) von b) jetzt zu einem älteren Sample (Zeit und Datum des Files auslesen


    Aus 3. oder 4. Ausgabe in Gangabw/Tag als Info-Feld
    Speicherung als Datei


    Das wäre schon alles


    Hier kanst Du die Signalformen sehen:
    http://poubelle.gmxhome.de/Signal/Signal.html


    Was die Installation angeht: Java ist vorhanden und JEdit läuft rudimentär. Noch reicht mir Nyquist in Audacity. Für Tips oder Plugins für JEdit, der LISP-Syntax erkennt, wäre ich dankbar.
    Nein, Emacs ist wahrlich kein Thema für mich. Habe zwei große Arbeiten in LaTeX gesetzt, jetzt ist erstmal stumpfes WYSIWIG angesagt.


    Wenn mein Vorhaben oben irgendwan mal funktionieren sollte, wäre dann wahrscheinlich eine XLISP-Umgebung schön, die auch Applikationen erzeugt.

  • Die Editor Frage ist natürlich im Prinzip sowieso nicht wichtig - viel wichtiger ist:


    Problem No.1: snd-follow funktioniert in Audacity nicht richtig. Es lassen sich z.B. weder die Attack- noch die Decay-Zeit einstellen.


    Problem No.2: Wenn Du versuchen willst mit z.B. den Bandpass Filtern ein Frequenzspektrum zu erkennen (aufsteigenden Flanke, z.B.3000Hz und Abfall mit 100 Hz) muss Du Dir darüber im klaren sein, dass diese Filter Einschwingzeiten von mehreren -zig Wellenlängen haben. Um z.B. einen Frequenz von 3000Hz zuverlässig erkennen zu können bräuchtest Du ein Schwingungspaket von zwanzig bis dreissig Komplett-Schwingungen und das ist bei weitem unpräziser als die Peak-Detektor Methode.


    Vielleicht ist das über die FFT Funktionen möglich, nur wenn ich ehrlich sein soll habe ich von FFT keine grossartige Ahnung weil FFT ein halbes Mathematikstudium ist.


    Noch was gibt's zu bedenken: das Digitalrauschen einer Standard Soundkarte verursacht bei 44.1 kHz Samplefrequenz einen Messfehler von max. 2.1 Sekunden pro Tag (60x60x24)/44100 plus Quarzjitter - ich weiss nicht, ob sowas überhaupt genau genug ist.


    Eine XLisp Version, die eigenständige Applikationen erzeugen kann wird es aller Voraussicht wahrscheinlich auch nicht geben weil XLisp (ohne Nyquist) als Lisp-Dialekt bereits seit ca. 15 Jahren tot ist. Alle objektorientierten Lisp Dialekte wurden Mitte bis Ende der 80er durch CommonLisp abgelöst. CommonLisp hat seinen Namen eigentlich daher dass es ein "einheitlicher" Lisp Dialekt ist statt wie vorher zwanzig oder noch mehr verschiedene. Leider fiel dieser Vereinheitlichung auch XLisp zum Opfer, das seit damals eigentlich nicht mehr weiterentwickelt wird.


    Leider viele schlechte Nachrichten auf einmal, vielleicht finden wir ja noch jemand, der eine FFT Lösung weiss.


    Doch noch was gutes am Schluss: Jedit erkennt Lisp von alleine, wenn die Dateiendung .lsp ist. Man kann ihm aber auch beibringen, .ny-Dateien als Lisp zu erkennen, ich muss aber nochmal nachschauen, wie das genau geht.

  • JEdit Nyquist files beibringen geht so:


    Im Jedit Installationsverzeichnis gibt es ein "modes" Verzeichnis. Darin gibt es eine Datei mit Namen "catalog". In dieser Datei stehen alle Dateiendungen, da fügst Du einfach diese zwei Zeilen hinzu (einfach so wie die anderen Einträge auch):


    Code
    <MODE NAME="nyquist"		FILE="lisp.xml"
    				FILE_NAME_GLOB="*.ny" />


    Ich habe das dann noch so gemacht, dass ich einfach das "lisp.xml" file kopiert habe in ein zweites "nyquist.xml" file und dort dann angefangen habe, alle Nyquist Funktionen hinzuzufügen, damit JEdit mir anzeigt ob ich sie richtig geschrieben habe. Wenn man das übertreiben will, kann man auch noch mit dem "Clipper" PlugIn die ganzen Nyquist Funktionen mit allen Parametern als Shortcuts vordefinieren, dann kannst Du sogar über ein Menü mit der Maus "programmieren". Das ganze funktioniert natürlich auch mit C oder html oder schau mal einfach in das modes Verzeichnis, da sind xml-files für über 100 Programmiersprachen dabei.

  • >snd-follow funktioniert in Audacity nicht richtig.
    >Es lassen sich z.B. weder die Attack- noch die Decay-Zeit einstellen.


    Vorhin habe ich rise und fall in der Funktion verändert und die resultierende Kurve änderte ihre Form. Ist das nicht attack und decay?


    >Problem No.2: Wenn Du versuchen willst mit z.B. den Bandpass Filtern ein Frequenzspektrum zu erkennen (aufsteigenden Flanke, z.B.3000Hz und Abfall mit 100 Hz) muss Du Dir darüber im klaren sein, dass diese Filter Einschwingzeiten von mehreren -zig Wellenlängen haben. Um z.B. einen Frequenz von 3000Hz zuverlässig erkennen zu können bräuchtest Du ein Schwingungspaket von zwanzig bis dreissig Komplett-Schwingungen und das ist bei weitem unpräziser als die Peak-Detektor Methode.


    Bei dem Impuls mit der steilen Flanke könnte man das evtl über 1. Kriterium Steigung, 2. Kriterium Amplitude und 3. die Form der abfallenden Flanke bewerkstelligen, einfach als geschachtelte If-Abfragen.


    FFT braucht auch viele Daten. Entweder die zeitliche Auflösung ist hoch (brauche ich) oder die Frequenzauflösung ist hoch.
    Das Programm Spectrum Lab von http://www.qsl.net/dl4yhf hat eine viel bessere FFT-Funktion als Audacity, da kann man das gut ausprobieren.


    Du das mit dem Digitalrauschen: max Genauigkeit 2,1 sek nach 1/44100 x 86400 ist doch extrem unwahrscheinlich (0,5^86400 :) ).


    Auch der Jitter dürfte meine gewünschte Meßgenauigkeit nicht so sehr beeinflussen (Ziel <0,1 sek/d, also etwa 1*10^-6 pro sekunde. Also nur etwa 10^-4 pro 100 sek, das sollte erreichbar sein). Problem ist, daß die absolute Samplefrequenz der Soundkarte nur ungefähr stimmt und Temperaturabhängig driftet. Deshalb brauche ich ein zusätzliches Referenzsignal. Am besten ein hochgenauer Quarzoszillator, aber die sind in dieser Genauigkeit auch teuer. Abhilfe 1: Quarzwecker, der erwiesenermaßen langzeitgenau geht, Abhilfe 2: Funkuhr, absolut evtl. genauer, aber evtl. kräftiger Jitter wegen der LW-Übertragung, auch wenn es nur 100 Km sind.
    Am preiswertesten ist wahrscheinlich eine GPS-Maus, da gibt es welche mit sehr genauen Sekundensignalen.


    Jetzt habe ich aber ein Funkuhrmdodul für 10Euro gekauft, das muß für den Anfang reichen.
    Mal sehen...


    was LISP angeht:
    Die beiden Zeilen funktionierten einwandfrei, vielen Dank!
    Und ich dachte XLisp sei die Weiterentwicklung von Common LISP. Blöd!

  • Vorhin habe ich rise und fall in der Funktion verändert und die resultierende Kurve änderte ihre Form. Ist das nicht attack und decay?


    Antwort: Ja - Frage: was ist das für ein System (Win/Mac/Linux) und was für eine Audacity Version ? Hintergrund: an snd-follow wird schon eine ganze Weile rumgedoktert und in meiner 1.2.4 CVS Version funktioniert das immer noch nicht richtig - 1.3 beta CVS hab' ich aber noch nicht getestet - meines Wissens nach hat der Dominik aber zum letzten mal im Januar an Nyquist rumgeschraubt - aber vielleicht funktioniert's ja endlich und ich weiss es noch gar nicht. Ich brauche das nämlich selber dringend für einen Audio Kompressor.


    Mein Standard-Trick geht so: (setf s (max s (scale -1 s)))


    Das ist ein Doppelweggleichrichter (alle negativen Samples werden "hochgeklappt" in den positiven Bereich, damit hast Du die doppelte Zeitauflösung) - danach kannst Du einen ganz normalen Tiefpass nehmen zum Integrieren (snd-follow wäre natürlich entscheidend besser). Für eine Flanke von z.B. einem einzigen Sample reicht ein einfacher Tiefpass natürlich hinten und vorne nicht. Weiteres Problem: ab Tiefpässen 2.Ordnung (Butterworth etc.) gibt es zunehmend Probleme mit Überschwingern im Resonanzbereich in der Nähe der Übergangsfrequenz des Filters. Da erzeugt dann der Filter bei kurzen Signalen mehr Fehler als dass er filtert.


    Die einzigst machbare Lösüng dürfte also wirklich eine arithmetische Analyse von Samplereihen sein. Im Prinzip bist Du mit den BeatFinder da schon auf der richtigen Baustelle. Mit snd-fetch ist es machbar, jedes Sample einzeln zu untersuchen und über ein Fenster von so-und-so viel Samples (wie viele genau muss noch ausprobiert werden) ist auch ein Flankendetektor machbar. Ich muss mir das aber selber nochmal genauer anschauen, wie das gehen könnte.


    Auch noch wichtig: max 2,1 sek bedeutet: wenn sich der Flankendetektor nur um ein einziges Sample verhaut, haben wir einen Messfehler von mindestens 2.1 Sekunden am Backen. Wir müssen da also aufpassen.


    Thema Genauigkeit von Quarzoszillatoren: Die Standard Quarzuhren-Chips sind für die menschliche Körpertemperatur ausgelegt weil in einer Armbanduhr ist die eigene Körperwärme die Temperaturregelung (kein Witz). Der Grund warum z.B. die Uhr im Rechner meist grauenhaft falsch geht (mehrere Minuten pro Monat bei mir) ist ganz einfach der, dass es im Rechner drin keine konstanten 38 Grad hat. Wenn Du wirklich konstante Quarzfrequenzen willst brauchst Du einen Quarzofen (ein paar Windungen Heizdraht um den Quarz und eine Regelung, die die Temperatur konstant hält).


    Da es ja wahrscheinlich um Uhrmacher-Probleme geht: ein GPS oder Funkuhrmodul tut es wahrscheinlich auch, ich mache mir eigentlich viel grössere Sorgen um die Genauigkeit der Soundkarte und der Nyquist Filter. Der Jitter der Soundkarte ist wahrscheinlich das geringste Problem, das eigentliche Problem ist die Frequenzenauigkeit. Man müsste im Prinzip die Quarzfrequenz der Soundkarte während der Aufnahme messen, nur wie (ohne externen Hardware Frequenzzähler) habe ich jetzt auch keine richtig gute Idee.


    Nochmal Thema "eigenständige Applikationen mit XLisp": es gibt Nyquist Executables (also XLisp+Nyquist ohne Audacity) für Windows, Mac und Linux. Damit könntest Du per Command Line z.B. Nyquist Filter als Lisp-Dateien ausführen lassen. Ist jetzt keine super-tolle Lösung, aber so wäre es möglich, die Geschichte hinterher zu automatisieren. Einziger Haken: Nyquist kann (noch) nicht aufnehmen, dazu bräuchtest Du noch einen Command-Line Audio-Rekorder. Aber auch das ist kein riesiges Problem.


    "Noch nicht" bedeutet: Dannenberg hat eine Aufnahmefunktion schon mehrfach angekündigt, wahr geworden ist es bis heute aber nicht - Was man in diesem Zusammenhang wissen muss: XLisp als Sprche ist zwar tot, an Nyquist (die Audiofunktionen) wird aber noch weitergeschrieben. Die letzte Nyquist Version (2.30) ist vom Januar 2005.


    Es gab auch mal den Subversivplan Nyquist in Python einzubauen, dann könnte man mit wxPython sogar Fenster und Grafik dazubauen (Steven Jones, mit dem ich dieses Emacs Interface schreibe, kam auch schon mit dieser Idee). Nur dürfte es sich dabei dann um eine längerfristige Sache handeln, für eine schnelle Lösung ist das jetzt nicht so richtig brauchbar. Ausserdem wären in Python die Filter Probleme natürlich genau die selben.