lefteros_by SomniusX
EN ↗Πες ένα γεια

22 Οκτωβρίου 2026 / Lefteris Iliadis / SomniusX

Τριξίματα στον ήχο του Renoise στο Omarchy: η διόρθωση με realtime, χωρίς rtkit

22 Οκτωβρίου 2026

Το Renoise έτριζε και έκανε ποπ στο Omarchy γιατί τίποτα στο σύστημα δεν είχε realtime προτεραιότητα, ούτε καν το PipeWire. Η διόρθωση είναι realtime-privileges και η ομάδα realtime, πλήρης επανεκκίνηση (η αποσύνδεση δεν αρκεί όταν το lingering είναι ενεργό) και JACK στα 48 kHz μέσα στο Renoise. Το rtkit σε αυτό το σύστημα σκότωνε κάθε πρόγραμμα ALSA, οπότε όχι.

Τριξίματα στον ήχο του Renoise στο Omarchy: η διόρθωση με realtime, χωρίς rtkit

Έβαλα το demo του Renoise 3.5.4 στο Omarchy (Arch + Hyprland, PipeWire 1.6.9) και η αναπαραγωγή έτριζε. Κλικ σε κανονικά διαστήματα σε όλη τη διάρκεια, τόσο καθαρά που ακούγονταν και σε μια εγγραφή οθόνης. Τελικά το πρόβλημα δεν ήταν καθόλου το Renoise: τίποτα στο σύστημα δεν είχε realtime προτεραιότητα, ούτε καν το PipeWire. Άρα αφορά όποιον κάνει ήχο στο Omarchy, με οποιοδήποτε DAW. Πρώτα η σύντομη εκδοχή, μετά το γιατί.

TL;DR: η διόρθωση

sudo pacman -S realtime-privileges
sudo gpasswd -a $USER realtime
# ΜΗΝ εγκαταστήσετε rtkit σε αυτό το σύστημα (δείτε παρακάτω)
sudo reboot

Η αποσύνδεση δεν αρκεί, το εξηγώ πιο κάτω. Μετά την επανεκκίνηση, στο Renoise πηγαίνετε Preferences > Audio, αλλάξτε τη συσκευή από ALSA σε JACK και βάλτε 48000 Hz. Αυτό ήταν, ο ήχος έπαιξε τέλεια.

Το σύμπτωμα

Το Renoise έγραφε στο log του σε κάθε εκκίνηση, και το έβγαζε και σε παράθυρο:

Failed to create a RealTime priority thread for ALSA. Will create a non RT thread instead... It is highly recommended to use RealTime priority audio threads with ALSA AND Jack

Γιατί συνέβαινε

  • Το ulimit -r ήταν 0, ο χρήστης μου δεν ήταν σε καμία ομάδα realtime και το rtkit δεν ήταν εγκατεστημένο. Το ίδιο το PipeWire έγραφε στην εκκίνηση mod.rt: RTKit error: org.freedesktop.DBus.Error.ServiceUnknown και έτρεχε τα νήματα ήχου του σαν κανονικές διεργασίες. Στη δική μου εγκατάσταση Omarchy, τίποτα δεν έπαιρνε realtime από μόνο του.
  • Επιπλέον, το Renoise χρησιμοποιούσε τη συσκευή ALSA default (το ALSA plugin του PipeWire) στα 44100 Hz, ενώ ο γράφος του PipeWire τρέχει στα 48000 Hz (clock.allowed-rates [48000]), και με μικρό buffer: 3 περίοδοι των 288 frames, 864 frames συνολικά, περίπου 20 ms. Resampling, μικροσκοπικό buffer και καμία προτεραιότητα: κλικ.

Η παγίδα του rtkit

Η πρώτη μου προσπάθεια ήταν η συνηθισμένη συνταγή του Arch: rtkit μαζί με realtime-privileges, και ο χρήστης μου στην ομάδα realtime. Η ομάδα δίνει rtprio 98, απεριόριστο memlock και nice -11 μέσω του /etc/security/limits.d/99-realtime-privileges.conf.

Έκπληξη: με το rtkit εγκατεστημένο, το Renoise σκοτωνόταν λίγα δευτερόλεπτα μετά την εκκίνηση. Έδειχνε το παράθυρο με την προειδοποίηση για το RT, και μετά «Killed», κωδικός εξόδου 137 (SIGKILL). Το αναπαρήγαγα χωρίς Renoise:

aplay -D default -t raw -f S16_LE -r 44100 -c 2 -d 3 /dev/zero

