如何用c语言生成随机音频?

如题,这是“无限猴子小说家”:

#include
#include
#include
int main(void)
{
    srand((unsigned int)time(NULL));
    long bitcount = 0;
    printf("请输入要生成的文字的字节数:\n");
    scanf("%ld",&bitcount);
    long i;
    long t;
    for(i=0;irand()%0x10000;
        printf("%lc",t);
    }
    return 0;
}

那么“无限猴子音乐家”要怎么写呢?

要用C语言生成随机音频,可以使用C语言的音频库,比如PortAudio或SDL音频库。以下是一个使用PortAudio库生成随机音频的简单示例:


#include "portaudio.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SAMPLE_RATE  (44100)
#define FRAMES_PER_BUFFER (512)
#define NUM_SECONDS     (5)
#define NUM_CHANNELS    (2)
#define DITHER_FLAG     (paDitherOff)
#define WRITE_TO_FILE   (0)

typedef struct
{
    float left_phase;
    float right_phase;
}
paTestData;

static int paTestCallback( const void *inputBuffer, void *outputBuffer,
                           unsigned long framesPerBuffer,
                           const PaStreamCallbackTimeInfo* timeInfo,
                           PaStreamCallbackFlags statusFlags,
                           void *userData )
{
    paTestData *data = (paTestData*)userData;
    float *out = (float*)outputBuffer;
    unsigned int i;
    (void) timeInfo; /* Prevent unused variable warnings. */
    (void) statusFlags;
    (void) inputBuffer;

    for( i=0; i<framesPerBuffer; i++ )
    {
        /* 生成随机音频数据 */
        *out++ = (float)rand() / RAND_MAX;
        *out++ = (float)rand() / RAND_MAX;
    }
    return paContinue;
}

int main(void);
int main(void)
{
    PaStreamParameters outputParameters;
    PaStream *stream;
    PaError err;
    paTestData data;
    int i;

    srand(time(NULL));

    printf("Generating random audio...\n"); fflush(stdout);

    err = Pa_Initialize();
    if( err != paNoError ) goto error;

    outputParameters.device = Pa_GetDefaultOutputDevice(); /* 默认音频输出设备 */
    if (outputParameters.device == paNoDevice) {
        fprintf(stderr,"Error: No default output device.\n");
        goto error;
    }
    outputParameters.channelCount = NUM_CHANNELS;
    outputParameters.sampleFormat = paFloat32;
    outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
    outputParameters.hostApiSpecificStreamInfo = NULL;

    err = Pa_OpenStream(
              &stream,
              NULL, /* no input */
              &outputParameters,
              SAMPLE_RATE,
              FRAMES_PER_BUFFER,
              paClipOff,      /* 不需要剪裁处理 */
              paTestCallback, /* 回调函数 */
              &data ); /* 用户数据 */
    if( err != paNoError ) goto error;

    err = Pa_StartStream( stream );
    if( err != paNoError ) goto error;

    /* 等待音频播放完毕 */
    Pa_Sleep(NUM_SECONDS * 1000);

    err = Pa_StopStream( stream );
    if( err != paNoError ) goto error;

    err = Pa_CloseStream( stream );
    if( err != paNoError ) goto error;

    Pa_Terminate();
    printf("Done generating audio.\n");
    return 0;

error:
    Pa_Terminate();
    fprintf(stderr, "An error occurred while using the portaudio stream\n");
    fprintf(stderr, "Error number: %d\n", err );
    fprintf(stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
    return -1;
}

该回答引用ChatGPT
"无限猴子音乐家"的实现方式类似于"无限猴子小说家",不同的是需要生成的是音乐而不是文字。以下是一个简单的示例程序,它会随机生成指定数量的MIDI音符:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NOTE_COUNT 128
#define VELOCITY_COUNT 128

int main(void) {
    srand((unsigned int)time(NULL));

    int note_count, velocity_count;
    printf("请输入要生成的音符数和速度数(0 < 音符数 <= %d, 0 < 速度数 <= %d):\n", NOTE_COUNT, VELOCITY_COUNT);
    scanf("%d %d", &note_count, &velocity_count);

    int i;
    for (i = 0; i < note_count; i++) {
        int note = rand() % NOTE_COUNT;
        int velocity = rand() % velocity_count;
        printf("音符:%d 速度:%d\n", note, velocity);
    }

    return 0;
}

这个程序使用了MIDI音符的编号和速度来表示音乐,其中音符编号的范围是0-127,速度的范围也是0-127。可以根据实际需要调整生成音符的范围和数量。同时,还可以使用第三方库来生成更复杂的音乐,例如MIDI库。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^