#define TSF_IMPLEMENTATION #include tsf.h #include SDL2/SDL.h #include stdio.h // 全局合成器 tsf* g_tsf NULL; const int SAMPLE_RATE 44100; // SDL音频回调实时生成声音 void audioCallback(void* userdata, Uint8* stream, int len) { if (!g_tsf) return; // 清空缓冲区 SDL_memset(stream, 0, len); int sampleCount len / sizeof(short) / 2; // 立体声 tsf_render_short(g_tsf, (short*)stream, sampleCount, 1); } int main() { // 1.加载SF2音色库改成你手机上sndfnt.sf2绝对路径 g_tsf tsf_load_filename(/storage/emulated/0/sndfnt.sf2); if (!g_tsf) { printf(SF2音色文件加载失败检查路径\n); return -1; } // 设置立体声 44100 tsf_set_output(g_tsf, TSF_STEREO_INTERLEAVED, SAMPLE_RATE, 0); // 2.初始化SDL音频 SDL_Init(SDL_INIT_AUDIO); SDL_AudioSpec spec; memset(spec, 0, sizeof(SDL_AudioSpec)); spec.freq SAMPLE_RATE; spec.format AUDIO_S16SYS; spec.channels 2; spec.samples 1024; spec.callback audioCallback; if (SDL_OpenAudio(spec, NULL) 0) { printf(音频打开失败%s\n, SDL_GetError()); tsf_close(g_tsf); return -1; } SDL_PauseAudio(0); // 启动音频播放 printf(播放中央C 中音1(MIDI 60)\n); tsf_note_on(g_tsf, 0, 60, 0.8f); // 通道0音符60力度0.8 SDL_Delay(500); // 响0.5秒 tsf_note_off(g_tsf, 0, 60); SDL_Delay(200); printf(播放中音2 MIDI61\n); tsf_note_on(g_tsf, 0, 61, 0.8f); SDL_Delay(500); tsf_note_off(g_tsf, 0, 61); SDL_Delay(800); // 释放资源 SDL_CloseAudio(); SDL_Quit(); tsf_close(g_tsf); return 0; }
手机端C语言发出钢琴声音软件代码QZQ
#define TSF_IMPLEMENTATION #include tsf.h #include SDL2/SDL.h #include stdio.h // 全局合成器 tsf* g_tsf NULL; const int SAMPLE_RATE 44100; // SDL音频回调实时生成声音 void audioCallback(void* userdata, Uint8* stream, int len) { if (!g_tsf) return; // 清空缓冲区 SDL_memset(stream, 0, len); int sampleCount len / sizeof(short) / 2; // 立体声 tsf_render_short(g_tsf, (short*)stream, sampleCount, 1); } int main() { // 1.加载SF2音色库改成你手机上sndfnt.sf2绝对路径 g_tsf tsf_load_filename(/storage/emulated/0/sndfnt.sf2); if (!g_tsf) { printf(SF2音色文件加载失败检查路径\n); return -1; } // 设置立体声 44100 tsf_set_output(g_tsf, TSF_STEREO_INTERLEAVED, SAMPLE_RATE, 0); // 2.初始化SDL音频 SDL_Init(SDL_INIT_AUDIO); SDL_AudioSpec spec; memset(spec, 0, sizeof(SDL_AudioSpec)); spec.freq SAMPLE_RATE; spec.format AUDIO_S16SYS; spec.channels 2; spec.samples 1024; spec.callback audioCallback; if (SDL_OpenAudio(spec, NULL) 0) { printf(音频打开失败%s\n, SDL_GetError()); tsf_close(g_tsf); return -1; } SDL_PauseAudio(0); // 启动音频播放 printf(播放中央C 中音1(MIDI 60)\n); tsf_note_on(g_tsf, 0, 60, 0.8f); // 通道0音符60力度0.8 SDL_Delay(500); // 响0.5秒 tsf_note_off(g_tsf, 0, 60); SDL_Delay(200); printf(播放中音2 MIDI61\n); tsf_note_on(g_tsf, 0, 61, 0.8f); SDL_Delay(500); tsf_note_off(g_tsf, 0, 61); SDL_Delay(800); // 释放资源 SDL_CloseAudio(); SDL_Quit(); tsf_close(g_tsf); return 0; }