Κι αυτό Killed, 137, περίπου ένα δευτερόλεπτο αφού το rtkit έγραψε «Successfully made thread ... RT at priority 1». Δηλαδή σε αυτό το σύστημα κάθε πρόγραμμα ALSA σκοτωνόταν τη στιγμή που το rtkit έκανε το νήμα του realtime. Τον ακριβή μηχανισμό του πυρήνα δεν τον απέδειξα· ο πυρήνας δεν γράφει τίποτα γι' αυτό. Η πιθανή εξήγηση είναι το όριο χρόνου CPU για realtime που συνοδεύει τις παραχωρήσεις του rtkit, αλλά είναι πιθανή εξήγηση, όχι αποδεδειγμένη.

Αφαιρώντας το rtkit (sudo pacman -R rtkit) και κρατώντας το realtime-privileges, το τεστ με το aplay γύρισε σε έξοδο 0.

Η παγίδα του lingering

Αποσύνδεση και ξανά σύνδεση δεν έκαναν τίποτα. Το lingering ήταν ενεργό για τον χρήστη μου (το loginctl show-user $USER -p Linger λέει yes), και με lingering οι υπηρεσίες χρήστη δεν ξαναξεκινούν στην αποσύνδεση, οπότε το PipeWire συνέχιζε να τρέχει με τα παλιά όρια. Χρειάστηκε πλήρης επανεκκίνηση.

Πως ελέγχετε ότι δούλεψε

ulimit -r
ps -L -o cls,rtprio,comm -p $(pidof pipewire)
aplay -D default -t raw -f S16_LE -r 44100 -c 2 -d 3 /dev/zero; echo $?

Μετά την επανεκκίνηση πήρα ulimit -r = 98, τα νήματα data-loop του PipeWire να τρέχουν FF (SCHED_FIFO) με προτεραιότητα 88 και 83, και το τεστ του aplay να βγαίνει με 0.

Ρυθμίσεις στο Renoise

  • Preferences > Audio: συσκευή JACK, 48000 Hz. Το pipewire-jack παρέχει το /usr/lib/libjack.so.0, οπότε τα προγράμματα JACK μιλούν απευθείας με το PipeWire, χωρίς ξεχωριστό JACK server. Με τον ρυθμό ίδιο με του γράφου, ούτε resampling.
  • Προαιρετικά, για μικρότερη καθυστέρηση: ξεκινήστε το με PIPEWIRE_QUANTUM=256/48000 renoise. Μην επιβάλλετε καθολικό quantum σε όλο τον γράφο για μία εφαρμογή.
  • Το Renoise κρατά τις ρυθμίσεις του στο ~/.config/Renoise/V3.5.4/Config.xml και το ξαναγράφει στην έξοδο, οπότε αλλάξτε τα από το GUI, όχι από το αρχείο.

Έξτρα: Renoise και AI agents

Μια παρένθεση, αφού ήμουν ήδη μέσα. Το Renoise έρχεται με Lua scripting API: η εγκατάσταση έχει /usr/local/share/renoise-3.5.4/Scripts/Docs και Scripts/Types (ορισμοί τύπων για τον Lua language server), οπότε τα tools (.xrnx) μπορούν να χειριστούν το τραγούδι με script. Έχει και ενσωματωμένο OSC server, ανενεργό από προεπιλογή, στη θύρα 8000 UDP στο Config.xml αυτής της εγκατάστασης.

Πάνω σε αυτά υπάρχει και ένα tool της κοινότητας, το Renoise MCP (ReMCP) από τον kunitoki: ένας MCP (Model Context Protocol) server που τρέχει μέσα στο Renoise και εκθέτει το API του τραγουδιού σε MCP clients όπως το Claude Desktop ή το Claude Code, ώστε να ζητάς από έναν βοηθό με απλά λόγια να σε βοηθήσει στη σύνθεση, την ενορχήστρωση, τη μίξη και την επεξεργασία. Η εγκατάσταση είναι να αντιγράψεις το tool στα Tools του Renoise, να ξεκινήσεις το Renoise και να ξεκινήσεις τον server από το μενού Tools. Η ανάρτηση του δημιουργού στο forum χαρακτηρίζει την 0.1 πρώιμο πρωτότυπο: όχι σταθερό, με λειτουργίες και τεκμηρίωση που λείπουν. Δεν το έχω δοκιμάσει σε βάθος ακόμη, αλλά αξίζει μια ματιά. Με την τεκμηρίωση του Lua API και το MCP μπορείς επίσης να δώσεις σε έναν agent δικές σου οδηγίες και skills για τη ροή εργασίας σου.