js+css实现调用openai的api生成曲子的电子器弹奏练习学习程序代码
代码语言:html
所属分类:多媒体
代码描述:js+css实现调用openai的api生成曲子的电子器弹奏练习学习程序代码,可录制新曲,还可ai生成新的曲子,还可进入练习模式进行弹奏引导,支持所有兼容openai协议的api。
代码标签: js css 调用 openai api 生成 曲子 电子器 弹奏 练习 学习 程序 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>电子琴 · 录音 · 练习 · OpenAI 生成</title>
<style>
:root {
--bg: #0e0f13;
--card: #161821;
--card-2: #1e2230;
--text: #e8e8ef;
--muted: #a9afc6;
--accent: #7c9cff;
--ok: #34d399;
--warn: #f59e0b;
--err: #ef4444;
--whiteKey: #f7f7fb;
--whiteKeyActive: #dbeafe;
--blackKey: #1a1a1f;
--blackKeyActive: #374151;
}
* { box-sizing: border-box; }
body {
margin: 0; padding: 0;
background: linear-gradient(180deg, #0e0f13, #0d1220);
color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft Yahei", "Helvetica Neue", Arial, "Noto Sans", sans-serif;
}
header {
padding: 16px 20px;
border-bottom: 1px solid #232635;
background: rgba(22,24,33,0.8);
position: sticky; top: 0; backdrop-filter: blur(6px);
}
header h1 {
margin: 0; font-size: 18px; font-weight: 600;
display: flex; align-items: center; gap: 10px;
}
header h1 .dot { width: 10px; height: 10px; border-radius: 50%; background: var(--accent); display: inline-block; }
.container {
max-width: 1100px; margin: 0 auto; padding: 16px; display: grid; gap: 16px;
grid-template-columns: 1.1fr 0.9fr;
}
.card {
background: var(--card);
border: 1px solid #232635;
border-radius: 12px;
padding: 14px;
}
.card h2 { margin: 0 0 10px; font-size: 16px; font-weight: 600; }
.row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
label.small { font-size: 12px; color: var(--muted); }
input[type="text"], input[type="number"], input[type="password"], select, textarea {
background: var(--card-2); border: 1px solid #2b2f42; color: var(--text);
padding: 8px 10px; border-radius: 8px; outline: none; min-width: 0;
}
input[type="checkbox"] { transform: translateY(1px); }
button {
background: #2a2f47; color: var(--text); border: 1px solid #3a4060;
padding: 8px 12px; border-radius: 8px; cursor: pointer; transition: .15s;
}
button:hover { filter: brightness(1.08); transform: translateY(-1px); }
button.primary { background: #3b5bfd; border-color: #4a63ff; }
button.ghost { background: transparent; }
button.danger { background: #402126; border-color: #73333d; color: #ffb4bf; }
button:disabled { opacity: .55; cursor: not-allowed; transform: none; }
.pill { background: #20263b; color: var(--muted); padding: 4px 8px; border-radius: 999px; font-size: 12px; }
/* Piano */
.piano-wrap { padding: 10px; }
.piano {
position: relative; height: 220px; background: #11131a; border-radius: 12px;
border: 1px solid #2a2e42; overflow: hidden; user-select: none;
}
.white-keys, .black-keys { position: absolute; left: 0; right: 0; }
.white-keys { bottom: 0; top: 0; display: flex; align-items: end; padding: 0 8px; gap: 2px; }
.white-key {
position: relative; flex: 1 1 0; height: 190px; background: var(--whiteKey);
border-radius: 6px; border: 1px solid #cbd5e1; box-shadow: inset 0 -3px 0 rgba(0,0,0,.06);
}
.white-key.active { background: var(--whiteKeyActive); border-color: #93c5fd; }
.white-key.hint { box-shadow: inset 0 0 0 3px #93c5fd, 0 0 18px rgba(147,197,253,.6); }
.white-key.good { box-shadow: inset 0 0 0 3px #34d399, 0 0 18px rgba(52,211,153,.6); }
.white-key.bad { box-shadow: inset 0 0 0 3px #ef4444, 0 0 18px rgba(239,68,68,.6); }
.white-note { position: absolute; bottom: 10px; left: 0; right: 0; text-align: center; font-size: 12px; color: #666c80; }
.black-keys { top: 0; height: 120px; pointer-events: none; }
.black-key {
position: absolute; width: 28px; height: 120px; background: linear-gradient(#11131a, #05060a);
border-radius: 6px; border: 1px solid #2f3448; box-shadow: inset 0 -3px rgba(0,0,0,.5);
pointer-events: auto;
}
.black-key.active { background: var(--blackKeyActive); border-color: #475569; }
.black-key.hint { box-shadow: inset 0 0 0 3px #93c5fd, 0 0 18px rgba(147,197,253,.6); }
.black-key.good { box-shadow: inset 0 0 0 3px #34d399, 0 0 18px rgba(52,211,153,.6); }
.black-key.bad { box-shadow: inset 0 0 0 3px #ef4444, 0 0 18px rgba(239,68,68,.6); }
.kbd { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; font-size: 11px;
background: #101420; color: #a0a8c0; border: 1px solid #2a2f47; padding: 2px 6px; border-radius: 6px; }
.help { color: var(--muted); font-size: 12px; }
.list { display: flex; flex-direction: column; gap: 8px; }
.item {
background: var(--card-2); border: 1px solid #2b2f42; border-radius: 10px; padding: 10px;
display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center;
}
.item-title { font-weight: 600; }
.item-sub { color: var(--muted); font-size: 12px; }
.right-actions { display: flex; gap: 8px; align-items: center; }
.status { color: var(--muted); font-size: 13px; margin-top: 6px; min-height: 18px; }
.divider { height: 1px; background: #262b3f; margin: 8px 0; }
.badge { font-size: 11px; background: #21273e; color: #a9b1d6; border: 1px solid #2f3654; padding: 2px 6px; border-radius: 999px; }
@media (max-width: 980px) {
.container { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<header>
<h1>
<span class="dot"></span>
电子琴 · 录音 · 练习 · OpenAI 生成
<span class="pill">C4 ~ B5 · 单音</span>
</h1>
</header>
<div class="container">
<div class="card">
<h2>弹奏与录音</h2>
<div class="row" style="gap:14px; align-items:flex-end;">
<div>
<label class="small">速度 BPM</label><br />
<input type="number" id="bpm" min="40" max="220" step="1" value="96" style="width:90px" />
</div>
<div>
<label class="small">量化&.........完整代码请登录后点击上方下载按钮下载查看
















网友评论0