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

nodejs:midi-writer-js 将基金净值数据转换为 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

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

mkdir test-midi
cd test-midi
npm init -y 
cnpm install csv-parser -S
cnpm install midi-writer-js -S

编写 fund2midi.js  如下

// fund2midi.js
const fs = require('fs');
const csv = require('csv-parser');
const MidiWriter = require('midi-writer-js');// 参数验证
const args = process.argv.slice(2);
if (args.length !== 1 || args[0].length !== 6) {console.log('用法: node fund2midi.js <6位基金代码>');process.exit(1);
}const fcode = args[0];
const csvFile = `/funds/data/${fcode}.csv`;
const outputFile = `melo_${fcode}.mid`;// 读取并处理CSV数据
async function processData() {const results = [];return new Promise((resolve, reject) => {fs.createReadStream(csvFile).pipe(csv()).on('data', (data) => {if (data.date > '2024-01-01') {results.push({date: data.date,jz: parseFloat(data.jz)});}}).on('end', () => {if (results.length < 20) {console.log(`${results.length} < 20`);process.exit(2);}resolve(results);}).on('error', reject);});
}// 生成MIDI文件
function generateMIDI(prices) {const track = new MidiWriter.Track();track.setTempo(120);// 数据归一化const minPrice = Math.min(...prices);const maxPrice = Math.max(...prices);const priceRange = maxPrice - minPrice;// 计算音符范围let minNote = 48; // C3let maxNote = 84; // C5if ((maxPrice / minPrice) < (84 / 48)) {maxNote = Math.round(50 * (maxPrice / minPrice));}if (maxNote % 2 === 1) maxNote++;prices.forEach(price => {const pitch = (priceRange < 0.001)? Math.round((maxNote + minNote) / 2): minNote + Math.round(((price - minPrice) / priceRange) * (maxNote - minNote));const note = new MidiWriter.NoteEvent({pitch: [pitch],duration: '4',velocity: 63   // 音量: 63% *127 = 80});track.addEvent(note);});// 直接在构造函数中传入轨道数组const writer = new MidiWriter.Writer([track]);return writer;
}// 主流程
(async () => {try {const data = await processData();const prices = data.map(d => d.jz);console.log(`基金代码: ${fcode}`);console.log(`数据量: ${prices.length}`);console.log(`最大值: ${Math.max(...prices)}`);console.log(`最小值: ${Math.min(...prices)}`);const midi = generateMIDI(prices);fs.writeFileSync(outputFile, midi.buildFile(), 'binary');console.log(`生成成功: ${outputFile}`);} catch (err) {console.error('发生错误:', err.message);process.exit(1);}
})();

运行 node fund2midi.js 660008 
生成 melo_660008.mid

运行 python play_mid.py melo_660008.mid 

运行 python mido_msg.py melo_660008.mid 查看 midi文件内容

相关文章:

nodejs:midi-writer-js 将基金净值数据转换为 midi 文件

开放式基金是没有公布每日交易量的。 /funds/data/660008.csv 文件开头&#xff1a; date,jz,ljjz 2016-01-04,1.1141,1.1141 2016-01-05,1.1161,1.1161 2016-01-06,1.1350,1.1350 这是一个将开放式基金数据转换为 MIDI音乐的 js 程序示例。该程序将基金净值映射为 MIDI音符的…...

新能源汽车空调系统(R134A)性能评估(一)

国内外主流空调系统厂家&#xff1a;贝尔、德尔福、空调国际、法雷奥、电装、松芝、杰信、新电、豫新等 泛亚汽车的空调电子部是比较优秀的整车空调研发团队。 空调系统综合试验台架是一套由试验室、风量测定装置、空气调和器、空气温度测定装置、湿度测定装置、加热器试验辅助…...

Oracle 数据库中优化 INSERT INTO 操作的性能

在 Oracle 数据库中优化 INSERT INTO 操作的性能&#xff0c;尤其是在处理大批量数据时&#xff0c;可以通过以下方法显著提升效率。 使用直接路径插入&#xff08;Direct-Path Insert&#xff09; 通过 APPEND 提示绕过缓冲区缓存&#xff0c;直接写入数据文件&#xff0c;减…...

Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程

在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考&#xff1a; 点击这里获取MongoDB Community Edition安装教程 今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1. 大模型 ChatGLM4 微调步骤 1.1 从 github…...

Java 中的继承与多态:面向对象编程的核心特性

