RustyPipes Open Source VPO Software

  • Seite 9 von 10
08.02.2026 12:30
#121
avatar

@Dividebysandwich Du musst da grundsätzlich überlegen wie wichtig dir die Funktion eines Sets ist, wenn du dafür so einen Aufwand betreiben musst und die Software dadurch immer unnötig aufbläht. Wenn man 20 Jahre alte Altlasten nutzen möchte, dann kann man auch gleich GrandOrgue nutzen.

GrandOrgue ist ja auch wenn man es bauen möchte eine Abhängigkeitshölle... Vielleicht denkst du einmal über ein Plugin System nach. RustyPipes selbst kann die Basisfunktionen die man erwartet, alle weiteren Funktionen werden in Plugins ausgegliedert die man bei Bedarf einbinden kann. Keine Ahnung wie komplex so eine Umsetzung ist, aber von der Idee wäre es ja gut, wenn man nur das nutzen muss was man selbst auch braucht.


 Antworten

 Beitrag melden
08.02.2026 13:23
avatar  Montre
#122
avatar

Zitat von Untersatz32 im Beitrag #121
GrandOrgue ist ja auch wenn man es bauen möchte eine Abhängigkeitshölle...

Rusty Pipes zieht sich beim Übersetzen über 400 Libs ("Crates") rein

Zitat von Untersatz32 im Beitrag #121
Vielleicht denkst du einmal über ein Plugin System nach. RustyPipes selbst kann die Basisfunktionen die man erwartet, alle weiteren Funktionen werden in Plugins ausgegliedert die man bei Bedarf einbinden kann.

Das ist eine Überlegung wert. Mit einer guten Architekturschicht sind Erweiterungen sauber integrierbar.


 Antworten

 Beitrag melden
08.02.2026 14:10
#123
avatar

Der Vorteil ist eben: Brauche ich keine Unterstützung für RestAPI, display und co, warum sollte dann dafür Rechenzeit vergeudet werden? Ich denke auch bei einer sauberen Implementierung könnte man selbst ohne viel Aufwand auch Anpassungen vornehmen und im Fehlerfall wohl gut eingreenzen. Vor allem wenn das Projekt immer größer wird.


 Antworten

 Beitrag melden
08.02.2026 15:31 (zuletzt bearbeitet: 08.02.2026 16:39)
#124
avatar

Eine Plugin-Infrastruktur kostet auch Aufwand und CPU-Zeit. Vorallem wenn du so Sachen machen willst wie Dateiformate supporten etc. ist das ziemlich viel Programmierarbeit. Die REST-API ist von der CPU-Load her irrelevant. Wenn kein Request reinkommt macht das Ding garnichts. Ja RP braucht relativ viele Dependencies, das meiste kommt mit Cpal, Symphonia und egui rein, aber es ist nicht so schlimm wie bei Javascript wo leftpad ein "library" ist ;)

Ich würde mal die Kirche im Dorf lassen. Wavpack support kommt nicht nur weil es eine Plugin-Infrastruktur gibt. Das sollen die Symphonia-Leute machen.

Wer bei RP etwas beitragen will, kann das gerne per Pull Request machen.

https://rusty-pipes.com - The Free Open-Source Virtual Pipe Organ Software

 Antworten

 Beitrag melden
08.02.2026 21:17 (zuletzt bearbeitet: 08.02.2026 22:45)
avatar  Montre
#125
avatar

Ist schon klar, dass Vorschläge leichter sind, als die Umsetzung. Da du scheinbar ein Audio-Framework verwendest (was mir nicht klar war), gehört so eine Erweiterung ganz klar in das Audio-Framework. Meine Lieblingssprache ist C# und ich habe eigene Freizeit-C#-Projekte, die mir leider keine Zeit für was Anderes lassen.


 Antworten

 Beitrag melden
09.02.2026 19:25
#126
avatar

@Dividebysandwich Wie läuft das eigentlich mit dem Wavpack, wird dies auch per Streaming abgespielt? Ich selbst würde es wohl Intern in etwas anderes umwandeln, womit ich dann sauber arbeiten kann. Also einen Cache aus den originalen erstellen welcher dann umgewandelte Audiodaten enthält. Oder ist genau diese Umwandlung ein Problem?

