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

Cmake:Win10 如何编译 midifile C++应用程序

先从 Microsoft C++ Build Tools - Visual Studio

下载 1.73GB 安装 "Microsoft C++ Build Tools“

下载:midifile 项目 , 将 midifile-master.zip 解压到 D:\Music-soft

参阅: cmake超详细入门教程

CMake是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程。CMake可以运行在Windows和Linux环境下,根据配置的编译器不同,生成符合所在操作系统的 Makefile 文件,在Windows下可以生成VS的工程文件系统。
将 CMake/bin 目录加入到 系统环境变量Path 中

这是一个将开放式基金数据转换为 MIDI音乐的 C++ 程序示例。该程序将基金净值映射为 MIDI音符的音高

/funds/data/660008.csv 文件开头:
date,jz,ljjz
2016-01-04,1.1141,1.1141
2016-01-05,1.1161,1.1161
2016-01-06,1.1350,1.1350

1. midifile 项目--目录结构

2025/03/31  21:18    <DIR>          .
2025/03/31  21:18    <DIR>          ..
2025/03/18  00:31               185 .gitignore
2025/03/18  00:31             1,566 .travis.yml
2025/03/18  00:31             1,268 appveyor.yml
2025/03/31  21:42    <DIR>          bin
2025/03/31  22:15    <DIR>          build
2025/03/31  22:15             7,446 CMakeLists.txt
2025/03/18  00:31    <DIR>          include
2025/03/31  21:40    <DIR>          lib
2025/03/18  00:31             1,287 LICENSE.txt
2025/03/31  21:51             2,727 Makefile
2025/03/18  00:31             5,731 Makefile.library
2025/03/18  00:31             5,270 Makefile.programs
2025/03/31  21:22    <DIR>          obj
2025/03/18  00:31            80,092 README.md
2025/03/31  21:40    <DIR>          src
2025/03/31  21:57    <DIR>          tools
2025/03/18  00:31    <DIR>          visual-studio

2.编写 tools/fund2mid.cpp 程序,如下

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include "MidiFile.h"using namespace std;
using namespace smf;// CSV 数据结构/
struct FundData {string date;double jz;
};// 解析 CSV 文件(适配三列格式)
vector<FundData> readCSV(const string& filename) {vector<FundData> data;ifstream file(filename);string line;// 跳过标题行getline(file, line);while (getline(file, line)) {// 使用字符串流分割三列stringstream ss(line);string date, jzStr, ljjzStr;// 按逗号分割字段getline(ss, date, ',');getline(ss, jzStr, ',');getline(ss, ljjzStr); // 第三列不需要使用if (date > "2024-01-01") {try {double jz = stod(jzStr);data.push_back({date, jz});} catch (const exception& e) {cerr << "解析错误: " << line << endl;}}}return data;
}// 生成 MIDI 文件
void generateMIDI(const vector<double>& prices, const string& fcode) {MidiFile midiFile;midiFile.addTrack();midiFile.setTicksPerQuarterNote(480);// PPQ 需与 addNoteOff 参数一致// 计算价格范围auto [minIt, maxIt] = minmax_element(prices.begin(), prices.end());double minPrice = *minIt;double maxPrice = *maxIt;double priceRange = maxPrice - minPrice;// 音符范围配置int minNote = 48; // C3int maxNote = 84; // C5if (maxPrice / minPrice < 84.0/48.0) {maxNote = static_cast<int>(50 * (maxPrice / minPrice));}if (maxNote % 2 != 0) maxNote++;// 添加音符事件int track = 0;int channel = 0;int velocity = 80;int timeCounter = 0;int PPQ = 480; // 音符持续时间为 1个四分音符(480 ticks)for (double price : prices) {int pitch = (priceRange < 0.001) ? (maxNote + minNote) / 2 : minNote + static_cast<int>((price - minPrice) / priceRange * (maxNote - minNote));midiFile.addNoteOn(track, timeCounter, channel, pitch, velocity);midiFile.addNoteOff(track, timeCounter + PPQ, channel, pitch);timeCounter += PPQ; // ms 间隔1拍, 单位:毫秒 }// 保存文件string outputFile = "melo_" + fcode + ".mid";midiFile.write(outputFile);cout << "生成成功: " << outputFile << endl;
}int main(int argc, char** argv) {if (argc != 2 || strlen(argv[1]) != 6) {cerr << "用法: " << argv[0] << " <6位基金代码>" << endl;return 1;}string fcode = argv[1];string csvFile = "/funds/data/" + fcode + ".csv";try {auto data = readCSV(csvFile);if (data.size() < 20) {cerr << "数据不足: " << data.size() << " < 20" << endl;return 2;}vector<double> prices;for (auto& entry : data) {prices.push_back(entry.jz);}generateMIDI(prices, fcode);} catch (const exception& e) {cerr << "错误: " << e.what() << endl;return 3;}return 0;
}

