다음은 GUID의 각 니블을 A4-C6
범위의 톤으로 바꾸려는 시도입니다.
WAVE에 부호가없는 8 비트 PCM이 출력되고, ffmpeg
은 필요하지 않습니다. 음성 = SLT의 -filter : 코드는 적절한 유효성 검사를 추가 부담 등
#include <stdio.h>
#include <inttypes.h>
#include <math.h>
int main(void) {
FILE* out;
int duration = 2; // [s]
int32_t rate = 44100; // [Hz]
uint8_t guid[] = {0x1e, 0x85, 0x99, 0x15, 0xbc, 0xdf, 0x48, 0x62, 0x8a, 0xf2, 0xbb, 0x43, 0xf0, 0x4e, 0x21, 0x58};
int32_t samples_per_nibble = (float) duration/32 * rate;
int32_t total_samples = samples_per_nibble * 32;
int16_t c16;
int32_t c32;
if ((out = fopen("test.wav", "wb")) == NULL) {
return 1;
}
// WAV header
// ChunkID
fputs("RIFF", out);
// ChunkSize
c32 = 36 + total_samples;
fwrite(&c32, 4, 1, out);
// Format
fputs("WAVE", out);
// Subchunk1ID
fputs("fmt ", out);
// Subchunk1Size
c32 = 16;
fwrite(&c32, 4, 1, out);
// AudioFormat
c16 = 1;
fwrite(&c16, 2, 1, out);
// NumChannels
c16 = 1;
fwrite(&c16, 2, 1, out);
// SampleRate
c32 = rate;
fwrite(&c32, 4, 1, out);
// ByteRate
c32 = rate;
fwrite(&c32, 4, 1, out);
// BlockAlign
c16 = 1;
fwrite(&c16, 2, 1, out);
// BitsPerSample
c16 = 8;
fwrite(&c16, 2, 1, out);
// Subchunk2ID
fputs("data", out);
// Subchunk2Size
c32 = total_samples;
fwrite(&c32, 4, 1, out);
// Data
for (int b = 0; b < 16; b++) {
// for each byte in the GUID
for (int n = 0; n < 2; n++) {
// for each nibble
uint8_t nibble = (n ? guid[b] >> 4 : guid[b]) & 0x0f;
// go nibble steps above A4
float frequency = 440.0 * pow(1.059463094359, nibble);
// write the samples
for (int s = 0; s < samples_per_nibble; s++) {
int sample = (sin(frequency * 2 * M_PI * s/rate) + 1) * 0.5 * 255;
fputc(sample, out);
}
}
}
fclose(out);
return 0;
}
'는 FFmpeg -f lavfi -i 플라이트 = 텍스트 = 1e859915-bcdf-4862-8af2-bb43f04e2158 기분이 설명을 목적으로하는 atempo = 2' :) – aergistal
이것은 생성하려는 오디오 종류에 따라 다릅니다. 사람들이 쉽게 구별 할 수있는 오디오? 프로그램에서 쉽게 읽을 수있는 태그는 무엇입니까? 재생할 수 있고, 잡음이 추가로 기록되며 여전히 디코딩 된 사운드가 있습니까? 음악적으로 즐거운 소리? 그것을 모른 채로 나는 우리가 많은 도움을 줄 수 있다고 생각하지 않는다. – Linuxios