Ich selbst würde komprimierte Dinge in diesem Kontext ohnehin als schwierig sehen wegen der Performance.


 Antworten

 Beitrag melden
09.02.2026 21:52
avatar  Montre
#127
avatar

Was spricht dagegen, die WAVPACK3-Dateien mit wvunpack zu entpacken und mit einer neueren Version zu packen oder die Dateien entpackt zu verwenden?


 Antworten

 Beitrag melden
09.02.2026 22:05 (zuletzt bearbeitet: 09.02.2026 22:14)
#128
avatar

Zitat von Untersatz32 im Beitrag #126
Ich selbst würde es wohl Intern in etwas anderes umwandeln, womit ich dann sauber arbeiten kann.


Genau das mache ich auch. Ich brauche eigentlich nur noch etwas um Wavpack zu lesen, und am liebsten eine reine Rust-Lösung ohne dass ich C-libraries wrappe. Entpacken on the fly beim streamen ist einfach zu rechenintensiv.

Zitat von Montre im Beitrag #127
Was spricht dagegen, die WAVPACK3-Dateien mit wvunpack zu entpacken und mit einer neueren Version zu packen oder die Dateien entpackt zu verwenden?


Ich habe ein shell script welches genau das macht, allerdings mit ffmpeg, und das zerstört leider die Loop Points der Attack Samples. Und ein altes wvunpack Binary zu finden welches auf aktuellem Linux läuft ist garnicht mal so einfach.

Aber wie gesagt es gibt einen PR im Symphonia-Library und mein Plan ist entweder zu warten bis das verwendbar ist und/oder Code beizutragen damit die Loop-Metadaten auch überleben.

EDIT: Vielleicht kann mir jemand verraten wie ich ffmpeg dazu bringe SMPL headers mit den loop points aus dem wavpack zu extrahieren, damit würden die Samplesets zumindest sofort in RP verwendbar. Irgendwie bringe ich das nicht zustande.

https://rusty-pipes.com - The Free Open-Source Virtual Pipe Organ Software

 Antworten

 Beitrag melden
09.02.2026 22:40 (zuletzt bearbeitet: 09.02.2026 23:04)
avatar  Montre
#129
avatar

Warum ffmpeg? Nach wvunpack -o output.wav input.wv sind die Loops in der WAV enthalten.

Script (KI macht's möglich)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
#!/usr/bin/env bash
u32le() {
# liest uint32 little endian aus Datei bei Offset
# $1 = file, $2 = offset
xxd -s "$2" -l 4 -p "$1" | tac -rs .. | tr -d '\n' | awk '{print strtonum("0x"$0)}'
}
 
for wv in *.wv; do
wav="${wv%.wv}.wav"
 
echo "▶ $wv"
wvunpack -q -o "$wav" "$wv" || continue
 
# SMPL-Chunk suchen
smpl_pos=$(grep -abo "smpl" "$wav" | head -n1 | cut -d: -f1)
 
if [[ -z "$smpl_pos" ]]; then
echo " Kein SMPL-Chunk"
continue
fi
 
smpl_data=$((smpl_pos + 8))
 
num_loops=$(u32le "$wav" $((smpl_data + 28)))
 
if (( num_loops == 0 )); then
echo " Keine Loops"
continue
fi
 
echo " $num_loops Loop(s):"
 
loop_base=$((smpl_data + 36))
 
for ((i=0; i<num_loops; i++)); do
off=$((loop_base + i*24))
start=$(u32le "$wav" $((off + 8)))
end=$(u32le "$wav" $((off + 12)))
echo " Loop $((i+1)): $start &#8594; $end"
done
done
 


 Antworten

 Beitrag melden
09.02.2026 23:15
#130
avatar

Zitat von Montre im Beitrag #129
Warum ffmpeg? Nach wvunpack -o output.wav input.wv sind die Loops in der WAV enthalten.


Die aktuelle und in den meisten Distributionen enthaltene Version unterstützt wohl die alten Varianten davon nicht was bei der Silbermann wohl der Fall ist.

Ich würde ja vorschlagen im Code von GrandOrgue einmal zu schauen wie man dort mit den alten Formaten umgeht, aber man ist dort ja der Meinung, dass Kommentare im Code nicht notwendig sind... Versuche dann mal was zu finden


 Antworten

 Beitrag melden
09.02.2026 23:56
avatar  Montre
#131
avatar

GO ist architektonisch suboptimal. Der mit WxWidget verseuchte Code ist furchtbar. Es ist wahrscheinlich volle Absicht, das nichts kommentiert ist, damit kein "Fremder" dort "rumpfuscht". Vermutlich gibt es ein Script, dass vor der Veröffentlichung alle Kommentare entfernt.
Ich hatte mal den Wunsch, die WxWidget-Oberfläche vom Kern zu trennen - quasi einen sauberen Audio-Kernel zu erstellen. Aber die WxWidget-Klassen wurden durchgängig verwendet. Diese Idee habe ich dann doch relativ schnell verworfen. Es ist leichter, von vorn zu beginnen. Aber andere Projekte sind mir gerade wichtiger.


 Antworten

 Beitrag melden
10.02.2026 00:02
avatar  Montre
#132
avatar

 Antworten

 Beitrag melden
10.02.2026 00:14
#133
avatar

Zitat von Montre im Beitrag #131
Ich hatte mal den Wunsch, die WxWidget-Oberfläche vom Kern zu trennen - quasi einen sauberen Audio-Kernel zu erstellen.

Ich erinnere mich da an eine Diskussion in einem anderen Forum von dir

Zitat von Montre im Beitrag #131
Vermutlich gibt es ein Script, dass vor der Veröffentlichung alle Kommentare entfernt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
import re
 
def remove_c_comments(text):
# Regex: Gruppe 1 sind Strings/Chars, Gruppe 2 sind Kommentare
pattern = r'("(?:\\.|[^"\\])*"|\'(?:\\.|[^\'\\])*\')|(/\*[\s\S]*?\*/|//.*)'

def replace(match):
# Wenn Gruppe 1 (String) existiert, gib ihn zurück (behalten)
if match.group(1):
return match.group(1)
# Sonst war es ein Kommentar (Gruppe 2), also löschen (leeren String zurückgeben)
else:
return ""

return re.sub(pattern, replace, text)
 
# Test
c_code = """
int main() {
// Das ist ein Kommentar
printf("Hallo Welt!"); /* Das hier bleibt heile */
/* Block
Kommentar */
return 0;
}
"""
 
print(remove_c_comments(c_code))
 




Aber warum?


 Antworten

 Beitrag melden
10.02.2026 17:37 (zuletzt bearbeitet: 10.02.2026 17:37)
avatar  Montre
#134
avatar

Damit den Source keiner zu schnell versteht und Änderungen einreicht.

Ein Script für macOS:

1
2
3
4
5
6
7
8
9
10
11
 
SRC="./Zoeblitz_Std/samples"
DST="./Zoeblitz_Std/samples_unpacked"
find "$SRC" -type f \( -iname "*.wav" -o -iname "*.wv" \) |
while IFS= read -r file; do
rel="${file#$SRC/}"
outdir="$DST/$(dirname "$rel")"
mkdir -p "$outdir"
base="$(basename "$file")"
base="${base%.*}"
wvunpack "$file" -o "$outdir/$base.wav"
done
 


 Antworten

 Beitrag melden
10.02.2026 20:47
#135
avatar

Zitat von Montre im Beitrag #134
Damit den Source keiner zu schnell versteht und Änderungen einreicht.

Ja, schon klar nur verstehe ich mit meinem wohl beschränkten Verstand den Sinn dahinter nicht. Wenn ich nicht will das mein Programmcode von jemanden genutzt wird, dann zwingt mich ja keiner diesen zu veröffentlichen. In letzter Konsequenz würde das eben bedeutet man muss closed neu anfangen.


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!