Seite 1 von 1
Muss Party-Musik so schlecht klingen?
Verfasst: Do 23. Dez 2004, 15:49
von Frank Klemm
elchhome hat geschrieben:Was für einen SW Tongenerator nimmst du denn, oder benutzt du HW?
Ich werfe einen Editor an, schreibe ein paar Codezeilen, compiliere, führe das Programm aus und habe dann PCM-Dateien, mit der ich entweder CD-RWs oder Soundkarten beglücke. Einen Tag später weiß ich nicht mehr, wo die Quelldatei gelandet ist, weil die meist x.c oder y.c heißt.
Code: Alles auswählen
#include <stdio.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323844
#endif
static short
double2int16 (double x )
{
if ( x < -32768. ) return -32768 ;
if ( x > +32767. ) return +32767 ;
return (short) floor (x+0.5) ;
}
static void
calc ( const char* filename, const float* c, float fs, long samples )
{
FILE* fp ;
int i ;
int j ;
double sum ;
short i16[2] ;
fp = fopen ( filename, "wb" ) ;
for ( i = 0; i < samples; i++ ) {
sum = 0. ;
for ( j = 0; coeff[j] != 0.; j += 2 )
sum += sin (c[j] * 2. * M_PI * i / fs) * c[j+1] ;
i16[0] = i16[1] = double2int16 ( 16000 * sum ) ;
fwrite ( i16, 2, 2, fp ) ;
}
fclose (fp) ;
}
int main
(void)
{
static float f1[] = { 24, 0.5, 0 } ;
static float f2[] = { 24, 0.5, 36, 0.16, 60, 0.05, 84, 0.02, 0 } ;
static float f3[] = { 24, 0.5, 32, 0.16, 40, 0.08, 56, 0.05, 64, 0.03, 84, 0.02, 0 } ;
calc ( "t1.pcm", f1, 44100., 44100*10 ) ;
calc ( "t2.pcm", f2, 44100., 44100*10 ) ;
calc ( "t3.pcm", f3, 44100., 44100*10 ) ;
return 0 ;
}
Verfasst: Do 23. Dez 2004, 15:58
von elchhome
Danke Frank!
... dann werde mal mein linux anwerfen ...
Verfasst: Fr 24. Dez 2004, 10:22
von SiMMenS
Sorry wegen der vielleicht blöden Frage (kenne den Thread ausm Off-Topic nicht), aber was isn das für ne Programmiersprache?!?!
Oder geht das nur im Linux?
Verfasst: Fr 24. Dez 2004, 10:36
von Master J
SiMMenS hat geschrieben:aber was isn das für ne Programmiersprache?!?!
C
Gruss
Jochen
P.S.: So kurze Antworten gebe ich sonst nicht
Verfasst: Fr 24. Dez 2004, 13:35
von Nomis
Hätte da auch mal eine Frage und zwar zu folgenden Zeilen
Code: Alles auswählen
i16[0] = i16[1] = double2int16 ( 16000 * val ) ;
fwrite ( i16, 2, 2, fp ) ;
Was ist "val"?
Was genau passiert bei "fwrite ( i16, 2, 2, fp )" ?
Nomis, der kleine Basic Programmierer, der von C nicht so die Ahnung hat.
PS: Muss das nicht "coeffs" und nicht "coeff"?!
Verfasst: Fr 24. Dez 2004, 15:09
von Jay_R
Nomis hat geschrieben:Code: Alles auswählen
i16[0] = i16[1] = double2int16 ( 16000 * val ) ;
fwrite ( i16, 2, 2, fp ) ;
Was ist "val"?
Ich würde mal spekulieren, daß an dieser Stelle eigentlich "sum" statt "val" stehen soll.
Nomis hat geschrieben:PS: Muss das nicht "coeffs" und nicht "coeff"?!
Genau
Verfasst: Sa 25. Dez 2004, 03:06
von Koala
Nomis hat geschrieben:Was genau passiert bei "fwrite ( i16, 2, 2, fp )" ?
man fwrite hat geschrieben:NAME
`fwrite'--write array elements...
DESCRIPTION
`fwrite' attempts to copy, starting from the memory location BUF,
COUNT elements (each of size SIZE) into the file or stream identified
by FP. `fwrite' may copy fewer elements than COUNT if an error inter-
venes.
greetings, Keita
Verfasst: Sa 25. Dez 2004, 13:38
von Nomis
Danke!
Habe jetzt den passenden RealBasic Code gefunden, wenn's interessiert:
Code: Alles auswählen
binarystream.writeshort i16(0)
binarystream.writeshort i16(1)
Jetze bleibt nur noch die Frage, wie man das abspielt? VLC, QuickTime, Media Player & co wollen das nicht. Auch als Audio CD brennen mit Nero geht nicht. Wie kann man diese Rohdaten abspielen bzw. brennen?
unwissender Nomis.
Verfasst: Sa 25. Dez 2004, 20:19
von BlueDanube
Nur so zur Beruhigung für diejenigen, die des Programmierens nicht mächtig sind....
Mit einem Wave-Editor wie zB. Cool Edit geht das ohne besondere Kenntnisse in Sekunden.
Mit Cool Edit kann man einen Ton mit 5 Harmonischen (ohne Grundwelle bleiben 4) mit einem Menubefehl (Generate Tones) erzeugen.
Abgespeichert wird das als WAV-Datei, welche ganz einfach mit zB. Nero auf eine Audio-CD gebrannt werden kann.
Verfasst: Fr 7. Jan 2005, 15:04
von Nomis
Hallo,
Da ich heute mal wieder nichts zu tun hatte und ich den einsammen SourceCode so auf dem Desktop rumliegen sah hab ich mal das Programm zu Ende geschrieben, obwohl es mit BlueDanubes Lösung sicherlich einfacher gewesen wäre.
Leider konnte ich keine Lösung finde wie man die Rohdaten so abspielen bzw. brennen kann. Das Problem hab ich damit gelöst indem ich "ganz einfach" einen WAVE-Header in die Datei schreibe - und es funktioniert sogar.
So sieht sowas dann aus:
Code: Alles auswählen
o=f.createbinaryFile("pcm wave")
'HEADER############
'2bytes per sample da writeSHORT!!!
o.write "RIFF" '4
o.littleEndian=true
o.writelong (samples*2+44)-8 '4 2bytes per sample // Gesamtlänge der Datei-8byte
o.littleEndian=false
o.write "WAVE" '4
'#################
'Format
o.write "fmt " '4
o.littleEndian=true
o.writelong 16 '4 Format Len PCM==16
o.writeshort 1 '2 PCM
o.writeshort 1'2 NumChannel
o.writelong fs'4 Samplerate
o.writelong fs*1*16/8 '4 SampleRate * NumChannels * BitsPerSample/8
o.writeshort 1*16/8 '2 NumChannels * BitsPerSample/8
o.writeshort 16 '2 16bit=> 2byte per sample == 16bit per sample
'Formatlen==16
'####################
o.littleEndian=false
o.write "data" '4
o.littleEndian=true
o.writelong samples*2 '4 2bytes per sample // Datenlänge
'--------------------------------------------
'Headerlen==44byte
'##################
Ich will euch jetzt nicht weiter mit der Theorie langweilen
. Darum hab ich hier mal eine mit dem Programm erzeugte Tondatei. Es handelt sich um 3 Schwebungen mit unterschiedlichen Schwebefrequenzen. Ein Hochgenuß für alle Sinne.
http://simonlooschen.spymac.net/generator/schweben.mp3
Und hier könnte ihr jetzt das tolle Programm runterladen:
http://simonlooschen.spymac.net/generator/generator.zip für Win
http://simonlooschen.spymac.net/generator/generator.sit für Mac OS X
und zum Schluss stell ich auch noch den SoruceCode zur Verfügung, mit dem ihr machen könnt was ihr wollt:
http://simonlooschen.spymac.net/generat ... source.zip RealBasic SourceCode
Noch viel Spaß damit,
Nomis.