Forum: PC-Programmierung Programm um Sinuskurven zu addieren und abzuspeichern


von Lichtmaler (Gast)


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

von Sven D. (sven_la)


Lesenswert?

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/

von Gerald K. (geku)


Lesenswert?


von salander (Gast)


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
}

von Daniel A. (daniel-a)


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

: Bearbeitet durch User
von Lichtmaler (Gast)


Angehängte Dateien:

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

von Einer (Gast)


Lesenswert?

cooleditpro 2 hat einen guten generator für sowas.

von Rolf M. (rmagnus)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.