Ein schönes Wochenende an die Community Ich bin ein künstlerisch-kreativer Geist der sich für "Spiralograph"-Kurven und deren elektronische Erzeugung und Darstellungen interresiert. Ich möchte euch fragen ob ihr mir Programme empfehlen könnt mit denen ich eine Liste von zwei oder mehr Sinuswellen aufaddieren und das als Stereosignal speichern kann. Ich stelle mir das ungefähr so vor wie L=SIN(100Hz) + 1/4*SIN(400Hz) R=SIN(100Hz+90°) + 1/4*SIN(400Hz+90°) Bisher habe ich ein Programm namens SoX gefunden das auch Sinuswellen erzeugen kann, aber die mich passende richtige Kommandozeile zu schreiben ist bei dem Programm viel zu unübersichtlich Könnt ihr mir bitte ein paar Tipps geben was es da noch andere Programme gibt? Vielelicht kann ich euch im November dann zur Lasershow einladen. Mit freundlichen Grüßen vom Lichtmaler
Du möchtest also Audiosignale als mp3 oder wav speichern? Schau dir mal CSound an. Mehr Spielerei bietet z.B. VCV Rack ein virtueller modularer Synthesizer mit dem du das gewünschte auch tun kannst. Mehrere VCOs in einen Mixer und dann als Datei abspeichern. https://de.wikipedia.org/wiki/Csound https://vcvrack.com/
LTSpice mit Ausgabe in eine WAV Datei. Beitrag "Re: vom Oszi aufgenommenes Signal in LTSpice XVII verwenden"
Audacity kann sehr einfach verschiedenen Sinus Signale erzeugen. Allerdings muss man für die Phase mit einen Zeitoffset arbeiten. Ich würde das direkt in einer Programmiersprache machen, die eine WAV Datei erzeugt. Den Header fest vorgeben und dann nur noch die Daten füllen. Exemplarisches! Beispiel in Java. In Zeile 14 steht die Formel. Hier nur für Mono und 8 Bit WAV.
1 | public class Main { |
2 | static byte[] bytes = new byte[FILE_LENGTH]; |
3 | static byte[] header = { 0x52, 0x49, 0x46, 0x46, ... }; |
4 | |
5 | public static void main(String[] args) { |
6 | |
7 | // Fill header
|
8 | for (int i = 0; i<HEADER_LENGTH; i++) { |
9 | bytes[i] = header[i]; |
10 | }
|
11 | |
12 | for (int t = 0; i < FILE_LENGTH-HEADER_LENGTH; i++) { |
13 | |
14 | double val = VOLUME * Math.sin(t * 0.2 + 0.1234); |
15 | bytes[HEADER_LENGTH + t] = val; |
16 | }
|
17 | |
18 | Path path = Paths.get("OUT.WAV"); |
19 | Files.write(path, bytes); |
20 | }
|
21 | }
|
Ich würde das auch so machen, aber eher in python3. Hier eine vollständige Version: sound.py
1 | #!/usr/bin/env python3
|
2 | import sys, math |
3 | |
4 | duration=10 |
5 | |
6 | def get_sample(t): |
7 | # Sample berechnen
|
8 | L = nsin(t*100) + 1/4*nsin(t*400) |
9 | R = nsin(t*100 + 90/360) + 1/4*nsin(t*400 + 90/360) |
10 | |
11 | # Lautstärke reduzieren (sample müssen innerhalb des Wertebereich -1 bis +1 liegen)
|
12 | volume = 1/2 |
13 | L *= volume |
14 | R *= volume |
15 | return L, R |
16 | |
17 | def write_header(): |
18 | sys.stdout.buffer.write( |
19 | b"RIFF\x24\0\0\x80WAVE" + |
20 | b"fmt \x10\0\0\0\1\0\2\0\x80\xBB\0\0\0\xEE\2\0\4\0\x20\0" + |
21 | b"data\0\0\0\x80" |
22 | )
|
23 | |
24 | def write_sample(x): |
25 | x = int(x * 0x7FFFFFFF) |
26 | if x > 0x7FFFFFFF: x= 0x7FFFFFFF |
27 | if x < -0x7FFFFFFF: x=-0x7FFFFFFF |
28 | x = x & 0xFFFFFFFF |
29 | sys.stdout.buffer.write(x.to_bytes(4, 'little')) |
30 | |
31 | def nsin(x): |
32 | return math.sin(x*math.pi*2) |
33 | |
34 | if __name__ == "__main__": |
35 | sample_rate = 48000 # (im wav header hartcodiert) |
36 | write_header() |
37 | for sample in range(0,duration*sample_rate): |
38 | time = sample / sample_rate |
39 | L, R = get_sample(time) |
40 | write_sample(L) |
41 | write_sample(R) |
Verwendung:
1 | chmod +x sound.py # Ausführbar machen |
2 | ./sound.py > test.wav # In text.wav speichern |
3 | ./sound.py | aplay # Direkt widergeben |
:
Bearbeitet durch User
Danke, ich befürchte das mit dem Programmieren wird noch ein langer Weg für mich. Ein bißchen Erfolg mit manuell geschobenen Phasenlagen in Audacity hatte ich schon einmal, den ich mit euch teilen möchte. Osziloskop oder größere Geschütze eurer Wahl im XY-Modus an die Soundkarte und davonschweben
cooleditpro 2 hat einen guten generator für sowas.
Vielleicht kann Zynaddsubfx, was du brauchst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.