<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: clx75</title><link>https://news.ycombinator.com/user?id=clx75</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 19 Oct 2026 04:39:48 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=clx75" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by clx75 in "DeepSeek-v4.1-Flash-1017"]]></title><description><![CDATA[
<p>Yes, this is indeed possible.</p>
]]></description><pubDate>Sun, 18 Oct 2026 16:03:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=50142266</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=50142266</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50142266</guid></item><item><title><![CDATA[New comment by clx75 in "DeepSeek-v4.1-Flash-1017"]]></title><description><![CDATA[
<p>The idea behind using Luna was cost-optimization.<p>I wrote a Pi extension called "model-escalation" which lets the model request an automatic switch to a smarter model for the next turn if it thinks the problem it is struggling with is too complex or if the user explicitly asks it to do so.<p>With this extension in hand, I could split the work between Luna and Sol, resulting in a ~95%-5% split. I don't have to switch to Sol when review time comes, Luna does it automatically. Sol tells its remarks, then Luna gets the control back and continues the back&forth (if there are still complaints).</p>
]]></description><pubDate>Sat, 17 Oct 2026 17:22:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=50133029</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=50133029</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50133029</guid></item><item><title><![CDATA[New comment by clx75 in "DeepSeek-v4.1-Flash-1017"]]></title><description><![CDATA[
<p>These files came to be after I've seen Deepseek create them for itself to track progress.<p>Then I turned what Deepseek did into an upfront policy.<p>This seems to work quite well generally: watch the agent as it works, and think what could be provided to make its life as easy as possible</p>
]]></description><pubDate>Sat, 17 Oct 2026 12:30:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=50130535</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=50130535</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50130535</guid></item><item><title><![CDATA[New comment by clx75 in "DeepSeek-v4.1-Flash-1017"]]></title><description><![CDATA[
<p>Probably a week ago someone posted a thread with the title "Why isn't the industry freaking out about DeepSeek 4.1 Flash?"<p>I have been intrigued about Chinese models for a long time, but never tried anything except an early Qwen. My daily driver was Luna, with occasional elevation to Terra or Sol - all on 5.6 as I found the output of 6 jarringly incomprehensible.<p>I still had 95 USD on my OpenRouter account, so I thought I would give DeepSeek Flash 4.1 a try.<p>I think now I can understand the person who created that thread.<p>Here is the setup I settled on, after a lot of refactoring and calibration of the workflow:<p>I have a "plan" prompt which explains to the agent (Luna) that I want to have a discussion about an idea I have in mind. The agent should use the Socratic method to pull out all the necessary info from me using pointed questions. When the agent feels it has a complete picture, it should elevate to a higher level model (Sol), and ask its review. If Sol has complaints, Luna keeps asking me until the points raised by Sol are clarified. The review rounds with Sol continue until Sol says "ready to implement".<p>At this point Luna creates four files in a directory I specify:<p>1. PLAN.md: the implementation plan with all the details that came out from the design discussion
2. PHASES.md: implementation phases
3. DECISIONS.md: design decisions (this serves the same role as ADRs aka. architectural decision records)
4. DIARY.md: append-only log of what happened during implementation<p>Files 2-4 are written by the implementing agent. Luna only adds headers to explain the purpose of the files.<p>Once these files are there, I start up a new Pi session, switch to Deepseek 4.1 Flash and then point it to this plan folder.<p>And then it goes brrrrr... :-)<p>Here is what I implemented in the past week using this method:<p>1. A capture/analysis/decompilation pipeline for C64 demos: I ask the agent to start a selected demo through VICE, and say "on" or "off" when I want it to start/stop capture. The capture process uses VICE's builtin trace functionality: the trace log is piped into Clojure where it is saved into an optimized binary format (chunks of trace events). Once I have everything captured, I unleash my analysis pipeline which checks the write patterns of the executed code: what it wrote (VIC, SID, CIA, memory) and when (rasterline, cycle). Then it splits the execution trace into segments by type deduced from the write patterns (decruncher, loader, raster, music) and then decompiles each segment into both traditional ASM files and a s-exp based syntax which roundtrips back into the in-memory representation. Once I have the results of the analysis pipeline, I can tell the agent to analyze any demopart and it can explain how the effects are built down to the tiniest timing detail. As a first test, I asked it to create a clean-room implementation of Fairlight's legendary intro and two days later I had it, with everything in sexp assembly, including the music routine and its data. (The reason it took so long was that this was the first decomp and it provided a lot of feedback to the pipeline development.) Finally I had it write an assembler, linker and packager which creates a PRG from the assembled and linked artifact, then runs it through VICE. Done.<p>2. A DSP compiler which lets me compile sexp forms of a C-like DSP language into native DSP kernels running on the JVM, JS and WASM. Currently I have about 600 tests which verify that the behavior of the three targets matches that of a reference interpreter written in Clojure. I have a full numeric tower with i32, f32, f64, support for arrays and structs, typical control flow constructs, and a library of DSP building blocks like oscillators, filters, LFOs, delays and a chorus effect. By the time this is ready (end of the weekend?), I will be able to build synthesizers like Synth1, Surge XT or Vital in Clojure/Script, compile the DSP kernels in the browser, choosing between JS or WASM backends, driving the kernels via AudioWorklets and sequencing them from the host language.<p>There are two power tools at play here:<p>1. Deepseek Flash 4.1
2. Clojure and ClojureScript<p>Deepseek is a BEAST. It just goes on and delivers, phase after phase. What it needs: clear instructions - this is covered by the planning process quite well, but I still find it needs some steering from time to time (the right nudget of wisdom dropped into its thought stream at the right moment works wonders)<p>And Clojure... well. That article PG wrote about LISP (Beating the averages): what I witness now proves all of those claims.<p>The agent LOVES Clojure. Especially the REPL (not so much the parentheses).<p>Winning strategy: give it two tools: start_jvm and clojure_eval. Implement everything else it may need - tools to start up HTTP servers, compile ClojureScript, add dependencies, capture a C64 demo, run Playwright via spel, etc. - as lightweight Clojure namespaces which provide APIs to all these functionality. Let these namespaces be thin: the namespace and the functions therein shall have docstrings which tell the agent what the functions do, but the functions themselves shall be lightweight proxies to the real implementations in sub-namespaces. Then point the agent to these top-level API namespaces via your AGENTS.md. Bam, instant discoverability with minimal context usage. It will do EVERYTHING through clojure_eval and the round-trip time will be phenomenal, a perfect match to the raw speed of the agent.<p>...<p>Now all I need to figure out is what will I do when all my dreams become manifest in flesh.</p>
]]></description><pubDate>Sat, 17 Oct 2026 11:29:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=50130128</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=50130128</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50130128</guid></item><item><title><![CDATA[New comment by clx75 in "Why Common Lisp is now the best programming language"]]></title><description><![CDATA[
<p>I developed my own:<p><a href="https://github.com/cellux/pi-extensions/tree/master/extensions/cellux-pi-clojure-agent" rel="nofollow">https://github.com/cellux/pi-extensions/tree/master/extensio...</a><p>Note that this may not work for you standalone as it relies on my other agent-sandbox extension (which ensures all agent operations happen inside a sandbox container).<p>But point an LLM to its source code and it will extract the gist of it.</p>
]]></description><pubDate>Tue, 06 Oct 2026 06:25:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=49974935</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=49974935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49974935</guid></item><item><title><![CDATA[New comment by clx75 in "Why Common Lisp is now the best programming language"]]></title><description><![CDATA[
<p>I have similar experiences in Clojure. I use Pi and created an extension which teaches the LLM how to start a JVM with a Clojure nREPL listening in it. Added a tool which lets the agent evaluate any Clojure form inside the JVM. Sprinkled the setup with clj-reload and now the agent is using the nREPL as if it were its second nature.<p>What I like most is how fast testing goes: it modifies test code on disk, asks clj-reload to reload all affected namespaces, then reruns the tests. It's also fun to see how it verifies its assumptions by evaluating short programs through the nREPL.<p>I asked it to organize the various subsystems inside my playground repo into Integrant systems and make it possible for me to say things like "restart the http subsystem".<p>It also understands shadow-cljs: I replicated the necessary parts of the shadow CLI tooling in Clojure; now I can compile, watch and serve any number of CLJS apps located in various namespaces from inside the same JVM. There is no need to touch the command line any more: I just instruct the agent to start a particular CLJS app and it's there.</p>
]]></description><pubDate>Tue, 06 Oct 2026 05:50:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=49974701</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=49974701</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49974701</guid></item><item><title><![CDATA[New comment by clx75 in "Improving 15 LLMs at Coding in One Afternoon. Only the Harness Changed"]]></title><description><![CDATA[
<p>Tool definitions: <a href="https://github.com/cellux/dotfiles/blob/master/.emacs.d/rb-gptel.el" rel="nofollow">https://github.com/cellux/dotfiles/blob/master/.emacs.d/rb-g...</a><p>Implementation: <a href="https://github.com/cellux/dotfiles/blob/master/.emacs.d/rb-ts.el" rel="nofollow">https://github.com/cellux/dotfiles/blob/master/.emacs.d/rb-t...</a></p>
]]></description><pubDate>Thu, 12 Feb 2026 17:49:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=46992245</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=46992245</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46992245</guid></item><item><title><![CDATA[New comment by clx75 in "Improving 15 LLMs at Coding in One Afternoon. Only the Harness Changed"]]></title><description><![CDATA[
<p>During my first LLM experiments in Emacs using gptel, I also found that the LLM has considerable difficulties changing source code files with the Unix patch tool.<p>As Emacs has a built-in tree-sitter package, I implemented this same idea. I created gptel tools like tree_sitter_list_nodes, tree_sitter_get_nodes, tree_sitter_update_nodes, tree_sitter_insert_before_node and tree_sitter_insert_after_node. The "list" tool returns a list of AST nodes with first line number, first line content and node hash. The LLM can then use "get" to collect interesting nodes in their entirety and "update" to update a list of nodes identified by hash with new content (var/function bodies).<p>Worked like a charm.</p>
]]></description><pubDate>Thu, 12 Feb 2026 16:10:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46990575</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=46990575</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46990575</guid></item><item><title><![CDATA[New comment by clx75 in "Ask HN: What Are You Working On? (Nov 2025)"]]></title><description><![CDATA[
<p>1. Langsam - <a href="https://github.com/cellux/langsam" rel="nofollow">https://github.com/cellux/langsam</a><p>This is an AST-walking interpreter for my personal LISP dialect written in C. Once it's ready, I would use it to implement a low-level, statically typed language (Schnell) as a Langsam library. The goal is to gain the ability to JIT-compile Schnell code (sexps of a statically typed language) from Langsam. Once this works, I would rewrite Langsam in Schnell so that it becomes a fast bytecode interpreter. With the faster Langsam (and the Schnell built into it) I could build a little OS called "Oben". The OS would first run on top of Linux, then I would attempt to bootstrap the entire stack on bare-metal. I already have a Forth dialect implemented in assembly language (Grund/Boden). The idea is to implement Langsam in Grund and then bootstrap the entire Grund -> Langsam -> Schnell -> Oben chain on something like the qemu q35, later on a Raspberry Pi Zero 2W and maybe even my own hardware (ie. an FPGA board like what Wirth et al. created for Project Oberon).<p>2. MTrak - <a href="https://github.com/cellux/mtrak" rel="nofollow">https://github.com/cellux/mtrak</a><p>This is a TUI MIDI tracker written in Go. Not too user-friendly: one has to enter raw MIDI messages in hex into the tracks. Can be connected to synths like Fluidsynth or Surge XT via JACK MIDI. Unfortunately it takes a lot of CPU time, probably due to the use of BubbleTea (and no time spent on optimization).<p>3. Mixtape - <a href="https://github.com/cellux/mixtape" rel="nofollow">https://github.com/cellux/mixtape</a><p>Beginnings of a programmable, non-realtime audio sample generator/manipulator written in Go with an OpenGL GUI. I was thinking about how people in the old times cut up the magnetic tape which contained the sound bites and rearranged them to build something new. What if I'd implement a data type called "tape" which is basically a piece of sound and then provide operators in a Forth-like language to create and manipulate such tapes. Each tape could be a sound and then these could be stitched together to form songs. Who knows maybe an entire song could be represented as a hierarchy of these tapes. Each sound or song section could be its own file (*.tape), these could be loaded from each other, maybe even caching the WAV generated from the code of a tape to speed things up when there is a huge hierarchy of tapes in a project. Lots of interesting ideas are brewing in this one.</p>
]]></description><pubDate>Mon, 10 Nov 2025 09:00:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=45873973</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=45873973</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45873973</guid></item><item><title><![CDATA[New comment by clx75 in "Ask HN: What cool skill or project interests you, but feels out of reach?"]]></title><description><![CDATA[
<p>I am fascinated by the idea of building something like the Lisp Machines or Smalltalk 80 from scratch. Build a Forth in assembly, build a Lisp in Forth, build an OS and computing environment in Lisp. AOT-compile only the Forth interpreter, load and compile the rest from source during system boot, maybe with later stages optimizing the previous stages as the system is assembling itself.<p>I imagine two languages - Langsam and Schnell - intertwined in some sort of yin-yang fashion. Langsam is slow, dynamic, interpreted, Schnell is fast, static, compiled. Both would be LISPs. Schnell would be implemented as a library in Langsam. If you said (define (add x y) (+ x y)) in Langsam, you would get a Langsam function. If you said (s:define (add (x int) (y int)) (+ x y)) in Langsam, you would get a Langsam function which is a wrapper over a JIT-compiled Schnell function. If you invoke it, the wrapper takes care of the FFI, execution happens at C speed. Most of the complexity typical of a low-level compiled language could be moved into Langsam. I could have sophisticated type systems and C++ template like code generation implemented in a comfortable high level language.<p>This latter part I managed to partially implement in Clojure and it works (via LLVM), it would be just too much effort to get it completed.</p>
]]></description><pubDate>Wed, 11 Jun 2025 12:55:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=44247114</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=44247114</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44247114</guid></item><item><title><![CDATA[New comment by clx75 in "So you wanna write Kubernetes controllers?"]]></title><description><![CDATA[
<p>Yes, we started with Kopf.<p>As we understood it, Kopf lets you build an entire operator in Python, with the watch/update/cache/expansion logic all implemented in Python. But the first operator we wrote in it just didn't feel right. We had to talk to the K8S API from Python to do all the expansions. It was too complex. We also had aesthetic issues with the Kopf API.<p>Metacontroller gave us a small, Go binary which takes care of all the complex parts (watch/update/cache). Having to write only the expansion part in Python felt like a great simplification - especially now that we have Pydantic.</p>
]]></description><pubDate>Mon, 27 Jan 2025 05:58:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=42837881</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=42837881</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42837881</guid></item><item><title><![CDATA[New comment by clx75 in "So you wanna write Kubernetes controllers?"]]></title><description><![CDATA[
<p>Some of the resources are short-lived, including jobs and dev containers. The corresponding CRs are created/updated/deleted directly in the cluster by the project users through a REST API. For these, expansion of the CR into child resources must happen dynamically.<p>Other CRs are realized through imperative commands executed against a REST API. Prime example is KeycloakRealm and KeycloakClient which translate into API calls to Keycloak, or FSXFileSystem which needs Boto3 to talk to AWS (at least for now, until FSXFileSystem is also implemented in ACK).<p>For long-lived resources up-front (compile time?) expansion would be possible, we just don't know where to put the expansion code. Currently long-lived resource CRs are stored in Git, deployment is handled with Flux. When projects want an extra resource, we just commit it to Git under their project-resources folder. I guess we could somehow add an extra step here - running a script? - which would do the expansion and store the children in Git before merging desired state into the nonprod/prod branches, I'm just not clear on how to do this in a way that feels nice.<p>Currently the entire stack can be run on a developer's laptop, thanks to the magic of Tilt. In local dev it comes really handy that you can just change a CRs and the children are synced immediately.<p>Drawbacks we identified so far:<p>If we change the expansion logic, child resources of existing parents are (eventually) regenerated using the new logic. This can be a bad thing - for example jobs (which expand into Argo Workflows) should not change while they are running. Currently the only idea we have to mitigate this problem is storing the initial expansion into a ConfigMap and returning the original expansion from this "expansion cache" if it exists at later syncs.<p>Sometimes the Metacontroller plugin cannot be a pure function and executing the side effects introduces latency into the sync. This didn't cause any problems so far but maybe will as it goes against the Metacontroller design expressed in the docs.<p>Python is a memory hog, our biggest controllers can take ~200M.</p>
]]></description><pubDate>Mon, 27 Jan 2025 05:30:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=42837737</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=42837737</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42837737</guid></item><item><title><![CDATA[New comment by clx75 in "So you wanna write Kubernetes controllers?"]]></title><description><![CDATA[
<p>At work we are using Metacontroller to implement our "operators". Quoted because these are not real operators but rather Metacontroller plugins, written in Python. All the watch and update logic - plus the resource caching - is outsourced to Metacontroller (which is written in Go). We define - via its CompositeController or DecoratorController CRDs - what kind of resources it should watch and which web service it should call into when it detects a change. The web service speaks plain HTTP (or HTTPS if you want).<p>In case of a CompositeController, the web service gets the created/updated/deleted parent resource and any already existing child resources (initially none). The web service then analyzes the parent and existing children, then responds with the list of child resources whose existence and state Metacontroller should ensure in the cluster. If something is left out from the response compared to a previous response, it is deleted.<p>Things we implemented using this pattern:<p>- Project: declarative description of a company project, child resources include a namespace, service account, IAM role, SMB/S3/FSX PVs and PVCs generated for project volumes (defined under spec.volumes in the Project CR), ingresses for a set of standard apps<p>- Job: high-level description of a DAG of containers, the web service works as a compiler which translates this high-level description into an Argo Workflow (this will be the child)<p>- Container: defines a dev container, expands into a pod running an sshd and a Contour HTTPProxy (TCP proxy) which forwards TLS-wrapped SSH traffic to the sshd service<p>- KeycloakClient: here the web service is not pure - it talks to the Keycloak Admin REST API and creates/updates a client in Keycloak whose parameters are given by the CRD spec<p>So far this works pretty well and makes writing controllers a breeze - at least compared to the standard kubebuilder approach.<p><a href="https://metacontroller.github.io/metacontroller/intro.html" rel="nofollow">https://metacontroller.github.io/metacontroller/intro.html</a></p>
]]></description><pubDate>Sun, 26 Jan 2025 20:59:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=42834049</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=42834049</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42834049</guid></item><item><title><![CDATA[New comment by clx75 in "Ask HN: Problems for the next decade?"]]></title><description><![CDATA[
<p>Based on my personal experience with psychedelics I used to think that these medicines could be a tool to wake people up. Actually, after seeing what else has been tried and failed, I came to the conclusion that psychedelics are the _only_ reliable tool in this arena because of their power. I sincerely thought that psychedelics could make people reconnect to the reality of how things really are. That if they wake up to reality, they would 1.) freak out about our situation and then have an incentive to restrain from doing the "bad" things and 2.) rediscover this deep connection with Nature which is the only viable basis for a harmonious relationship with it.<p>Unfortunately during the decades I lost my faith even in this. Apparently to have this kind of experience on a psychedelic it's not enough to just dose someone. Of 1000 people taking psychedelics, maybe 1 gets such an experience. And although the scientists at Johns Hopkins try to figure out how to increase that percentage, it's still not enough.<p>Nowadays I tend to think that all of this is a God's dream and this God for some reason does not want to wake up too soon from its dream.</p>
]]></description><pubDate>Mon, 10 Jul 2023 09:52:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=36664077</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=36664077</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36664077</guid></item><item><title><![CDATA[New comment by clx75 in "Congress.gov API"]]></title><description><![CDATA[
<p>Or if laws were executable descriptions of how to make certain changes to world state.<p>There could be some sort of VM (state machine?) which executes these laws (programs). A queue accepts change requests from the edges, e.g. citizen1 wants to sell her car to citizen2 would generate a change request. The queue processor validates the change request, finds the appropriate reducer (= law) for it, applies the reducer to current world state + change request and derive the new world state.<p>The programs (laws) themselves could also be objects of the world state. Changing the law is then another change request (self-modifying code).<p>One big issue with this is that the reducers should probably also work at the edges. Paying with a credit card in a shop should work even if the Internet is down. Diverging state histories should be the norm not an exception. We should figure out how to ensure we can always resolve the merge conflicts.</p>
]]></description><pubDate>Fri, 09 Sep 2022 13:32:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=32778995</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=32778995</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32778995</guid></item><item><title><![CDATA[New comment by clx75 in "Starting Your Computer Music Journey with Clojure and Overtone in Emacs"]]></title><description><![CDATA[
<p>I'm really fond of the idea of writing music like this.<p>From all available implementations of the idea, I probably like Extempore (<a href="https://github.com/digego/extempore" rel="nofollow">https://github.com/digego/extempore</a>) the most. Extempore provides a low-level C-like language (xtlang) which compiles into LLVM and can be meta-programmed from a variant of Scheme (TinyScheme I believe). This arrangement makes it possible to generate the code for the audio graph from Scheme, compile/optimize it via LLVM, then drive it in a live-coding fashion from Emacs. Best of both worlds (high and low).<p>My personal, much simpler attempt in this space is Cowbells (<a href="https://github.com/omkamra/cowbells" rel="nofollow">https://github.com/omkamra/cowbells</a>) - with this one you can live-code FluidSynth (MIDI soundfonts) from Clojure + CIDER + Emacs, representing musical phrases either via Clojure data structures or an alternative text-based syntax (which is translated into the former by a compiler).</p>
]]></description><pubDate>Sun, 10 Apr 2022 05:51:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=30974737</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=30974737</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30974737</guid></item><item><title><![CDATA[Show HN: Cowbells – A Clojure library for musical experiments and live coding]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/omkamra/cowbells">https://github.com/omkamra/cowbells</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=29649608">https://news.ycombinator.com/item?id=29649608</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 22 Dec 2021 14:18:47 +0000</pubDate><link>https://github.com/omkamra/cowbells</link><dc:creator>clx75</dc:creator><comments>https://news.ycombinator.com/item?id=29649608</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29649608</guid></item></channel></rss>