3.修改后的 CMakeLists.txt 关键部分

# 在 "Programs:" 部分添加你的可执行文件(大约第 66 行附近)
if(NOT BUILD_MIDILIBRARY_ONLY)# 已有的工具列表...add_executable(textmidi tools/textmidi.cpp)add_executable(toascii tools/toascii.cpp)add_executable(tobin tools/tobin.cpp)# 添加你的自定义程序add_executable(fund2mid tools/fund2mid.cpp)  # 新增行# 继续原有工具列表...add_executable(tobinary tools/tobinary.cpp)add_executable(todec tools/todec.cpp)# ...# 在链接库部分添加(大约第 136 行附近)target_link_libraries(textmidi midifile)target_link_libraries(toascii midifile)target_link_libraries(tobin midifile)target_link_libraries(fund2mid midifile)  # 新增行target_link_libraries(tobinary midifile)target_link_libraries(todec midifile)

  4.完整修改说明

  1. 文件结构要求

    midifile/
    ├── CMakeLists.txt
    ├── include/
    ├── src/
    └── tools/├── fund2mid.cpp      # 你的程序源码├── createmidifile.cpp└── ...其他工具源码

    必要修改点

  2. 在 add_executable 列表中添加:
    add_executable(fund2mid tools/fund2mid.cpp)
    在 target_link_libraries 部分添加:
    target_link_libraries(fund2mid midifile)

  3. 编译验证

    # 生成构建系统
    mkdir build
    cd build
    cmake ..# 编译项目(Windows)
    cmake --build . --config Release
    

 适配注意事项

  1. C++ 标准要求
    # 建议升级到 C++17(修改第 4 行)
    set(CMAKE_CXX_STANDARD 17)

  2. 附件:完整的 CMakeLists.txt

  3. 运行 cmake --build . --config Release

    D:\Music-soft\midifile-master\build> cmake --build . --config Release
    适用于 .NET Framework MSBuild 版本 17.9.8+b34f75857midifile.vcxproj -> D:\Music-soft\midifile-master\build\Release\midifile.lib80off.vcxproj -> D:\Music-soft\midifile-master\build\Release\80off.exeasciimidi.vcxproj -> D:\Music-soft\midifile-master\build\Release\asciimidi.exebase642midi.vcxproj -> D:\Music-soft\midifile-master\build\Release\base642midi.exebinasc.vcxproj -> D:\Music-soft\midifile-master\build\Release\binasc.exechaninfo.vcxproj -> D:\Music-soft\midifile-master\build\Release\chaninfo.execreatemidifile.vcxproj -> D:\Music-soft\midifile-master\build\Release\createmidifile.execreatemidifile2.vcxproj -> D:\Music-soft\midifile-master\build\Release\createmidifile2.exedeltatimes.vcxproj -> D:\Music-soft\midifile-master\build\Release\deltatimes.exedrumtab.vcxproj -> D:\Music-soft\midifile-master\build\Release\drumtab.exedurations.vcxproj -> D:\Music-soft\midifile-master\build\Release\durations.exeextractlyrics.vcxproj -> D:\Music-soft\midifile-master\build\Release\extractlyrics.exefund2mid.cpp
    D:\Music-soft\midifile-master\tools\fund2mid.cpp(42,39): warning C4101: “e”: 未引用的局部变量 [D:\Music-soft\midifile-master\bu
    ild\fund2mid.vcxproj]fund2mid.vcxproj -> D:\Music-soft\midifile-master\build\Release\fund2mid.exemaxtick.vcxproj -> D:\Music-soft\midifile-master\build\Release\maxtick.exemid2hex.vcxproj -> D:\Music-soft\midifile-master\build\Release\mid2hex.exemid2mat.vcxproj -> D:\Music-soft\midifile-master\build\Release\mid2mat.exemid2mtb.vcxproj -> D:\Music-soft\midifile-master\build\Release\mid2mtb.exemid2svg.vcxproj -> D:\Music-soft\midifile-master\build\Release\mid2svg.exemidi2base64.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2base64.exemidi2binasc.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2binasc.exemidi2chords.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2chords.exemidi2melody.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2melody.exemidi2notes.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2notes.exemidi2skini.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2skini.exemidi2text.vcxproj -> D:\Music-soft\midifile-master\build\Release\midi2text.exemidicat.vcxproj -> D:\Music-soft\midifile-master\build\Release\midicat.exemididiss.vcxproj -> D:\Music-soft\midifile-master\build\Release\mididiss.exemidimean.vcxproj -> D:\Music-soft\midifile-master\build\Release\midimean.exemidimixup.vcxproj -> D:\Music-soft\midifile-master\build\Release\midimixup.exemidirange.vcxproj -> D:\Music-soft\midifile-master\build\Release\midirange.exemidireg.vcxproj -> D:\Music-soft\midifile-master\build\Release\midireg.exemiditime.vcxproj -> D:\Music-soft\midifile-master\build\Release\miditime.exemidiuniq.vcxproj -> D:\Music-soft\midifile-master\build\Release\midiuniq.exemts-type2.vcxproj -> D:\Music-soft\midifile-master\build\Release\mts-type2.exemts-type9.vcxproj -> D:\Music-soft\midifile-master\build\Release\mts-type9.exeperfid.vcxproj -> D:\Music-soft\midifile-master\build\Release\perfid.exereadstatus.vcxproj -> D:\Music-soft\midifile-master\build\Release\readstatus.exeredexpress.vcxproj -> D:\Music-soft\midifile-master\build\Release\redexpress.exeremovenote.vcxproj -> D:\Music-soft\midifile-master\build\Release\removenote.exeretick.vcxproj -> D:\Music-soft\midifile-master\build\Release\retick.exeshutak.vcxproj -> D:\Music-soft\midifile-master\build\Release\shutak.exesmfdur.vcxproj -> D:\Music-soft\midifile-master\build\Release\smfdur.exestretch.vcxproj -> D:\Music-soft\midifile-master\build\Release\stretch.exesysextest.vcxproj -> D:\Music-soft\midifile-master\build\Release\sysextest.exetemper.vcxproj -> D:\Music-soft\midifile-master\build\Release\temper.exetext2midi.vcxproj -> D:\Music-soft\midifile-master\build\Release\text2midi.exetextmidi.vcxproj -> D:\Music-soft\midifile-master\build\Release\textmidi.exetoascii.vcxproj -> D:\Music-soft\midifile-master\build\Release\toascii.exetobin.vcxproj -> D:\Music-soft\midifile-master\build\Release\tobin.exetobinary.vcxproj -> D:\Music-soft\midifile-master\build\Release\tobinary.exetodec.vcxproj -> D:\Music-soft\midifile-master\build\Release\todec.exetohex.vcxproj -> D:\Music-soft\midifile-master\build\Release\tohex.exetype0.vcxproj -> D:\Music-soft\midifile-master\build\Release\type0.exevlv.vcxproj -> D:\Music-soft\midifile-master\build\Release\vlv.exe
    

    cd D:\Music-soft\midifile-master\build\Release
    fund2mid.exe 660008
    生成成功: melo_660008.mid