继承和多态是面向对象编程中最重要的两个概念&#xff0c;它们使代码结构更加清晰、灵活&#xff0c;并极大地提高了代码复用性。本文将深入探讨 Java 中的继承与多态&#xff0c;帮助你更好地理解这些核心概念。 1. 继承 1.1 为什么需要继承 在实际编程中&#xff0c;我们经…...

可编程增益放大器(PGA)在智能传感器自调节系统中的角色

在电子电路设计中&#xff0c;放大器芯片作为信号处理的核心器件&#xff0c;其性能直接影响系统整体表现。然而面对运算放大器、功率放大器、仪表放大器等众多类型&#xff0c;工程师常陷入选型困惑。作为国内领先的半导体解决方案提供商&#xff0c;华芯邦深耕放大器芯片领域…...

微信登录、商品浏览前瞻

一.业务效果 二.所需技术...

浙大研究团队揭示电场调控5-HT1AR的分子机制

本期介绍的文章题为 “Structural Insight into the Inactive/Active States of 5‑HT1AR and Molecular Mechanisms of Electric Fields in Modulating 5‑HT1AR” 。近期发表于JCIM。通过分子动力学模拟&#xff0c;探究 5-羟色胺 1A 受体(5-HT1AR) 在非活性 / 活性状态的构象…...

RoboOS与RoboBrain:引领具身智能新时代的跨本体协作框架

摘要 2025年3月29日&#xff0c;智源研究院在中关村论坛的“未来人工智能先锋论坛”上发布了两项重要成果&#xff1a;跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain。这一创新技术使机器人能够实现跨场景多任务部署及跨本体协作&#xff0c;推动单机智能向群体智能…...

视频AI赋能水利行业生态治理,水电站大坝漂浮物实时监测与智能预警方案

水电站大坝周边水域垃圾漂浮物不仅影响水质&#xff0c;还可能对大坝设施运行、水生态环境造成威胁。传统依靠人工巡检的方式效率低、存在监测盲区&#xff0c;难以实时全面地掌握漂浮物情况。借助EasyCVR视频汇聚平台与TSINGSEE青犀AI算法中台构建智能化监测方案&#xff0c;能…...

SnapdragonCamera骁龙相机源码解析

骁龙相机是高通开发的一个测试系统摄像头的demo&#xff0c;代码完善&#xff0c;功能强大。可以配合Camera驱动进行功能联调。 很多逻辑代码在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包罗万象。 涉及到界面显示要结合CaptureUI.java 一起来实现。 Ca…...

Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解

RabbitMQ 作为一款高性能的消息中间件&#xff0c;在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成&#xff0c;开发者可以借助注解快速声明队列、交换机及绑定规则&#xff0c;极大简化了配置流程。本文将通过代码示例和原理…...

SecureCRT常用命令

一、连接命令 1. telnet&#xff1a;使用Telnet协议连接到远程设备。 例如&#xff1a;telnet 192.168.1.1 会连接到IP地址为192.168.1.1的远程设备。 二、文件传输命令 2. put&#xff1a;上传文件到远程服务器。 例如&#xff1a;put C:\localfile.txt /remotefolder 将本地文…...

flink 分组窗口聚合 与 窗口表值函数聚合 的区别

警告&#xff1a;分组窗口聚合已经过时。推荐使用更加强大和有效的窗口表值函数聚合。 参考官方文档 在 Apache Flink 中&#xff0c;分组窗口聚合&#xff08;Group Window Aggregation&#xff09; 和 窗口表值函数聚合&#xff08;Windowing TVF Aggregation&#xff09;…...

阿里云Tair KVCache:打造以缓存为中心的大模型Token超级工厂

一、Tair KVCache 简介 Tair KVCache 是阿里云瑶池旗下云数据库 Tair 面向大语言模型推理场景推出的 KVCache 缓存加速服务。 随着互联网技术的演进与流量规模的激增&#xff0c;缓存技术逐渐成为系统架构的核心组件。该阶段催生了 Redis 等开源缓存数据库&#xff0c;阿里巴巴…...

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…...

【JAVA】【疑难杂症解决!】org.springframework.transaction.UnexpectedRollbackException:

程序莫名其妙出现这个事务回滚错误,不显示具体错误信息!! 问题:前几天遇到一个问题,代码没有抛出我想要的带自定义提示消息的异常,却报了个这个,去搜了一下,大概原因如下: 因为我在方法上写了@Transactional注解,里边调用的service的方法上也写了@Transactional注解…...

[Effective C++]条款26:尽可能延后变量定义的出现时间

