节拍器(HTML5版)

OpenSpec工作流协议:命令行开发的结构化节拍器 OpenSpec是一种面向终端开发者的轻量级工作流协议规范,它不替代Shell脚本,而是通过声明式YAML对命令执行顺序、依赖关系和环境约束进行结构化建模。其核心原理是将隐式的人脑操作逻辑转化为机器可读、可验证、可版本化的标准描述,从而提升开发效率、协作可信度与CI/CD可复现性。技术价值体现在零依赖执行器、跨平台兼容性及四种模式(基础/确定性/协作/超能力)的场景化适配能力。典型应用场景包括嵌入式固件发布、AI应用调试、多团队运维手册协同等,尤其适合需要兼顾命令行原生体验与工程化治理的中大型技术团队。 阅读详情
跑步的步频是180,走路的步频是130,跑步或走路时听的音乐节拍也要与步频一致,像我这样的严重强迫症患者,多一拍少一拍都不行,因此要找到相应节奏的音乐很不容易。
网上找了很多的节拍器,都是设定频率后开始打拍,问题是我不可能知道一首音乐的精确节拍,一点一点试的话太麻烦!所以还是自己动手吧!
下面这个节拍器中有一个“连续点击测速”的按钮,可以听着音乐按节拍点击按钮,会测出节拍的具体频率,再通过加减精调,实在是方便 (^_^)


2018-03-27:【连续点击测速】这个功能加以改进,取多次点击后的平均速度值,这样结果更准确。

