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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.