Music (موالف / ميترونوم / Drums)
تطبيق أدوات موسيقية. 7 علامات تبويب تغطي من تعلم ضبط الجيتار إلى توليد نغمة نقية لمعايرة سماعات الرأس، مع طبول مركبة على نمط TR-808 في المنتصف.

الفرق عن Tablatura: Music هو "أدوات منفصلة". Tablatura محرر متعدد المسارات. يتشاركون بدائيات الصوت (useAudioContext، drum synth، voices) ولكن لديهم UIs وتدفقات مختلفة تمامًا.
علامات التبويب السبع
| علامة التبويب | الوظيفة | لون الهوية |
|---|---|---|
| Tuner | موالف لوني YIN ±1 cent | أخضر #00d97e |
| Metronome | ميترونوم عالي الدقة (مجدول 25ms لوكأهيد) | برتقالي #ff9500 |
| Frequency | مولد نغمة نقية (50Hz–20kHz) + binaural beats | بنفسجي #af52de |
| Drums | طبول مركبة (16 pad × 3 kits) + sequencer | أحمر #ff453a |
| Piano | بيانو افتراضي 2 أوكتاف + sustain pedal | أزرق #5ac8fa |
| Chords | معرّف + مكتبة كوردات مع مخطط | أصفر #ffd60a |
| Scales | عارض السلالم (12 جذور × 12 نوع) | فيروزي #5ee3ff |
Tuner
موالف لوني باستخدام YIN (Cheveigne & Kawahara 2002) — ~250 سطر من الكود، بدون dep، دقة ~1 cent. نطاق 50-2000Hz يغطي جميع الأدوات الشائعة.
3 أوضاع للعرض:
- Needle (افتراضي): مؤشر vintage على نمط الموالف الفيزيائي، مع رسم بياني للتوقيت آخر 10 ثوانٍ
- Spectrum: FFT bars (نمط الموالف الكلاسيكي للمسرح)
- VU: مقياس VU retro مع ballistic damping
Reference A قابل للتكوين (415-466 Hz، افتراضي 440). مفيد للموسيقى الباروكية (415) أو الجاز vintage (442).
Recording session: انقر "تسجيل" → يسجل حتى 60 ثانية من الصوت + timeline { t, freq, cents, note } يصبح رسمًا بيانيًا في النهاية. جيد لمعرفة ما إذا كنت غير مضبوط في بعض الفقرات.
Metronome
مجدول عالي الدقة (لوكأهيد 100ms يجدول الأحداث في AudioContext.currentTime). setInterval ينحرف — هذا لا.
- BPM: 40-240
- التوقيت: 4/4 (افتراضي)، 3/4، 6/8، 5/4، 7/8، 12/8
- التقسيم الفرعي: ربع، ثامن، triplets، سادس عشر
- 4 أصوات (click / woodblock / cowbell / beep) — كل منها له متغير "accent" أعلى في النبضة 1
- BPM Detector: اضغط "اكتشف BPM"، انقر الإيقاع بالكاميرا/الميكروفون. الخوارزمية تجمع onset detection + autocorrelation. مفيد لعمل cover للموسيقى بدون نوتة
- Practice Timer: countdown متكامل. يشغل الميترونوم لـ X دقيقة، يوقف معًا
Frequency Generator
OscillatorNode نقي مع 4 موجات (sine / square / triangle / sawtooth). من 50Hz إلى 20kHz. شريط تمرير الصوت 0-100% بمنحنى log (غير خطي للمطابقة الإدراكية).
Binaural beats (تبديل): يشغل تردد واحد في الأذن اليسرى، آخر مختلف قليلًا في اليمنى. يدرك الدماغ الفرق (1-30Hz) كتردد ثالث وهمي. يستخدم في تطبيقات التأمل/التركيز. لا يستبدل الأذن السريرية، تجريبي.
Effects chain (تبديل تشغيل/إيقاف): reverb + delay اختياريان. لا واجهة مكسر — فقط تبديل + شريط تمرير mix.
Drums
16 pad × 3 kits (Acoustic / Electronic / Latin). كل ضربة هي OscillatorNode + GainNode + BiquadFilterNode مغلفة تركيبيًا — صفر ملفات عينة. صوت أيقوني على نمط TR-808 بدون تضخيم الحزمة.
Sequencer: شبكة قائمة على الخطوات، أحادية الصوت لكل خطوة. حد 4 معاييره. اضغط "احفظ النمط" للحفظ في Firestore (users/{uid}/roqueos/music.drums.sequencerPattern).
Presets: ~25 grooves منسقة (rock basic، funk shuffle، bossa nova، jazz swing، latin clave). تطبيق preset يستبدل النمط الحالي — حوار تأكيد إذا كانت النوتة مسجلة بالفعل.
quirks مهمة لـ iOS
يوجد حل بديل موثق لتطبيقات Web Audio على iPhone:
- خطأ مفتاح الصمت: زر الصمت الفيزيائي لـ iPhone يكتم Web Audio حتى مع الصوت العالي. Apple Music/Spotify يحلون ذلك لأنهم تطبيقات أصلية.
- حل بديل جزئي: ينشئ التطبيق
HTMLAudioElementغير مرئي معplaysInline+MediaSession metadata، يطلق عند أول إيماءة مستخدم. هذا "يدعي" جلسة الصوت جزئيًا كـmedia playback. - النتيجة: تعمل معظم الحالات. بعض iPhones محددة (طرز قديمة، iOS قديم) لا تزال تكتم.
تظهر لافتة كهرمانية تلقائيًا عند اكتشاف iOS، مع زر "فهمت" يحافظ على dismiss في localStorage. ليس blocker — فقط يشرح السلوك.
الحل النهائي (عند الشحن عبر App Store عبر Capacitor): مكون إضافي Swift أصلي يكوّن AVAudioSessionCategoryPlayback قبل تركيب WebView. موثق في 87-music-system.md القسم "iOS silent switch — القيد الحالي + Capacitor المستقبلي".
الاستمرارية
مسار Firestore: users/{uid}/roqueos/music
مستمر:
{
"tuner": { "referenceA": 440, "viewMode": "needle" },
"metronome": { "lastBPM": 120, "lastTimeSignature": "4/4", "practiceTimerMinutes": 15 },
"frequency": { "lastHz": 440, "lastWave": "sine", "binauralEnabled": false, "delayEnabled": false },
"drums": { "lastKit": "acoustic", "masterVolume": 0.8, "sequencerPattern": {...} },
"scales": { "lastRoot": "C", "lastType": "major" },
"chords": { "capoFret": 0 }
}Debounced save 800ms. لا يجمد UI.
الهوية البصرية
كل علامة تبويب لها --tab-accent (hex) محقون inline كـ CSS variable. Ambient mesh ::before في الجذر + glow في المكونات عبر rgba(var(--tab-accent-rgb), alpha).
النتيجة: علامة التبويب النشطة "تصبغ" اللوحة بأكملها بنعومة دون تغيير الشاشة.
مقايضات مقبولة
- التركيب > العينات: المجموعة المركبة لها هوية خاصة (TR-808). ليس Battery 4. جيد للدراسة وعمل beats casual.
- Sequencer أحادي الصوت لكل خطوة: كل خطوة تشغيل أو إيقاف. بدون velocity/swing. ليس DAW.
- BPM detector من نوع onset: جيد لـ steady tempo (تصفيق، kick). سيء لـ musical complex مع syncopation ثقيل.
- Capo يعيد تسمية الكوردات فقط: لا يشغل التقدم الكامل المنقول. يغطي حالة "تابلت في E، أريد رؤية في D مع capo 2".
المراجع
- تطبيق مسجل في
src/config/apps.js(id: 'music') - المكون:
src/components/roqueos/apps/ROSMusic.vue - Composables:
src/composables/useAudioContext.js(singleton)،src/composables/useAudioScheduler.js(precision scheduler) - خوارزمية YIN:
src/utils/music/pitchAlgorithms.js - تركيب الطبول:
src/utils/music/drumSynth.js - القاعدة الكاملة في
.claude/rules/87-music-system.md - تطبيق موازي: Tablatura (محرر متعدد المسارات) — يستخدم نفس بدائيات الصوت