Programm um Sinuskurven zu addieren und abzuspeichern

Gast #6738741
Lesenswert?

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
Gast #6738798
Lesenswert?

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
}
#6739006
Lesenswert?

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
Gast #6739879
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren