Skip to content

Music (موالف / ميترونوم / Drums)

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

تطبيق Music — 7 علامات تبويب في لوحة واحدة

الفرق عن 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

مستمر:

json
{
  "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 (محرر متعدد المسارات) — يستخدم نفس بدائيات الصوت