{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Programmierkurs Python\n", "\n", "## Sitzung 5 - Schnittstellen" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wie können wir Python nutzen um mit der Außenwelt zu kommunizieren - sei es Internet oder auf dem eigenen Rechner Supercollider.\n", "\n", "Wir wollen versuchen die Events von [Github](http://github.com) mithilfe von Supercollider zu sonifizieren. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Internet" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Eine gute Bibliothek um mithilfe von Python einfach mit dem Internet zu agieren ist *requests* welche man sich darüber installieren kann das man in einem neuen Shell Fesnter den Befehel\n", "\n", "```shell\n", "pip3 install requests\n", "```\n", "\n", "ausführt." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Die Infos die wir sonifizieren wollen sind unter der Internetaddresse [https://api.github.com/events](https://api.github.com/events) erreichbar, welche man auch aus dem Webbrowser aufrufen kann.\n", "\n", "Wir können mithilfe der *requests* Bibliothek auch leicht Informationen aus dem Internet abrufen." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = requests.get('https://api.github.com/events')\n", "r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die *Response* vom GitHub Server ist 200, was bedeutet dass die Anfrage erfolgreich war.\n", "\n", "Eine anderer bekannter Status Code ist 404 der benutzt wird wenn die Adresse unbekannt ist." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Mithilfe von `r.text` können wir uns den Textinhalt der Response anschauen. (Ich limitiere hier durch die *Slicing* Schreibweise den Output auf die ersten 200 Zeichen)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'[{\"id\":\"11456033479\",\"type\":\"PushEvent\",\"actor\":{\"id\":60158507,\"login\":\"nvgunnell\",\"display_login\":\"nvgunnell\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/nvgunnell\",\"avatar_url\":\"https://ava'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r.text[0:200]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die ersten 200 Zeichen von [google.com](http://www.google.com) sehen daher so aus." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actorcreated_atidorgpayloadpublicrepotype
0{'id': 60158507, 'login': 'nvgunnell', 'displa...2020-02-06T20:20:51Z11456033479NaN{'push_id': 4597617952, 'size': 1, 'distinct_s...True{'id': 236526827, 'name': 'nvgunnell/nvgunnell...PushEvent
1{'id': 28676608, 'login': 'OtavioCastro', 'dis...2020-02-06T20:20:51Z11456033473NaN{'push_id': 4597617962, 'size': 1, 'distinct_s...True{'id': 235352341, 'name': 'OtavioCastro/spring...PushEvent
2{'id': 160377, 'login': 'avoronkin', 'display_...2020-02-06T20:20:51Z11456033480{'id': 13398246, 'login': 'rust-lang-ru', 'gra...{'action': 'started'}True{'id': 198659024, 'name': 'rust-lang-ru/async-...WatchEvent
3{'id': 10810283, 'login': 'direwolf-github', '...2020-02-06T20:20:51Z11456033474NaN{'push_id': 4597617960, 'size': 1, 'distinct_s...True{'id': 238776821, 'name': 'direwolf-github/my-...PushEvent
4{'id': 1402941, 'login': 'shantamcbain', 'disp...2020-02-06T20:20:51Z11456033431NaN{'push_id': 4597617943, 'size': 1, 'distinct_s...True{'id': 3338213, 'name': 'shantamcbain/ComServ'...PushEvent
\n", "" ], "text/plain": [ " actor created_at \\\n", "0 {'id': 60158507, 'login': 'nvgunnell', 'displa... 2020-02-06T20:20:51Z \n", "1 {'id': 28676608, 'login': 'OtavioCastro', 'dis... 2020-02-06T20:20:51Z \n", "2 {'id': 160377, 'login': 'avoronkin', 'display_... 2020-02-06T20:20:51Z \n", "3 {'id': 10810283, 'login': 'direwolf-github', '... 2020-02-06T20:20:51Z \n", "4 {'id': 1402941, 'login': 'shantamcbain', 'disp... 2020-02-06T20:20:51Z \n", "\n", " id org \\\n", "0 11456033479 NaN \n", "1 11456033473 NaN \n", "2 11456033480 {'id': 13398246, 'login': 'rust-lang-ru', 'gra... \n", "3 11456033474 NaN \n", "4 11456033431 NaN \n", "\n", " payload public \\\n", "0 {'push_id': 4597617952, 'size': 1, 'distinct_s... True \n", "1 {'push_id': 4597617962, 'size': 1, 'distinct_s... True \n", "2 {'action': 'started'} True \n", "3 {'push_id': 4597617960, 'size': 1, 'distinct_s... True \n", "4 {'push_id': 4597617943, 'size': 1, 'distinct_s... True \n", "\n", " repo type \n", "0 {'id': 236526827, 'name': 'nvgunnell/nvgunnell... PushEvent \n", "1 {'id': 235352341, 'name': 'OtavioCastro/spring... PushEvent \n", "2 {'id': 198659024, 'name': 'rust-lang-ru/async-... WatchEvent \n", "3 {'id': 238776821, 'name': 'direwolf-github/my-... PushEvent \n", "4 {'id': 3338213, 'name': 'shantamcbain/ComServ'... PushEvent " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(j)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['type'].value_counts().plot.pie()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir können so sehen dass die meisten Ergebnisse die uns Github anzeigt sogenannte *Push Events* sind." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Supercollider Kommunikation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Frage ist nun wie wir die Daten von Python nach Supercollider geschickt bekommen.\n", "\n", "Dazu kurz eine Zeichnung wie wir planen zu kommunizieren." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "```\n", "\n", " Internet | Supercollider\n", " | | \n", " | | /|\\\n", "-------+---------| |\n", " | | | OSC Protokoll\n", "http \\|/ | | \n", " Python ------+----------\n", " requests |\n", " |\n", " \n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wir nutzen Python mit *requests* um Daten aus dem Internet an Supercollider zu schicken wobei wir dafür das [OSC Protokoll](https://www.wikiwand.com/de/Open_Sound_Control) nutzen.\n", "\n", "Hierbei spielt uns die Server-Architektur von Supercollider in die Hände da so Supercollider auch eine Internetadresse hat die jedoch auf unserem eigenen Rechner aufzufinden ist." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Fahren wir nun einfach Supercollider hoch und schreiben in eine neue Datei den Code\n", "\n", "```supercollider\n", "s.boot;\n", "NetAddr.localAddr\n", "```\n", "und führen diese aus.\n", "\n", "Als Output sollten wir hierbei `a NetAddr(127.0.0.1, 57120)` bekommen.\n", "`127.0.0.1` ist die Internet Adresse vom eigenen Rechner (man spricht auch von einer Netzwerk- oder IP Adresse da diese Adresse auch ohne Internet verfügbar ist) und `57120` der Port unter dem Supercollider auf diesem Rechner *lauscht*.\n", "\n", "IP Adressen sind dabei einem Hochhaus entsprechend und Port einer Tür in diesem Hochhaus, unter der eine Anwendung Nachrichten annehmen kann." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Python -> Supercollider\n", "\n", "Eine Bibliothek um OSC Nachrichten zu verschicken ist [`pythonosc`](https://pypi.org/project/python-osc/), welche man sich mithilfe von\n", "\n", "```shell\n", "pip3 install python-osc\n", "```\n", "\n", "installieren kann." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wir wollen zu Beginn erstmal eine Zahl von Python nach Supercollider via OSC schicken.\n", "\n", "Dafür regestrieren wir in Supercollider einen [*OSCdef*](https://doc.sccode.org/Classes/OSCdef.html) der auf den Kanal `pythonTest` hört, ein Argument annimmt, dieses Argument in ein Integer umwandelt und printet.\n", "\n", "```supercollider\n", "(\n", "OSCdef(\\pythonTest, {|msg|\n", "\tvar pythonNumber;\n", "\tpythonNumber = msg[1].asInteger;\n", "\tpythonNumber.postln;\n", "}, '\\pythonTest');\n", ")\n", "```\n", "\n", "Die Einzelheiten kann man in der [Supercollider Dokumentation](https://doc.sccode.org/Guides/OSC_communication.html#Receiving%2520OSC%2520from%2520another%2520application) nochmal nachlesen." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wir müssen nun in Python einen *Client* erstellen, der unsere OSC Nachricht an den Supercollider *Server* schickt.\n", "Supercollider nutzt dafür [UDP](https://www.wikiwand.com/de/User_Datagram_Protocol)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from pythonosc import udp_client" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# initierung des clienst ähnlich zu einem funktionsaufruf\n", "client = udp_client.SimpleUDPClient(\n", " # addresse auf der supercollider läuft - 127.0.0.1 ist der eigene rechner\n", " address='127.0.0.1',\n", " # die \"tür\" von supercollider ist normal 57120\n", " port=57120,\n", ")" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "client.send_message(\n", " address='/pythonTest',\n", " value=42,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wir sollten in Supercollider den Wert `42` im *Post window* sehen." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Klänge erzeugen" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wir fügen in Supercollider noch einen `SynthDef` *sine* hinzu der uns einen einfachen Sinus Ton erzeugen wird und als Parameter eine Frequenz `freq` annimmt.\n", "\n", "```supercollider\n", "OSCdef(\\pythonNumber, {|msg|\n", "\tvar pythonNumber;\n", "\tpythonNumber = msg[1].asInteger;\n", "\t{\n", "\t\tSinOsc.ar(pythonNumber, 0.0, EnvGen.kr(Env.linen(sustainTime: 0.2, releaseTime: 0.1), doneAction: Done.freeSelf));\n", "\t}.play;\n", "});\n", "```" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "client.send_message(\n", " address='/pythonNumber',\n", " value=420,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Man sollte einen kurzen Ton gehört haben." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Wrap it all together\n", "\n", "Fügen wir nun die Puzzleteile zusammen.\n", "Anhand der [GitHub API Dokumentation](https://developer.github.com/v3/activity/events/#list-public-events) definieren wir ein Dictionary was einen String (also einem *type*) auf ein Integer (also eine Frequenz) *übersetzt*." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import time # ermöglicht python code zu pausieren" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "freq_dict = {\n", " 'PushEvent': 100,\n", " 'CreateEvent': 1000,\n", " 'IssuesEvent': 400,\n", " 'PullRequestEvent': 800,\n", " 'WatchEvent': 333,\n", " 'ForkEvent': 200,\n", " 'IssueCommentEvent': 500,\n", " 'MemberEvent': 240,\n", " 'PullRequestReviewCommentEvent': 555,\n", " 'CommitCommentEvent': 252,\n", " 'DeleteEvent': 566,\n", " 'GollumEvent': 666,\n", "}" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "for i in range(10):\n", " r = requests.get('https://api.github.com/events')\n", " j = r.json()\n", " for i in j:\n", " # .get erlaubt uns einen backup wert zu setzen (hier 50) falls der *key*\n", " # nicht im dictionary freq_dict vorhanden ist\n", " freq = freq_dict.get(i['type'], 50)\n", " client.send_message('/pythonNumber', freq)\n", " # warte 0.1 sekunden bevor die nächste OSC message gesendet wird\n", " time.sleep(0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Im Repostiroy ist mit `github.mp3` eine Aufnahme aus Supercollider zu hören." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Wir hören das alle 30 Töne immer eine kurze Pause ertönt.\n", "Dies liegt daran dass in dieser Zeit Python die neuen Ereignisse aus der GitHub API lädt und Python immer nur ein Sache erledigen kann und es sehr kompliziert ist Sachen paralell auszuführen (siehe [GIL - Global Interpreter Lock](https://wiki.python.org/moin/GlobalInterpreterLock)).\n", "\n", "Wir sehen also dass Python Vor- und Nachteile hat - es ist sehr übersichtlich zu schreiben aber dafür nicht gut Sachen paralell auszuführen, was Supercollider sehr viel besser kann.\n", "\n", "Dies ist der Grund warum es so viele verschiende Programmiersprachen gibt, da jede Sprache einen anderen Fokus legt." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Hinweis: Wenn man mehr als 60 Anfragen die Stunde an die API macht wird man gebannt von der API.\n", "Die Variable `j` sieht dann wie folgt aus\n", "\n", "```json\n", "{\n", " \"message\": \"API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)\",\n", " \"documentation_url\": \"https://developer.github.com/v3/#rate-limiting\"\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Ende!\n", "\n", "Vielen Dank für das Besuchen und Zuhören.\n", "\n", "Falls ihr Lust habt noch tiefer in das Programmieren einzusteigen sind hier ein paar gute Quellen:\n", "\n", "* [W3 Schools](https://www.w3schools.com/html/default.asp): Kurs zum Lernen von HTML welches für Websiten benötigt wird\n", "* [Learn you a Haskell](http://learnyouahaskell.com/): Tutorial zur funktionalen Programmiersprache Haskell\n", "* [SuperCollider Tutorials - Eli Fieldsteel](https://www.youtube.com/watch?v=yRzsOOiJ_p4&list=PLPYzvS8A_rTaNDweXe6PX4CXSGq4iEWYC): YouTube Tutorial zu Supercollider\n", "* [Automate the boring stuff](https://automatetheboringstuff.com/)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 4 }