. 在C中&#xff0c;尽可能延后变量定义的出现时间&#xff0c;主要原因是为了提供代码的可读性&#xff0c;减少不必要的开销以及避免潜在的错误。 1、代码执行过程中抛出异常 如果在代码开头定义了变量&#xff0c;但在后续代码中抛出了异常&#xff0c;可能导致变量在未被使…...

如何在k8s中对接s3存储

github地址&#xff1a; https://github.com/majst01/csi-driver-s3 1.CSI for S3 这是用于 S3&#xff08;或兼容 S3&#xff09;存储的容器存储接口 (CSI)。它可以动态分配存储桶并通过Fuse mount将它们安装到任何容器中 2.状态 这仍处于试验阶段&#xff0c;不应在任何…...

基于TradingView和CTPBee的自动化期货交易系统实现

引言 在量化交易领域&#xff0c;TradingView因其强大的技术分析工具和丰富的指标库而广受欢迎&#xff0c;但是其不支持国内期货自动化交易&#xff0c;CTPBee则是一个优秀的国产Python期货交易接口。本文将介绍如何将两者结合&#xff0c;实现一个完整的自动化交易系统。 本…...

FPGA实现LED流水灯

一、在VsCode中写代码 1、建立工程项目文件water_led.v文件 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建water_led.v文件 4、打开文件tb&#xff0c;创建water_led_tb.v文件 5、用VsCode打开water_led.v文件&#xff0c;编写源代码 module water…...

电商场景下高稳定性数据接口的选型与实践

在电商系统开发中&#xff0c;API接口需要应对高并发请求、动态数据更新和复杂业务场景。我将重点解析电商场景对数据接口的特殊需求及选型方案。 一、电商API必备的四大核心能力 千万级商品数据实时同步 支持SKU基础信息/价格/库存多维度更新每日增量数据抓取与历史版本对比…...

4199. 公约数-公约数模版题

给定两个正整数 a 和 b。 你需要回答 q个询问。 每个询问给定两个整数 l,r&#xff0c;你需要找到最大的整数 x&#xff0c;满足&#xff1a; x 是 a 和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来 q 行&#xff0c;每行包…...

百度文库免费下载器

01 引言 在国内的环境下&#xff0c;Greasy Fork网站是彻底打不开了&#xff0c;导致好多小伙伴想要用脚本都没办法。 特别是需要某Wen库下载的小伙伴&#xff0c;之前还说实在没办法&#xff0c;去Greasy Fork网站上安个脚本就可下载&#xff0c;但是现在网站被墙了&#xf…...

[NCTF2019]True XML cookbook[XXE] [内网探测] [网络ip相关知识]

一模一样的登录界面 我直接故伎重演但是并卵 &#xff08;话说XXE注入之前好像其他博客都加上了<?xml version"1.0" encoding"utf-8"?>&#xff0c;但是不加好像也没有什么问题&#x1f914;&#xff09; <?php /** * autor: c0ny1 * date: …...

Qt | 电脑音频采集曲线Charts

01 audio.pro # 项目使用了charts(图表)模块和multimedia(多媒体)模块。QT += charts multimedia# 调试打印QT += coreHEADERS += \ widget.h \ xyseriesiodevice.hSOURCES += \ main.cpp\ widget.cpp \ xyseriesiodevice.cpptarget.path = $$[QT_INSTAL…...

Linux驱动的基本概念

一 交叉开发编译 概念&#xff1a;交叉开发编译(Cross Compilation)是指在一个平台上生成能在另一个不同平台上执行的代码的编译过程。这是嵌入式系统开发和跨平台软件开发中的常见技术。 二 系统启动流程 在Linux源码下&#xff0c;通过网口利用tftp协议把u-bantu下的uImage…...

win server2022 限制共享文件夹d

点击配额管理中的配额 然后创建配额 导入要配额的文件即可 然后确定即可...

Ansible(3)——主机清单与配置文件

目录 一、创建 Ansible 清单&#xff1a; 1、清单定义&#xff1a; 2、使用静态清单指定受管主机&#xff1a; &#xff08;1&#xff09;主机名称指定&#xff1a; &#xff08;2&#xff09;IP 地址指定&#xff1a; 3、验证清单&#xff1a; &#xff08;1&#xff0…...

C语言 【初始指针】【指针一】

引言 思绪很久&#xff0c;还是决定写一写指针&#xff0c;指针这块内容很多&#xff0c;也不是那么容易说清楚&#xff0c;这里尽可能写地详细&#xff0c;让大家理解指针。&#xff08;未完序&#xff09; 一、内存和地址 在讲指针前&#xff0c;需要有一个对内存和地址的认…...