Live coding music with PyREPL in Python 3.13
This is a modal window.
The media could not be loaded, either because the server or network failed or because the format is not supported.
Formal Metadata
Title |
| |
Title of Series | ||
Number of Parts | 131 | |
Author | ||
Contributors | ||
License | CC Attribution - NonCommercial - ShareAlike 3.0 Unported: You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this | |
Identifiers | 10.5446/69472 (DOI) | |
Publisher | ||
Release Date | ||
Language |
Content Metadata
Subject Area | ||
Genre | ||
Abstract |
|
EuroPython 202462 / 131
1
10
12
13
16
19
22
33
48
51
54
56
70
71
84
92
93
95
99
107
111
117
123
00:00
Large eddy simulation2 (number)WindowScripting languageData typeInformationSocial classView (database)MIDIProjective planeRepetitionFerry CorstenRight angleModul <Datentyp>Functional (mathematics)TwitterComputer hardwareGastropod shellGraph coloringAnalogyVirtual machineMIDIComputer fileMessage passingData miningDot productMereologySocial classCalculusInheritance (object-oriented programming)Computer animationLecture/Conference
02:35
Online helpWindowRouter (computing)Social classAdvanced Encryption StandardData typeInformationMIDIQuality of serviceRange (statistics)AnalogyKeyboard shortcutComputer fileModule (mathematics)outputGraphics tabletWhiteboardAttribute grammarComputer configurationView (database)QuicksortInterrupt <Informatik>Lambda calculusSequenceException handlingRevision controlLibrary (computing)Software frameworkParameter (computer programming)MIDIException handlingRight angleSocial classQuicksortSequenceObject (grammar)Source codeKeyboard shortcutFunctional (mathematics)Subject indexingMultiplication signGraphics tabletMessage passingRange (statistics)NumberBeat (acoustics)VelocitySynchronizationFunction (mathematics)1 (number)DigitizingElectronic mailing listAttribute grammarDrum memoryComputer clusterLecture/ConferenceComputer animation
07:52
Design of experimentsGEDCOM9K33 OsaInterrupt <Informatik>Keyboard shortcutLetterpress printingParameter (computer programming)WindowView (database)Optical character recognitionIntrusion detection systemRun-time systemComputer fileDemo (music)Pay televisionSequenceException handlingMusical ensembleGame theoryDeterminismParsingLoop (music)OctaveGodAsynchronous Transfer ModeGraph coloringType theoryMereologyBitSign (mathematics)Function (mathematics)Drum memoryVelocityMIDILevel (video gaming)Line (geometry)ReliefTrailRight angleCodeVariable (mathematics)Multiplication signCodeNumberBlock (periodic table)IdentifiabilityBeat (acoustics)Interactive televisionMathematicsHash functionBuffer solutionWeightComputer animation
16:09
Lattice (order)Data bufferSign (mathematics)MIDIMusical ensembleSweep line algorithmPauli exclusion principleMultiplication signMathematicsGame controllerCase moddingVideo gameBitKeyboard shortcutDrum memoryFunctional (mathematics)Variety (linguistics)Right angleVolume (thermodynamics)Software repositoryVariable (mathematics)Pulse (signal processing)Default (computer science)SequenceVirtual machineLine (geometry)CodeSingle-precision floating-point formatInsertion lossExpressionWritingRandomizationCodeDot productComputer animation
24:25
Revision controlWindowType theoryThread (computing)Musical ensembleBitShared memorySequenceGoodness of fitCalculationSource codeParameter (computer programming)Revision controlComputerRight angleLaptopChord (peer-to-peer)Rational numberComputer hardwarePay televisionParsingReal-time operating systemComputer programmingCore dumpDrum memoryQuicksortLetterpress printingVideoconferencingAxiom of choiceFunction (mathematics)Different (Kate Ryan album)Functional (mathematics)RandomizationComputer clusterMIDIComputer animation
32:41
WindowView (database)TupleThread (computing)Computer fileModule (mathematics)outputUtility softwareModul <Datentyp>String (computer science)Scalar fieldInterpreter (computing)Online helpMusical ensembleUniversal product codeOnline helpRight angleSinc functionWritingBoom (sailing)Multiplication signSoftware bugTouchscreenBitMultilaterationLecture/ConferenceComputer animation
35:08
Musical ensembleSoftware repositoryRight angleDecision theoryLecture/Conference
35:51
Rothe-VerfahrenThermische ZustandsgleichungSoftware testingDesign of experimentsBitSoftware bugTraffic reportingComputing platformDefault (computer science)Right angleSoftware repositoryValidity (statistics)Goodness of fitLecture/ConferenceMeeting/Interview
37:16
OctahedronDot productWeightWindowScripting languageUniform resource locatorGroup actionNetwork operating systemIntrusion detection systemVideoconferencingSanitary sewerView (database)Address spaceQuicksortRight angleMusical ensembleFreewareThread (computing)Social classReplication (computing)Lecture/ConferenceComputer animation
37:58
Ordinary differential equationBookmark (World Wide Web)Function (mathematics)Immersion (album)Musical ensembleSoftwareStandard errorOnline helpGroup actionPrinciple of relativityWindowAnalogyLibrary catalogPressureState of matterCoding theoryComputer hardwareSemiconductor memoryRight angleCodeIdentifiabilitySign (mathematics)Cheat <Computerspiel>Source codeComputer animationLecture/Conference
38:38
Group actionGastropod shellStochastic differential equationSuccessive over-relaxationCloud computingText editorPay televisionVideo gameType theoryTransformation (genetics)Artificial lifeLecture/ConferenceComputer animation
40:16
BitLine (geometry)CodeMultiplication signLecture/ConferenceComputer animation
Transcript: English(auto-generated)
00:04
Hello there. No artificial intelligence was used in the creation of this talk, and only a limited amount of the other kind were. So you're here to see Python 3 now, been using it for a while.
00:21
As you can see, that's 3.14 since 3.13 is old news for me right now. You might notice that there's a caller in the REPL, that's because that's our new interactive shell, borrowed from PyPy, and in fact, this is all a very European talk, right? Like PyPy, mostly a European project, you know, and Python now took the PyPy REPL and
00:42
has it. And I have this Swedish synthesizer here, and this is EuroRack, which is Euro, right? Founded by Dieter Dübfer modular synthesizer. This is a German synthesizer, and this is a Novation launchpad, which is British, so almost European.
01:08
So now, I know that you're very excited about a REPL that allows you to do fancy stuff like exit by typing exit, but some of you, like when you saw this on Twitter,
01:21
you were like, hey, I actually want this auto-imported thing, and it doesn't work in mind. Like, why not? Well, because it's actually not part of this new REPL. It's something that you can already have right now, and you have it by just setting Python startup to a thing, and that thing, if you color it, you see, it just runs
01:43
some function. Why does it run a function? Well, because it auto-imports a bunch of things, but there's some special syntax here, if I want everything from typing, but no typing itself, if I only want path, but not pathlib itself, if I only want data class, there's some special handling, so there's like a super advanced function here, but it just does all of those things, right?
02:02
So you can also have it. You can find it on my dot files on GitHub, or just write it yourself. It is easy enough. So in fact, to speed things up and make sound appear here a little faster than it would otherwise, I am using a custom Python startup file for this. And we're going to be mostly using MIDI in this talk.
02:22
And the way the MIDI is going to work is it sends short messages, just a bunch of bytes, to hardware instruments that I have with me, the drum machine, which is analog, the modular synthesizer, which is also analog, and the digital synthesizer right here. So we're going to send MIDI messages, and we have a bunch of ports here.
02:44
I get output names, and you can see some of them are not important for us, but this one is going to be important, since this one is going to be our base. So let's create this one here. We're going to use the drum machine, so that's going to be this one right here.
03:05
And then Iridium is the digital synthesizer right here, so let's use this one as well. So now having those MIDI outputs, I can just send messages. This is going to be very verbose, but just to show you what's going on, you can essentially
03:21
just say base, send note on, and just say which note you want, and it's just numbers. So we can say 24 with velocity, say, 64 on channel 0. And when you do this, a sound appeared, but it still held, because all we did is note
03:40
on. So you have to actually send also a note off. This is very verbose, so we're not going to be using this all the time. Instead, what we will be doing is writing little, little sequencers, and I have a bunch of those. I can create, I don't know, like, I'm going to be one indexing here.
04:02
I'm very sorry, but when I see this pad right here, I'm thinking one. I'm not thinking zero. I'm sorry. So for IN range 165. And now we're going to see, okay, we have sequencer objects. They're empty. They don't do anything yet. So when in Ableton Live, which is only our mixer today and our clock, we send the clock.
04:26
We start it. Okay. Now those things are running. How can you tell? Well, you can't, because they don't play any notes yet. So how about we actually use those lights to show you a bunch of things? So I had, like, so we can actually import inspect and see some of the source here.
04:44
So print, inspect to get source of this play function that we have here. List object doesn't have play, but the first sequencer is going to have play. Yes. So as you can see, all it does is it waits for the next beat.
05:00
Nothing very interesting. But I have this special thing that I can use, which is like a light show that's going to just show a bunch of blinking lights, right? We love blinking lights. So let's actually attempt this right now. So we can just say for any sequencer, let's replace the play with this light show. And now, okay, they actually blink in time.
05:22
This is good. However, you might notice that they will slow down if I slow down with the clock. So they're synchronized. This is good. I like this. Which means they're going to actually play in tempo. So a little annoying that there's too many of them. So we can turn them off, right? Let's do it quickly.
05:40
So we're only going to enable the ones that we want to use later on. Right. So if I enable a bunch of them, you can see they're going to be enabled actually in sync, right? So we can actually use this as a performance tool. Pretty cool. Right. But now, let's make some sounds appear. So first of all, in our sequencer one, we want to change our play function to do
06:04
something interesting. In Python, it's a little annoying here because I cannot just say def s1 play and self and just change stuff. That is not possible. So what I would like to do is to say s1 play and assign it to some function, right?
06:24
For example, I don't know, I would have this function that just essentially takes the self and just says, just as we had before, wait for beat, right? That would be the simplest thing that we can do here. But you will see that this actually raises an exception because the self is not passed
06:44
to an object. We need to play with a descriptor thing. So I made this sort of shortcut for me where I can show you how it works. Inspect get source, method on, that's how I call it. And it's a decorator which for a class only just assigns the function that we're
07:06
going to have under the decorator as an attribute. But for an object, we actually have to do the descriptor dance, right? So now we can actually say method on and start doing things. But that is still very verbose, so what I did is use this straight on a sequencer.
07:23
So if you see this, that just means it's method on sequencer one. And I can now say play self, and we can start actually emitting notes. Only if you emit a note now, let's say like zero is going to be the first note that is possible ever, we're not going to hear anything because we have
07:41
to say that this sequencer, the output goes to the drum machine. And soon enough, we should be hearing something, but we're not. Let's see what's going on. Joy of live demos. Right, sequencer one, which is right here, it is playing. Oh, it is not playing because it's dead, because it raised an exception.
08:02
We need to create a new one and now do the same thing. Ah, see, that's the thing. Now, now this is going to play or no. Okay, let's see what we can do with sequencer say nine on the base
08:21
and see if that works for us. So let's have play here and play a base note of C. So it's going to be say C to with velocity of 72. I cannot hear anything right now emitted, but we're going to debug this soon enough.
08:47
So with our MIDI out that we had base, we did emit successfully notes, right? So let's try this again and see what's going to happen now. That does play.
09:01
So there is sound. So what is going on here? I do have play, I do have everything. It doesn't emit anything, which is somewhat disappointing. Okay, now we're playing because I enabled the sequencer. That helps.
09:22
All right. It is a little aggressively doing things, so let's slow it a little bit down. For example, by saying wait for bar. So it's going to just play one note.
09:41
Now it's a base. Okay, cool. But I'm still a little disappointed by our kick not playing, right? The note 4 should play on our first sequencer. That should go here. We can see. Okay, sound should come here. So let's debug this together right now.
10:00
All right. We have a note. That note is 0. We are on the sequencer 1. Sequencer 1. Okay, output this drum. Okay, now we're talking. So we can now start it again.
10:21
Yeah, when I recreated the sequencer, I forgot to assign output to it again. Okay. Doing stuff live is really stressful, I can tell you this much. But I'm showing you a ripple, right? So essentially the music part is maybe a little bit secondary, right? Like, you know, let's just play with the colors here and see multi-line editing,
10:43
which works really nicely here. Right, so as you can see, the play thing, like, restarts after it finishes. So I don't actually have to loop anything. I could, but let's move to some more interesting melodies on the bass, since I brought it and
11:00
we're just playing one note. So now that we're back on track, we can actually do something interesting. So as you can see, we have the C thing here. And the reason why is that, like, C, and all the notes actually in MIDI are just numbers. So, like, C0 would be 12, C4 would be 60, but I don't remember all those things. So I can know that, like, C, like, every octave goes plus 12, but if you ask me, what
11:26
is F sharp, then I wouldn't really know, like, right away, like, of octave five. So I have all of those things. The only problem is that F sharp, I needed to type like this, because obviously there is no sharp in Python.
11:42
And you would think, well, I can actually assign nice variables, right, like, with Unicode, so I should be able to also do this with this magically nice character that is called, ugh, I cannot type and say this thing at the same time, music sharp sign. It is actually not hash.
12:01
It is this nice thing that, like, this is where the name C sharp comes from, right? So you would want to do, like, that C sharp is CS, because I want this, but we cannot have this for whatever reason, and I'm like, well, if I had some, like, god mode in Python and I could, like, you know, just type in some cheat codes, like, maybe I could have
12:22
this, but unfortunately this character is in the wrong Unicode block, so it is actively disallowed in Python, you know, to use as an identifier, maybe because it's confusingly close to something else, I don't know, but you know, like, in my day, when I was playing games and whatnot, like Doom or whatnot, you would just say IDD, QD, and stuff would happen,
12:47
so maybe now, asking the parser gods, we have the premium subscription level now to the parser, we can actually do this, and now we can actually be very musical
13:05
about those things, right? And I like this, but it is a little annoying for me to type this thing all the time, because, like, I need to, I cannot just type music sharp sign, I need to paste it in, that is not good, so if our REPL was in Python, I could maybe, from Py REPL, simple interact,
13:29
import, get reader, which is a line reader that we are using right now, invalid syntax, because I did something wrong here, actually, I don't call it, yeah, sure, so now, that
13:44
get reader is actually that reader that processes all that you're getting, so for example, it has this get Unicode method, and it actually returns what I just typed, right, okay, cool, so what if we use the method on reader and changed it, so now,
14:02
we have get Unicode, which normally, what it just does is it joins the buffer, but now we're going to return that, but replace some useless character that we'll never use in a REPL, like hash, and actually say that it's like a music
14:20
sharp sign, cool, does that look good to you, looks fine to me, right, so now, when we actually say C sharp, C hash, it is C sharp, so now we can actually
14:44
now do some melodies, right, so let's do them, the nice thing about those sequencers that I wrote and showed you is that there can be many of them, so we have already this bass note that is on the new bar, we can create another sequencer like sequencer 10, and out is going to be the bass, and the function
15:08
that we're going to put it on is going to wait a bit, like say, wait a beat, right, so self-wait for beat, and then it's going to play a bunch of
15:21
things, so let's do N16, so those are sixteenths of a bar, so it's shorter than N4, for it, that's a quarter of a bar, so now we can actually do like C2, we can do C3, we can do another C2, and we can do, I don't
15:44
know, like a G, right, let's just do G2, and let's wait for another bar, we just need to, now I know, turn it on actually, okay, cool, so I didn't bring
16:02
this entire thing just because it can do like those like very shy notes, like it can actually play like pretty aggressively, so just be prepared, what it has is like a really nice filter, which is now turned all the way down, but we can turn it up a little bit, so if we took another sequencer, like
16:21
11, also use it for bass, and say in our method that what we want to use is some kind of MIDI control, so here you have like a sustain pedal, you can have another that is an expression pedal, right, like a foot pedal, there can be a mod wheel that you have here and what's not, so
16:42
we can actually say this much, that I'm going to be changing the foot pedal with some values, they go from 0 to 127, so let's start with 127, and while V is bigger than 0, we're going to be sending the foot pedal with this value, and maybe waiting just for one pulse of
17:04
the MIDI clock, and let's see what's going to happen. It's something more interesting now, so now with S9, we can transpose the note that we have here to something more interesting, like
17:23
3 up, oh, because we just said that this is supposed to play
17:46
this particular note, it should still allow us to transpose our note, yeah I think so, let's try a higher note and see. Okay, so let's do something else for us for a bit, and I'm going to find
18:26
what is happening right now in due time. For example, I said that we have mod wheel, we have the foot controller, we can put this mod wheel higher, which will change the timer of the sound quite a bit,
18:41
and then we can play with some drums, and now if we change our sweep over those guys, we can change it to some more sensible values, and as you can see, the timer changes quite a bit.
19:11
So okay, let's keep it maybe at 30, and here like 90. So, this poor drum machine is only playing a single note right now,
19:23
let's actually use some more of those nice sounds that it provides. So here we are not doing much, so let's do something on sequencer 2. For example, hi-hat. Hi-hats are those interesting things, these were like symbols, but if you open a hi-hat and then play a close hi-hat, it's going to choke, which means stop playing the long one.
19:44
So let's start with the short one actually, and just do something more pythonic, because now we will only like, you know, just emitting, emitting, emitting just lines. Now we can actually just play with the fact that we have code here. So we're going to play a 16th,
20:04
and I need to count, this is the eighth note on the out, and the out is going to be drum, out is drum. Okay, that is very boring, but what we can say is, maybe if
20:21
random random is bigger than, I don't know, 0.3, or bigger than 0.7, that's actually 30%, right? Then we're going to wait for our 16th. Now it's random, it's more interesting, cool. That's very mechanic because it only uses the same volume here now, which is this default volume is probably 72 or something.
20:41
But again, we can say that it should use the volume 80, plus random random times, let's say 32. Now it's going to be some kind of variability in volume. Actually, let's super exaggerate it so we can actually hear this, what is going on here. So from zero, as you can see,
21:04
some of them are quieter, some of them are louder. We don't want that much variety, so let's just do this. And it's called humanization, it sounds more like what a human could actually play. Now with S3, we can again just do an output of drum and add our open hi-hat, which is going to be choked by this thing
21:25
every now and again. So let's just say it should wait an eight, and play an eight, and it's going to play an eight on the next note. And let's just say it should be like, let's see what's going to happen.
21:45
Okay, only what we just had, which is not a problem, because in the repo we can just come back where we were. Okay, and now actually assign this to three.
22:01
No, not this one, what am I doing? Okay, finally we have arrived. Okay, cool. So S4, let's also make this a drum and just make a snare, and then the entire beat, let's say it's now complete, right?
22:25
So S4 is going to be, so self, self, self. You know what, no, I'm sick and tired of writing self all the time. This is not good for life coding. What if I could have a shortcut, just write self for me? But you know, Python didn't really give me this functionality
22:43
that seriously there should be a pep. But there is nothing like that. But if this was written in Python, I could maybe say, from pyrepl commands, import command, and just say that I really want a comment that is, I don't know, some auto-self thing.
23:01
And when it's done, what I want is for the reader, you already met the reader, so just insert self dot. Would that be cool? I think it would be cool. But you know, now how does it know about the command? Well, the reader that we already know, we would need to say that it's commands, we name this as auto-self, we assign it as auto-self,
23:23
and now we have to bind it to some shortcut, let's say control S, because who needs forward searching in Oracle? So let's just actually assign this to this named command that is auto-self. So now I can press control S, enter self.
23:42
That's going to be faster. Maybe we'll even finish in time. Right. So, again, S4. Let's do this thing, and maybe I'm going to remember to actually use the shortcut I just defined. So first let's wait for a quarter,
24:01
and just play a note that is a quarter, like the snare that is note one on the drum machine. But I need to turn it on? No, it is turned on. S4, one, two, three, four. Did I actually say that it's a drum? I did say it's a drum.
24:21
One, two, three, four, it is playing, so what is happening right now? Oh, I just don't hear it in the monitor. Okay, so if you hear it, that's good. For me to hear it, maybe let's just make it super loud. Okay, now I hear it too. Okay, cool.
24:41
So now I have this third synthesizer that so far has been a little bit underutilized by us. So maybe we can utilize it. So now that we have this magic functionality of being able to define some phrases or note melodies, we can just say, like, you know, phrase equals,
25:00
and let's say, C5, G5, A sharp 5, because now we can say that, right? And then F5, and then maybe C6. Okay, those are some notes. So now on the third place here, what we're going to do is what?
25:21
One, nine, 17, S17. We're going to want to play, let's say, sixth. One of those notes. So again, random choice from phrase.
25:41
This is going to play something as soon as I set the output to Iridium and actually turn it on. I hear it now because I cannot, but we're going to fix this soon enough. I know already what happened. Iridium is kind of weird, and it wants a different MIDI channel.
26:03
Okay. Right, so now we have some melody happening, and we can maybe attempt this transposing because I wanted to show you transposing, which I made, like, built in into this sort of thing, and it didn't do anything. If it really is opposing us, we're just going to re-implement it right now.
26:21
So let's see what's going to happen. So S1 has a transpose of zero. If we set it to three, good. I can actually prove to you that it should do something. Buy, print, inspect, get source, S1n.
26:48
That is a generic method to play notes. And as you can see, there is self T, and if we have a T, then it should transport. For whatever reason, it doesn't. It's probably a very stupid reason,
27:01
and I'm going to be very disappointed and ashamed when I see the video later on. But since this thing doesn't really want us to have transposition built in, we can just re-implement it. So for S1, I was already printing our notes nicely.
27:23
That's S1. That's the kick drum, I'm sorry. So S9, actually. S9. Yeah, that's the one. We can actually just give it plus T here ourselves and see what's going to happen.
28:13
So since those parameters are sort of interesting, but it is very boring for you to just see me just type things in to change them, we can use another sequencer
28:21
to just do that automatically for us. So let's actually do that now. So we have 1, 9, 17, plus another 8. That would be 25. So let's take our sequencer 25, and the only thing that it's going to be doing is it's going to be setting this note to something
28:43
and then waiting for bar and then setting it to something else like this higher version. And then let's wait for another bar. And now, oh no, not a self. S9, T5.
29:00
And now I'll wait for another bar. And now, I don't know, let's do it with a high note. Okay, I again need to make sure that plays. Let's see. Okay.
29:20
Something is playing, definitely. That's good news for us. What's even interesting is like now I can actually do like calculations on this. So for example, I can say I want to know what's the transposition that I would need between those two notes.
29:41
And it's going to calculate the actual thing that I need. Okay. And it plays, right? And I can say disable the hi-hats if you want.
30:09
All those bubbles, we can also disable them. So if you already expect that there's something weird that is happening here, good for you.
30:21
If you don't, I might share a secret now. Now that you see all those things playing. And in fact, what is happening is each of those sequencers, right, is okay, that's a type, that much we already knew. But let's say, we actually check, what?
30:44
It's just a tuple, I guess, of course. This is in fact the thread, right? So all those things that I have here are in fact threads. And this thing that I'm showing you would not be possible for me to demonstrate on Python 3.12.
31:02
And the reason why not is that as Gil on his self says, I like self now. Yeah, the Gil is disabled, right? So all of this are actual threads running super free on this particular laptop
31:21
that only has 10 cores, but 64 threads are fine for that. You can use quite a lot of computation there and one thread that hogs a core will not cause the others to stop responding. So this is something that actually now allows us
31:40
to do pretty much real-time programming with Python and actually utilize all the hardware that you have here, which I find really fun. And also if we actually go back and edit all those sequencers that I've been showing, this is really something that like, imagine doing this in 3.12 in the old REPL. There's probably no one to do that, right?
32:03
But now with Python 3.13 or 3.14 with the premium subscription to the parser, we can actually get pretty far with this. So I like all of this. And the thing that I like the most about this is that this is really now actually a performance tool.
32:21
You can do a lot of things with this where it starts doing a thing and it's perfectly fine for you to just now play on top of this. So you can play, I don't know, like a fill on the drum machine, right? Or you can just go ahead and play this guy, right?
33:13
What else can I show you really here? There is plenty of stuff that is now available in Py REPL and you can hack on things.
33:21
I showed you two examples there. The thing that I would want to instill in you, as much as it is fun, Py REPL is still imported from underscore Py REPL. So I invite you to hack on Python. I invite you to see how that thing works. But don't write production code on this
33:41
because it's underscore Py REPL. We might change it still quite a bit later on. But it's now in Python, which means it is very easy for you to contribute to it, which I find extremely interesting because you think, okay, maybe somebody else is going to contribute.
34:00
We saw like a boom, like an explosion of contributors just because that piece of Python is now in Python. And if that actually sounds interesting and what I showed sounds interesting, we have plenty of bugs and we have plenty of features that we would like for Python 3.14 like syntax highlighting,
34:20
like more niceties that you can add. Because now we have the comments that you already know, like if you can do F1 and you have help and you say quit to leave help and whatnot. That is all cute. We even have to clear the screen as a command. We can add more of that stuff. We can actually make things more helpful to the user later.
34:42
You can hack on this tomorrow at the sprint. There is a C Python sprint and Pyreple is a perfectly fine entrance to contributing to Python. So right, let's now have some questions since normally I don't take questions at keynotes or at my talks because I say I'm here all week.
35:01
You can see me at the rest of the conference, but since there is not a rest of the conference after this, if you have any questions, let's have them now. Let me just stop the thing. So do you see this new repo replacing IPython in the near future?
35:38
Or do you know about some things that are in IPython
35:42
and you don't expect them to make their way into this new repo? Right, we don't intend to compete with IPython. There's plenty of really bad decisions that IPython made. No, what you need to understand is the repo that we have in Python right now, thanks to Carol insisting on it,
36:02
is available on all tier one platforms of Python. It is there by default. We support it. So it is still in many ways limited compared to what IPython allows you to do. IPython has magics that are extremely useful for many things. I don't foresee us actually implementing this.
36:20
This is a little bit too out there because people will have different opinions on where that should go. So IPython, we don't intend to remove the need for it, we don't intend to replace it. In fact, very often when people come to us and say, oh, this new repo is great, however it behaves different from IPython,
36:41
this on its own is not yet a valid bug report for us. Maybe the way the repo for us behaves right now is insane and then like, okay, IPython doing something else is a good kind of anecdotal evidence that we should do something else, but we don't intend to copy it.
37:00
I see there's another question. Do you have an album? Yes, indeed, I do. So first of all, you might have seen this in the repo at first, but maybe you forgot it now.
37:22
If you are into this sort of stuff, you can just see the document right there. And what I can show you is, yeah, I indeed do some music on the side. Let's see what it's going to show you now. Firefox be a little faster to people here.
37:42
Come on. World cost multitasking, see? That's no gill right now. Free-threaded Python. Right, so Replicator, RPLKTR, since I don't like the obvious things that you can do.
38:03
So releases, yeah, I did in fact release an album that is on streaming and whatnot. So you can check whether things that I actually do at home are a little more refined than what I should have written right now, which I hope they are. Right, yes.
38:24
Thanks for sharing the cheat code to get the sharp signs. Everybody wants to know here, what's the cheat code to be able to use emoji as identifiers? Emoji as identifiers. So you mean like what? Like if I actually went to the editor right now
38:42
and actually attempted like this sign and say one, that's a premium subscription, you can do anything. So you can print this thing and it's going to print one. Once you figure out what was wrong with the transposition thing,
39:11
will you tell us? Oh yeah, I will post about it on Mastodon. If I figure out why that thing wasn't actually doing anything, but when we did it manually, it did.
39:22
But fortunately we were live coding so we could fix it right away. I have a question related to the emojis. Is it possible for those character replacements to be on compound characters so you can like type ASCII emoji and if you place it to the Unicode emoji?
39:40
Can you rephrase? So I mean like for example if you want to type in like semicolon parenthesis, that would be two characters. Would you be able to replace that with the emoji, the Unicode emoji, smile emoji? So basically when you did the C sharp replacement, is that only one character? Or if you can do it for compound? We could hack PyRepo to do this,
40:02
but, and like you know kind of a senior engineer is now looking me in the eye, like you already know that if you're replacing two characters with one, things are going to be wonky in the REPL. So you need to be a little more careful to actually do this transformation. This one I could just type in like three lines of code, replacing one character with two or two with one and so on and so on.
40:23
That would be a tiny bit more complicated to get right. But yes, we could do that. All right, no further questions. Thank you very much. I have some time to pack up before lightning talks.