把下面的代码保存为 html 格式。代码中使用了 Web Audio API,动态生成音效,所以无需单独的音频文件。
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>节拍器</title>
    <style>
        *{padding: 0;margin: 0;}
        header{background-image: linear-gradient(to bottom,#4387fd,#4683ea);padding: 20px;font-size: 30px;color: #fff;}
        footer{padding: 20px;text-align: center;color: #ccc;}
        footer>a{color: #999;}
        body>section{text-align: center;padding: 20px;width: 300px;margin: auto;}
        body>section>section{margin: 30px auto;}
        body>section>section>div{display: flex;justify-content:space-between;align-items: center;}
        button {padding: 5px 10px;}
        #btnTest {padding: 15px 30px;font-size: 20px;}
        #btnStop {display: none;}
        #speed{font-size: 50px;padding:0 20px;width: 100px;}
        #msg{height: 20px;padding-top: 5px; font-size: 9px;color: gray;}
    </style>
    <script>

        document.addEventListener("DOMContentLoaded", function () {

            let speed = 60, //节拍速度
                arrClick = [],  //测速时每次点击的速度组成的数组,节拍速度取其平均值
                clickTime = 0,  //测速点击计时器,超过 3 秒清空数组
                s = Date.now(), //记录每一次点击的时间,下一次点击时与此时间的间隔,来计算速度
                time = 0,   //play 过程 timeout 变量
                isPlay = false, //是否正在播放
                speedMsg = document.getElementById("speed"),    //页面正中间显示速度值的元素
                rangeValue = document.getElementById("rangeValue"), //滑块元素
                showSpeed = () => rangeValue.value = speedMsg.innerText = speed;    //更新显示速度值的函数

            /** 测速按钮点击 */
            document.getElementById("btnTest").addEventListener("click", function () {
                let lastSpeed = Math.floor(60000 / (Date.now() - s));
                if (lastSpeed - arrClick[arrClick.length - 1] > 30) { arrClick = []; }  //如果点击时间和上次差别较大,则清零重测
                arrClick.push(lastSpeed);

                if (arrClick.length > 31) arrClick.shift(); //最大容量保持在30个(除去第 1 个不用)

                //如果数量多于1个则计算速度(第 1 个时间间隔太久,不准确,弃之)
                if (arrClick.length > 1) {
                    //取第2个到最后的平均值
                    speed = Math.ceil((arrClick.reduce((sum, n) => sum + n) - arrClick[0]) / (arrClick.length - 1));
                    if (arrClick.length > 5) document.getElementById("msg").innerText = "多点几次更准确...";
                }
                showSpeed();
                s = Date.now();
                document.getElementById("btnStop").click(); //测速时停止播放

                //两次点击间隔大于 3 秒就重置
                window.clearTimeout(clickTime);
                clickTime = window.setTimeout(function () {
                    arrClick = [];
                    document.getElementById("msg").innerText = "";
                }, 3000);

            });

            /** 播放按钮点击 */
            document.getElementById("btnPlay").addEventListener("click", function () {
                isPlay = true;
                play();
                this.style.display = "none";
                document.getElementById("btnStop").style.display = "inline-block";
            });

            /** 停止按钮点击 */
            document.getElementById("btnStop").addEventListener("click", function () {
                window.clearTimeout(time);
                isPlay = false;
                this.style.display = "none";
                document.getElementById("btnPlay").style.display = "inline-block";
            });

            /** 减号按钮点击 */
            document.getElementById("btnSub").addEventListener("click", function () {
                speed--;
                showSpeed();
            });

            /** 加号按钮点击 */
            document.getElementById("btnAdd").addEventListener("click", function () {
                speed++;
                showSpeed();
            });

            /** 滑动条更改 */
            rangeValue.addEventListener("change", function () {
                speed = this.value * 1;
                showSpeed();
            });

            /** 播放 */
            let play = () => {
                window.clearTimeout(time);
                playsound();
                if (isPlay) {
                    time = window.setTimeout(play, Math.floor(60000 / speed));
                };
            }

            let audioCtx = new AudioContext();
            /** 发声 */
            let playsound = () => {
                let oscillator = audioCtx.createOscillator();
                let gainNode = audioCtx.createGain();
                oscillator.connect(gainNode);
                gainNode.connect(audioCtx.destination);
                oscillator.type = 'sine';
                oscillator.frequency.setValueAtTime(220, audioCtx.currentTime);
                oscillator.frequency.linearRampToValueAtTime(50, audioCtx.currentTime + 0.1);
                gainNode.gain.setValueAtTime(0, audioCtx.currentTime);
                gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.01);
                gainNode.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.5);
                oscillator.start(audioCtx.currentTime);
                oscillator.stop(audioCtx.currentTime + 0.5);
            }
        });
    </script>
</head>

<body>
    <header>节拍器</header>
    <section>
        <button id="btnTest">连续点击测速</button>
        <div id="msg"></div>
        <section>
            <div>
                <button id="btnSub"><svg style="width: 16px; height: 16px;vertical-align: middle;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M66.462276 431.621065l891.075447 0 0 127.296492L66.462276 558.917558 66.462276 431.621065z"></path></svg></button>
                <div id="speed">60</div>
                <button id="btnAdd"><svg style="width: 16px; height: 16px;vertical-align: middle;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1024 448H576V0H448v448H0v128h448v448h128V576h448z"></path></svg></button>
            </div>
            <div><input type="range" style="width:100%;" min="20" max="300" id="rangeValue" value="60"></div>
        </section>
        <button id="btnPlay">
            <svg style="width: 32px; height: 32px;vertical-align: middle;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M196.394461 103.235223 196.394461 920.764777 827.604516 535.079648Z"></path></svg>
        </button>
        <button id="btnStop">
            <svg style="width: 32px; height: 32px;vertical-align: middle;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M256 256l512 0 0 512-512 0z"></path></svg>
        </button>
    </section>
    <footer>2018-02-05 by <a href="mailto://zk1218@gmail.com">zhangkai</a></footer>
</body>

</html>

像素小鸟飞行HTML5游戏源码完整解析与实战 从Canvas绘图到动画循环,从物理模拟到碰撞检测,再到状态管理和本地存储——我们一步步构建了一个完整的HTML5小游戏骨架。这其中每一个环节都不是孤立存在的,而是相互协作、共同支撑起整个系统的稳定运行。你会发现,真正难的不是某个具体的技术点,而是如何把这些模块有机地组织在一起。就像搭积木一样,每一块都要放得恰到好处,才能建成一座坚固的大厦。现在,轮到你了!不妨试着在这个基础上添加新功能:- 加入昼夜交替效果?- 设计不同的主题皮肤?- 实现排行榜联网功能? 阅读详情

相关推荐

节拍器软件电子节拍器v10.0.2.54中文绿色免费版

节拍器是帮助没有乐感的人找拍子点的,上面可以设置,按设置好的拍数来弹琴。如何你没用,证明你乐感很好,用不着。我用过最好的电子节拍器,我是用在吉他学习上。

使用H5开发一个网页版的节拍器

使用H5开发一个网页版的节拍器

qq7327559的博客 1852

metronome-vue:用VueJS制作的节拍器应用程序

VueJS网络音频节拍器 用VueJS制作的Web音频节拍器 以@scottwhudson的节拍器为起点,将其应用程序移植为VueJS SPA。 构建设置 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for production and view the bundle analyzer report npm run build --report

用JS实现一个网页版节拍器

平时练尤克里里经常用到节拍器,突发奇想自己用js开发一个。

weixin_43805705的博客 1552

BeatDetect.js:节拍器检测音频文件。 接吻,灯光和图书馆免费

BeatDetect.js BeatDetect.js是一个JavaScript ES6组件,用于计算曲目的BPM,包括其时间偏移和到其第一个真实拍子的时间偏移。 有几种方法可以微调流程,但是BeatDetect.js可以根据4/4 BeatDetect.js与现代音乐(在EDM音乐上效果更好)结合使用,效果最佳。 在最小化〜5Ko的情况下, BeatDetect.js旨在稳定并保持尽可能轻的状态。 它应该用于客户端; 不幸的是,nodejs不支持Web音频API。 开始使用 该存储库用于存储文档,测试平台和源代码。 如果要在项目中包含此组件,则在项目中有资产捆绑器的情况下需要src/BeatDetect.js文件,或者使用dist/BeatDetect.min.js使用缩小的组件。 出于兼容性原因,此缩小的文件在ES5 JavaScript中进行了编译。 相反,未缩小的文件是用ES6

节拍器

节拍器

html柱状图怎么将数字表在显示条上_学钢琴,节拍器什么时候用?怎么用才正确?| 钢琴知识...

学钢琴必备的神器-节拍器,节拍器是什么呢?节拍器什么时候用?怎么用才正确?下面诺英德曼钢琴与大家介绍节拍器的使用方法。往期文章:正确使用钢琴节拍器 钢琴入门 | 诺英德曼钢琴一、什么是节拍器节拍器(Metronome),又叫拍子机,是一种能规律发出声音或视觉效果来显示节拍的器材,通常用来提供一个稳定的节拍和速度;音乐上以每分钟几拍(Beats Per Minute,BPM)来计算速度。在百度百科找...

weixin_39928003的博客 313

gi-metronome:使用 Gibberish 的简单 HTML5 JS 节拍器

节拍器 使用 Gibberish 的简单 HTML5/JS 节拍器

CSS 节拍器

HTML代码: <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" href="css/new_file.css" /> <script src="js/jquery-1.4.2.min.js"></script> </head> <body> <inpu

qq_52899829的博客 200

音乐节拍器

音乐节拍器,参数可自定义。Flash格式

FineMetronome专业音乐节拍器V3.6.1官方特别版版

Fine Metronome 是一个学习音乐必备的节拍器软件,给您在您的PC或笔记本电脑的惊人准确的音频和视觉参考。采用特殊的“抖动”算法,节拍器进行完全正确甚至爆炸速度达999 BPM! 软件特色 容易使用:你不能想定义音乐米然后罚款节拍器更简单的方法。你可以在方便的符号输入表,如3 2,或安排在一个网格的强与弱的口音。 方便的:Fine Metronome接口简化,不打扰你的游戏。使

手势控制智能节拍器:基于Arduino/ESP8266的嵌入式开发实践

嵌入式系统开发是物联网和智能硬件的核心技术基础,它通过微控制器编程实现对物理世界的感知与控制。其原理在于利用传感器采集环境数据,经由处理器进行实时运算与决策,最终驱动执行器完成特定功能。这项技术的核心价值在于能够构建高度定制化、低功耗、实时响应的专用设备,极大地拓展了传统电子产品的交互方式与应用边界。在音乐练习、智能家居、工业控制等场景中,嵌入式系统通过融合手势识别、无线通信等技术,为用户带来无缝、直观的操作体验。本文聚焦于手势控制节拍器的实现,详细解析了如何利用APDS-9960传感器进行手势识别,并结合

weixin_34221773的博客 375

JSMetronome:精美HTML5节拍器(点击,拍子细分,拍号...)-开源

JSMetronome完全采用HTML5(JavaScript + HTML + CSS),因此可以在配备了现代Web浏览器的所有操作系统(包括平板电脑和智能手机)上运行。 版本0.1状态:测试版请执行以下操作:-细分-离线模式(本地存储)

终极指南:用howler.js从零打造专业音频节拍器实现精准节奏检测与可视化

howler.js是一款功能强大的现代Web音频处理JavaScript库,它为开发者提供了简单易用的API来处理音频播放、节拍检测和可视化。本指南将带你从零开始,利用howler.js构建一个专业的音频节拍器,实现精准的节奏检测与动态可视化效果。 ## 为什么选择howler.js打造节拍器? 在众多JavaScript音频库中,howler.js凭借其出色的跨平台兼容性和丰富的功能脱颖而出

gitblog_01026的博客 464

2024年最全scrapy+scrapyd+gerapy 爬虫调度框架,字节跳动面试时间

scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们方便地控制爬虫运行直观地查看爬虫状态实时地查看爬取结果简单地实现项目部署统一地实现主机管理轻松地编写爬虫代码。

2401_84140653的博客 1201

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1135

基于Arduino与手势识别的智能节拍器:嵌入式系统与物联网实践

嵌入式系统作为连接物理世界与数字世界的桥梁,其核心在于通过微控制器实时感知、处理并响应外部信号。其工作原理通常围绕传感器数据采集、中央处理器决策与执行器驱动展开。在物联网与智能硬件领域,这种技术架构的价值在于能够创造无缝、直观的人机交互体验,解决传统设备交互繁琐的痛点。典型的应用场景包括智能家居、可穿戴设备以及交互式艺术装置。本文聚焦于一个融合了手势识别、实时音频生成与无线通信的嵌入式项目——手势控制智能节拍器。该项目以广受欢迎的Arduino平台结合ESP8266 Wi-Fi模块为核心,详细阐述了如何利用

weixin_33834137的博客 454

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1333

摇滚吧HTML5!有声前端交互!(一)

  生命的伊始,婴儿用明亮的哭声宣告一个新生命的诞生,睁开双眼之前,一双小耳朵已经开始聆听这个世界。在如今的用户体验领域,几乎所有公司都会有视觉设计师,却鲜有注重听觉交互的公司。随着各大厂商对HTML5支持的日渐完善,前端工程师其实早已可以摆弄各种音波,让复合型开发走得更远。   声波是一种机械波,通过波的物理属性我们可以做很多事情。比如,利用声波的频率编码进行数据传递,分析频域或者时域的数据进...

weixin_30929295的博客 132

Ubuntu图形界面崩溃?从tty到GUI的终极修复指南

本文提供了Ubuntu图形界面崩溃后进入tty的终极修复指南。详细介绍了如何诊断显示管理器(如LightDM或GDM3)状态,并通过重装、切换显示管理器、修复依赖、系统升级及排查显卡驱动等核心方案,逐步恢复GUI。帮助用户从命令行界面高效修复桌面环境,避免数据丢失。

vulkan6gpu的博客 778

PLC模拟量输入电路设计:±10V与±20mA信号调理全解析

在工业自动化和数据采集系统中,模拟量输入是连接物理世界与数字控制的核心桥梁。无论是变送器输出的4-20mA电流环,还是伺服驱动与信号发生器提供的±10V电压信号,PLC和采集模块都需要在复杂现场环境下稳定、精准地完成信号采集。理解信号体制的原理——电流环抗长线干扰、电压环响应快——是设计模拟输入前端的基础。通过精密电阻网络实现分压与采样,利用运放完成双极性到单极性的电平搬移,配合TVS与滤波电路保障可靠性,并经过ADC量化与校准流程,最终构建出兼顾精度、成本和工业级鲁棒性的完整信号链路。本文面向硬件工程师与

weixin_29163797的博客 301

NoizAI零基础教程:你的第一个AI音乐程序

作为一个刚接触编程的音乐爱好者,我记录下自己制作第一个节拍器的过程,希望能帮到同样想尝试的朋友。NoizAI生成的代码结构很清晰,注释也详细,改起来完全没压力。如果你也想体验AI编程的乐趣,这个音乐小项目真是绝佳的起点。上尝试,它的一键部署功能让网页应用可以直接在线运行,不用折腾本地环境。比如把sine改成square波,马上就能听到更尖锐的电子音效,特别有成就感。- 第42行:音色振荡器类型选择(sine/square/sawtooth)- 音色类型:影响声音的质感(如鼓点、三角铁等)

CyanWave34的博客 1013

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1186
上一篇: CSS 仿 iOS 系统通知数字样式
下一篇: 只显示页面图片的油猴脚本
Triumph
博客等级 码龄26年 13粉丝 45原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值