\python\mido_msg.py melo_660008.mid
\python\play_mid.py  melo_660008.mid 


 

相关文章:

Cmake:Win10 如何编译 midifile C++应用程序

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 下载&#xff1a;midifile 项目 , 将 midifile-master.zip 解压到 D:\Music-soft 参阅: cmake超详细入门教程 CMake是一个跨平台的自动化建构系统,它使用一个名为 CMakeLi…...

QEMU源码全解析 —— 块设备虚拟化(14)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(13) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! 上一回开始解析VirtioDeviceClass的realize函数virtio_blk_device_realize(),再来回…...

软路由安装指南

1.openwrt下载 : 选择合适的安装包,我用的软路由CPU主板是j3160,属于X86_64架构,所以筛选的时候使用X86_64的安装镜像 openwrt的官方地址可能国内打不开,需要科学上网 openwrt安装镜像下载地址 我准备用U盘引导小主机开机,进而安装openwrt操作系统,所以下载 .img.gz 文…...

机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处

在机器视觉行业&#xff0c;真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构&#xff0c;构建可验证的技术能力护城河。记住&#xff1a;你的专业精度决定职业高度&#xff0c;而专注密度决定成长速度。 作为机器视觉工…...

Oracle 数据库中,并行 DML

在 Oracle 数据库中&#xff0c;PL/SQL 的 BEGIN...END 块默认是串行执行的&#xff0c;但可以通过以下方法实现并行处理&#xff0c;提升大规模数据操作的性能&#xff1a; 并行 DML&#xff08;Data Manipulation Language&#xff09; 在 BEGIN...END 块中启用并行 DML&am…...

