当前位置: 首页 > news >正文

C语言 写一个简易音乐播放器

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>#define SAMPLE_RATE 44100 // 采样率
#define AMPLITUDE 32767 // 振幅
#define NO_SAMPLES 44100 // 样本数// 声明一个结构体用于表示音符
typedef struct {double frequency; // 频率double duration; // 持续时间
} note;// 声明一个函数用于计算给定音符的采样值
int calculate_sample(note n, double time) {int sample = AMPLITUDE * sin(2 * M_PI * n.frequency * time);return sample;
}// 声明一个函数用于播放单个音符
void play_single_note(note n) {int samples_per_note = SAMPLE_RATE * n.duration; // 计算每个音符的样本数double time_per_sample = 1.0 / SAMPLE_RATE; // 计算每个样本的时间间隔// 循环遍历每一个样本并计算采样值,然后将其写入标准输出for (int i = 0; i < samples_per_note; i++) {double time = i * time_per_sample;int sample = calculate_sample(n, time);putchar(sample & 0xFF);putchar((sample >> 8) & 0xFF);}
}// 声明一个函数用于播放和弦
void play_chord(note* notes, int num_notes) {int samples_per_chord = SAMPLE_RATE * notes[0].duration; // 计算每个和弦的样本数double time_per_sample = 1.0 / SAMPLE_RATE; // 计算每个样本的时间间隔// 循环遍历每一个样本并计算采样值,然后将其写入标准输出for (int i = 0; i < samples_per_chord; i++) {double time = i * time_per_sample;int sample = 0;// 对于和弦中的每个音符,计算其采样值并将其添加到当前样本上for (int j = 0; j < num_notes; j++) {int note_sample = calculate_sample(notes[j], time);sample += note_sample;}// 将样本缩放到正确的振幅范围内并将其写入标准输出sample /= num_notes;sample = fmin(sample, AMPLITUDE);sample = fmax(sample, -AMPLITUDE);putchar(sample & 0xFF);putchar((sample >> 8) & 0xFF);}
}int main() {// 声明一些简单的音符note c = {261.63, 1};note d = {293.66, 1};note e = {329.63, 1};note f = {349.23, 1};note g = {392.00, 1};note a = {440.00, 1};note b = {493.88, 1};// 播放一些简单的旋律和和弦play_single_note(c);play_single_note(d);play_single_note(e);play_single_note(f);play_single_note(g);play_single_note(a);play_single_note(b);note c_chord[] = {c, e, g};play_chord(c_chord, 3);note f_chord[] = {f, a, c};play_chord(f_chord, 3);// 完成return 0;
}

该代码使用正弦函数来计算采样值,并使用标准输出来播放音乐。它支持单独播放单个音符和播放和弦。通常,音符和和弦中的每个音符都表示为持续时间和频率的组合。

http://www.lryc.cn/news/217432.html

相关文章:

  • 面试题:有一个 List 对象集合,如何优雅地返回给前端?
  • DAY43 完全背包理论基础 + 518.零钱兑换II
  • unity 从UI上拖出3D物体,(2D转3D)
  • win10pycharm和anaconda安装和环境配置教程
  • [C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
  • ONES Design UI 组件库环境搭建
  • 支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新
  • taro全局配置页面路由和tabBar页面跳转
  • 【k8s】pod进阶
  • 【设计模式】第18节:行为型模式之“迭代器模式”
  • 【数据结构】单链表OJ题
  • 智能工厂架构
  • 阿里云多款ECS产品全面升级 性能最多提升40%
  • 责任链模式(Chain of Responsibility)
  • 文件管理技巧:根据大小智能分类并移动至目标文件夹
  • 具有自主产权的SaaS门店收银系统全套源码输出
  • 论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • 软件测试---边界值分析(功能测试)
  • 使用pytorch处理自己的数据集
  • http进一步认识
  • grafana docker安装
  • 【Kubernetes】初识k8s--扫盲阶段
  • “01”滴答“摩尔斯电码”加密解密单个字符
  • P3817 小A的糖果
  • Yolov8目标识别与实例分割——算法原理详细解析
  • HandlerMethodArgumentResolver方法参数解析器支持多用户
  • 【Linux】 man命令使用
  • 同一个数据库服务器进行数据表间的数据迁移-MySQL
  • 适用于 Linux 的 WPF:Avalonia