Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  2 728
Hei, jeg har ett lite problem med å våkne til vekkerklokken, eller lettere sakt hvis jeg ikkje bytter vekkerlyd ei gang i uken, så blir jeg vant til lyden og hører den ikkje.

Så jeg tenkte i steden for å drive å bytte lyden en gang i uken, så kunne jeg jo bare skrive ett lite C program som genererer lyd ut fra tilfeldige frekvens som synker å stiger. På denne måten så får man aldri samme lyd hver morgen.

Men så er problemet, finnes det noen library'er der man kan putte inn en frekvens i Hz og få ut en lyd fra høytalleran? No ala alsa library? Hvis ikkje, hvilken metode er den mest vennlige får å skape ett slikt program?

Pseudo/C Code:

Kode

int freq, i;

while (1) 
{
  freq = (rand() % 15000) + 40;
  while (freq != i)
  {
    if (freq < i) i++;
    else if (freq > i) i--;

    set_frequency (i); // her er det jeg trenger en funksjon.
    sleep (10);
  }
}
Har ikkje tenkt så mye på denne ideen ennå, men sånn ved første tanke så er det slik jeg tenkte jeg skulle lage den.

EDIT: Ubuntu/Gentoo OS.
Sist endret av 0xFF; 18. august 2011 kl. 18:51.
http://www.comp.leeds.ac.uk/jj/linux/siggen.html kan brukes med /dev/dsp og har ca det du ber om. /dev/dsp eksisterer vel fremdeles selv om alle linuxdistribusjoner bruker disse nymotens alsa-mixerne? (er det nå jeg skal føle meg gammel...?)
▼ ... over en uke senere ... ▼
Blei litt intersert i denne. Ikke til vekking. Jeg bruker klokke radio.....

laga en liten snutt som lager en wav fil. Men tror jeg bomma litt da jeg skulle generer data chunken som er sjølve lyden. Men her har du ihvertfall lyd som du burde våkne av

Om du (eller andre) fikser en god beskrivelse av å lage en fast freq, eller f.eks en som går fra 20Hz til 20 kHz (Ca det vi hører) så bra.

Skal se om jeg sjøl får tid til å se mer på det.

Her er ihvertfall en kodesnutt (Laga med msdev 6 for windows)

Kode

/*
*   wavtst.cpp
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>

#define TWOPI        6.283185307179586476925

#define fwriteL(data,file) fwrite((char *)&data,1,4,file)
#define fwriteS(data,file) fwrite((char *)&data,1,2,file)

int main(
    int   argc,
    char *argv[],
    char *envp[]
)
{
   FILE          *pF;
   unsigned int   len;
   unsigned int   chunkSize;
   unsigned int   fmtChunkSize;
   unsigned short fmtTag;           /* Format code  0x0001 = PCM              */
   unsigned short nChannels;        /* Mono = 1, Stereo = 2, etc.             */
   unsigned int   sampleRate;       /* Samples per socond.                    */
   unsigned int   byteRate;         /* Bytes per second.                      */
   unsigned short blockAlign;       /* The number of bytes for one sample     */
   unsigned short sampleSize;       /* Bits per sample                        */

   unsigned int   dataChunkSize;    /* No. of bytes in data chunk.            */
   unsigned int   duration;         /* Seconds.                               */
   unsigned int   freq;
   unsigned int   amplitude;
   short          data;
   unsigned int   ix;

   duration       = 60;             /* One minute.                            */
   amplitude      = 0x8000 * 3 / 4; /* 3/4 of max.                            */

   fmtChunkSize   = 16;             /* 16 for PCM                             */
   fmtTag         = 1;              /* PCM                                    */
   nChannels      = 1;              /* Mono                                   */
   sampleRate     = 44100;
   sampleSize     = 16;
   byteRate       = sampleRate * nChannels * (sampleSize / 8);
   blockAlign     = nChannels * (sampleSize / 8);

   dataChunkSize  = duration * sampleRate * nChannels * (sampleSize / 8);
   chunkSize      = 4 + (8 + fmtChunkSize) + (8 + dataChunkSize)
;

   pF  = fopen("wavtst.wav","wb");

   len = 0;
   len += fwrite("RIFF",1,4,pF);          /* Chunk ID                         */
   len += fwriteL(chunkSize,pF);          /* Size of the rest of the file.    */
   len += fwrite("WAVE",1,4,pF);          /* Format                           */

   /* Format chunk :                                                          */
   len += fwrite("fmt ",1,4,pF);          /* Chunk ID                         */
   len += fwriteL(fmtChunkSize,pF);       
   len += fwriteS(fmtTag,pF);             
   len += fwriteS(nChannels,pF);          
   len += fwriteL(sampleRate,pF);         
   len += fwriteL(byteRate,pF);           
   len += fwriteS(blockAlign,pF);
   len += fwriteS(sampleSize,pF);

   /* Data chunk                                                              */
   len += fwrite("data",1,4,pF);           /* Chunk ID                        */
   len += fwriteL(dataChunkSize,pF);

   /* Create the actual data....                                              */
   for (ix = 0; ix < dataChunkSize; ix++) {
      double d;

      /* Increase freq by time. from 20 to 0kHz No good :(                    */
      freq = (unsigned int)(20.0 + (((double)ix * (20000.0 - 20.0)) / (double)dataChunkSize));
      freq = 5000;
      d = (double)ix * ((double)freq / (double)sampleRate);
      d = d - floor(d);
      d = (double)amplitude * sin(TWOPI * d);
      if (d > 0.0) d += 0.5;
      else if (d < 0.0) d -= 0.5;
      data = (short)d;
      len += fwrite((char *)&data,1,2,pF);
   }

   fclose(pF);

#ifdef _DEBUG
   printf("Bytes writen: %u\n",len);
   getch();
#endif
   return(0);
}