Spring Boot 集成 Redis中@Cacheable 和 @CachePut 的详细对比,涵盖功能、执行流程、适用场景、参数配置及代码示例

以下是 Cacheable 和 CachePut 的详细对比&#xff0c;涵盖功能、执行流程、适用场景、参数配置及代码示例&#xff1a; 1. 核心对比表格 特性CacheableCachePut作用缓存方法的返回结果&#xff0c;避免重复计算执行方法并更新缓存&#xff0c;不覆盖原有缓存执行流程缓存命中…...

3500 阶乘求和

3500 阶乘求和 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;2023、思维、省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {long sum 0;for(int i1;i<50;i) { // 之后取模都相等su…...

软件工程(应试版)图形工具总结(二)

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 教材参考《软件工程导论&#xff08;第六版&#xff09;》 七、 层次图&#xff08;H图&#xff09;与HIPO图 1、概述 1.1、层次图&#xff08;Hierarchy Chart / H图&#xff09; ​核心…...

思维链、思维树、思维图与思维森林在医疗AI编程中的应用蓝图

在医疗AI编程中,思维链(Chain of Thought, CoT)、思维树(Tree of Thoughts, ToT)、思维图(可能指知识图谱或逻辑图)以及思维森林(Forest-of-Thought, FoT)等技术框架通过模拟人类认知和推理过程,显著提升了AI在复杂医疗场景中的决策能力和可解释性: 1. 思维链(CoT)…...

SpringBoot异步任务实践指南:提升系统性能的利器

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在现代Web应用中&#xff0c;高并发场景下的响应速度和资源利用率是系统设计的重要考量。SpringBoot通过简洁的异步任务机制&#xff0c;帮助开发者轻松…...

化工行业如何通过定制化工作流自动化实现25-30%成本优化?

作者&#xff1a;Mihir Jhaveri 编译&#xff1a;李升伟 发布日期&#xff1a;2024年10月30日 在化工生产领域&#xff0c;数字化转型正以颠覆性态势重塑产业格局。通过集成定制化软件、ERP系统、工业物联网&#xff08;IIoT&#xff09;传感网络、机器人流程自动化&#xff0…...

嵌入式硬件篇---嘉立创PCB绘制

文章目录 前言一、PCB绘制简介1.1绘制步骤1.1.1前期准备1.1.2原理图设计1.1.3原理图转PCB1.1.4PCB布局1.1.5布线1.1.6布线优化和丝印1.1.7制版1.2原理1.2.1电气连接原理1.2.2信号传输原理1.2.3电源和接地原理1.3注意事项1.3.1元件封装1.3.2布局规则1.3.3过孔设计1.3.4DRC检查1.…...

CSS Id 和 Class 选择器学习笔记

一、概述 在 CSS 中&#xff0c;id 和 class 选择器是用于为 HTML 元素指定样式的强大工具。它们可以帮助我们精确地控制页面中元素的样式&#xff0c;让页面设计更加灵活和高效。 二、id 选择器 1. 定义和使用 定义&#xff1a;id 选择器用于为具有特定 id 属性的 HTML 元素…...

Linux的 /etc/sysctl.conf 笔记250404

Linux的 /etc/sysctl.conf 笔记250404 /etc/sysctl.conf 是 Linux 系统中用于 永久修改内核运行时参数 的核心配置文件。它通过 sysctl 工具实现参数的持久化存储&#xff0c;确保系统重启后配置依然生效。以下是其详细说明&#xff1a; &#x1f4c2; 备份/etc/sysctl.conf t…...

LocaDate、LocalTime、LocalDateTime

Java8的时间处理 Java的时间处理在早期版本中存在诸多问题&#xff08;如 java.util.Date 和 java.util.Calendar 的混乱设计&#xff09;&#xff0c;但Java8引入了引入了全新的 java.time包&#xff08;基于JSR 310&#xff09;&#xff0c;提供了更清晰、线程安全且强大的时…...

1.Qt信号与槽

本篇主要介绍信号和槽&#xff0c;如何关联信号和槽以及用QPixmap在窗口中自适应显示图片 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. 信号 一般不需要主动发送信号&#xff0c;只有自定义的一些控件才需要做信号的…...

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…...

shell语言替换脚本、填补整个命令行

shell语言替换脚本 填补整个命令行正则查询服务器指定路径替换内容 填补整个命令行 多用于脚本显示 seq -s "*" tput cols |tr -d [:digit:]正则查询 grep -r -E register[0-9]{5} /www/wwwroot服务器指定路径替换内容 #!/bin/bash cat > 1.sh << EOF #…...

数据分析与知识发现 论文阅读【信息抽取】

文章目录 基于知识蒸馏的半监督古籍实体抽取数据集模型实验结果 基于大语言模型的专利命名实体识别方法研究数据集评估公式实验 基于数据增强和多任务学习的突发公共卫生事件谣言识别研究数据集实验结果 参考 基于知识蒸馏的半监督古籍实体抽取 数据集 本文在有监督数据集的基…...

Compose组件转换XML布局

文章目录 学习JetPack Compose资源前言&#xff1a;预览界面的实现Compose组件的布局管理一、Row和Colum组件&#xff08;LinearLayout&#xff09;LinearLayout&#xff08;垂直方向 → Column&#xff09;LinearLayout&#xff08;水平方向 → Row&#xff09; 二、相对布局 …...

Linux开发工具——vim

&#x1f4dd;前言&#xff1a; 上篇文章我们讲了Linux开发工具——apt&#xff0c;这篇文章我们来讲讲Linux开发工具——vim &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&a…...

Vue3学习二

认识组件的嵌套 还可以将Main中内容再划分 scoped防止组件与组件之间的样式相互污染 组件的通信 父子组件之间通信的方式 父组件传递给子组件 给传过来的内容做限制 type为传的内容的属性类型&#xff0c;required为true表示该内容是必须传的&#xff0c;default为&#xff0c…...

[ deepseek 指令篇章 ]300个领域和赛道喂饭级deepseek指令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、握手问题-&#xff08;解析&#xff09;-简单组合问题&#xff08;别人叫她 鸽巢定理&#xff09;&#x1f607;&#xff0c;感觉叫高级了…...

C++ | C++11知识点

前言&#xff1a; 本篇内容讲述了C11中比较重要的内容为&#xff1a;右值引用、可变参数模板、lambda表达式和包装器。 ps&#xff1a;包装器博主在另一篇文章讲述的&#xff0c;本篇文章包装器板块为原文链接。 C11知识点目录 花括号初始化自定义类型的花括号初始化内…...

LeetCode 1123.最深叶节点的最近公共祖先 题解

昨天写了三题&#xff0c;今天目前为止写了一题&#xff0c;玩了会游戏稍微休息了下 先来理解一下今天的题目&#xff0c;今天的题目类型是递归遍历找最深位置&#xff0c;先通过几个样例了解一下 输入&#xff1a;root [3,5,1,6,2,0,8,null,null,7,4] 输出&#xff1a;[2,7,…...

C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、责任链模式的基本介绍 1.1 模式定义与核心思想 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将请求的发送者和接收者解耦。通过创建一个由多个处理节点组成的链条&#xff0c;每个节点依次尝试处理请…...

工具介绍 | SafeLLMDeploy教程来了 保护本地LLM安全部署

SafeLLMDeploy&#xff1a;保护本地大语言模型安全部署的“守护者” 在AI技术飞速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;如GPT、DeepSeek等正以前所未有的方式改变着我们的工作和生活。然而&#xff0c;本地部署这些强大的AI系统在带来便利的同时&…...

我该怎么设置SVN客户端的认证信息?

设置SVN客户端的认证信息通常取决于您使用的SVN客户端类型&#xff08;命令行客户端或图形界面客户端&#xff09;。以下是一些常见SVN客户端的设置方法&#xff1a; 1. 使用命令行SVN客户端 对于命令行SVN客户端&#xff0c;您通常在执行SVN命令时直接输入用户名和密码&…...

机器学习-04-分类算法-03KNN算法案例

实验名称 K近邻算法实现葡萄酒分类 实验目的 通过未知品种的拥有13种成分的葡萄酒&#xff0c;应用KNN分类算法&#xff0c;完成葡萄酒分类&#xff1b; 熟悉K近邻算法应用的一般过程&#xff1b; 通过合理选择K值从而提高分类得到正确率&#xff1b; 实验背景 本例实验…...