Skip to content

Conversation

@TheSakyo
Copy link

@TheSakyo TheSakyo commented Oct 26, 2025

✨ Add Pitch Shifter plugin

🧩 Overview

This pull request introduces a brand new Pitch Shifter plugin for Pear Music.
It allows users to adjust the pitch (key) of songs in real time, using Tone.js for audio processing.


πŸŽ› Features

  • 🎚️ Real-time pitch shifting from -12 to +12 semitones
  • βš™οΈ Built with Tone.js for precise, smooth pitch control
  • 🧱 UI implemented with Solid.js, integrated naturally above the β€œNext up / Lyrics / Similar” tabs
  • πŸ” Supports instant enable/disable from the plugin manager
  • 🧹 Cleans up automatically on disable (no duplicated sliders)
  • 🌐 Includes basic i18n support (currently English πŸ‡¬πŸ‡§ and French πŸ‡«πŸ‡·)

🧠 Implementation Details

  • Uses captureStream() from YouTube Music’s <video> element to process live audio.
  • Utilizes the Tone.PitchShift node to change pitch without altering tempo.
  • Injects a minimal and adaptive UI directly inside the YouTube Music DOM.
  • Built with Solid.js for declarative reactivity and cleaner lifecycle handling.
// Example of Solid component rendering inside renderer.tsx
render(() => <PitchUI />, mount);
// Configuration
{
  enabled: false,
  semitones: 0
}

🌍 Localization

The plugin includes translations for:

  • en.json πŸ‡¬πŸ‡§ (English)
  • fr.json πŸ‡«πŸ‡· (French)

Other languages can easily be added later to match Pear’s i18n system.


πŸ§ͺ Testing

βœ… Successfully tested on:

  • Windows 10 & 11
  • YouTube Music (latest version)
  • Electron development environment

Pitch shifting updates instantly in real time, with no noticeable latency or distortion.


πŸ™Œ Notes

  • Plugin structure follows the same pattern as existing ones:
    src/plugins/pitch-shifter/
    β”œβ”€β”€ index.ts
    β”œβ”€β”€ renderer.tsx
    └── style.css
    
  • All style rules are scoped via .pitch-* classes for isolation.
  • Maintainers can adapt i18n keys for full Pear integration.

πŸ§‘β€πŸ’» Author

Developed and tested by TheSakyo

(Tone.js + Solid.js integration and functional testing)

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

eslint

🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

// 🎨 ─────────────── Plugin Stylesheet ───────────────


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

/** Inline CSS loaded into the YT Music renderer for consistent styling. */


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

/** Inline CSS loaded into the YT Music renderer for consistent styling. */


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

stylesheets: [style],


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

stylesheets: [style],


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

// 🎧 ─────────────── Renderer Logic ───────────────


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

// 🎧 ─────────────── Renderer Logic ───────────────


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

* The renderer is triggered once the YouTube Music player API is available.


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

* The renderer is triggered once the YouTube Music player API is available.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

* It handles all DOM interactions, UI injection, and audio processing.


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

* It handles all DOM interactions, UI injection, and audio processing.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ήβ†Ή with Β·Β·Β·Β·


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·


🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "solid-js" with 'solid-js'

import { createSignal, onCleanup, createEffect } from "solid-js";


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

import { createSignal, onCleanup, createEffect } from "solid-js";


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "solid-js/web" with 'solid-js/web'

import { render } from "solid-js/web";


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

import { render } from "solid-js/web";


🚫 [eslint] <importPlugin/order> reported by reviewdog 🐢
There should be at least one empty line between import groups

import * as Tone from "tone";


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "tone" with 'tone'

import * as Tone from "tone";


🚫 [eslint] <importPlugin/no-unresolved> reported by reviewdog 🐢
Unable to resolve path to module 'tone'.

import * as Tone from "tone";


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

import * as Tone from "tone";


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "@/types/contexts" with '@/types/contexts'

import type { RendererContext } from "@/types/contexts";


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

import type { RendererContext } from "@/types/contexts";


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "./index" with './index'

import type { PitchShifterPluginConfig } from "./index";


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

import type { PitchShifterPluginConfig } from "./index";


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Insert ,

{ getConfig, setConfig }: RendererContext<PitchShifterPluginConfig>


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]Β·RendererΒ·(Solid)Β·initializedΒ·βœ…" with '[pitch-shifter]Β·RendererΒ·(Solid)Β·initializedΒ·βœ…'

console.log("[pitch-shifter] Renderer (Solid) initialized βœ…");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] Renderer (Solid) initialized βœ…");


🚫 [eslint] <@typescript-eslint/no-redundant-type-constituents> reported by reviewdog 🐢
'PitchShift' is an 'error' type that acts as 'any' and overrides all other types in this union type.

let pitchShift: Tone.PitchShift | null = null;


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "video" with 'video'

document.querySelector("video") ||


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

document.querySelector("video") ||


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "audio" with 'audio'

document.querySelector("audio") ||


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

document.querySelector("audio") ||


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "ytmusic-playerΒ·video" with 'ytmusic-playerΒ·video'

document.querySelector("ytmusic-player video");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

document.querySelector("ytmusic-player video");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]·Media·found·🎧" with '[pitch-shifter]·Media·found·🎧'

console.log("[pitch-shifter] Media found 🎧", media);


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] Media found 🎧", media);


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .start on an error typed value.


🚫 [eslint] <@typescript-eslint/no-unsafe-assignment> reported by reviewdog 🐢
Unsafe assignment of an error typed value.

const toneCtx = Tone.getContext();


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.

const toneCtx = Tone.getContext();


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .getContext on an error typed value.

const toneCtx = Tone.getContext();


🚫 [eslint] <@typescript-eslint/no-unsafe-assignment> reported by reviewdog 🐢
Unsafe assignment of an any value.

const stream =
(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) any typed value.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-explicit-any> reported by reviewdog 🐢
Unexpected any. Specify a different type.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .captureStream on an any value.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) any typed value.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-explicit-any> reported by reviewdog 🐢
Unexpected any. Specify a different type.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .mozCaptureStream on an any value.

(media as any).captureStream?.() || (media as any).mozCaptureStream?.();


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]·❌·captureStream()·unavailable" with '[pitch-shifter]·❌·captureStream()·unavailable'

console.error("[pitch-shifter] ❌ captureStream() unavailable");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.error("[pitch-shifter] ❌ captureStream() unavailable");


🚫 [eslint] <@typescript-eslint/no-unsafe-assignment> reported by reviewdog 🐢
Unsafe assignment of an error typed value.

pitchShift = new Tone.PitchShift({
pitch: semitones(),
windowSize: 0.1,
}).toDestination();


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.

pitchShift = new Tone.PitchShift({
pitch: semitones(),
windowSize: 0.1,
}).toDestination();


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe construction of a(n) error type typed value.

pitchShift = new Tone.PitchShift({
pitch: semitones(),
windowSize: 0.1,
}).toDestination();


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .PitchShift on an error typed value.

pitchShift = new Tone.PitchShift({


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .toDestination on an error typed value.


🚫 [eslint] <@typescript-eslint/no-unsafe-assignment> reported by reviewdog 🐢
Unsafe assignment of an error typed value.

nativeSource = toneCtx.createMediaStreamSource(stream);


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.

nativeSource = toneCtx.createMediaStreamSource(stream);


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .createMediaStreamSource on an error typed value.

nativeSource = toneCtx.createMediaStreamSource(stream);


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.

Tone.connect(nativeSource, pitchShift);


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .connect on an error typed value.

Tone.connect(nativeSource, pitchShift);


🚫 [eslint] <@typescript-eslint/no-unnecessary-type-assertion> reported by reviewdog 🐢
This assertion is unnecessary since it does not change the type of the expression.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]·Pitch·processor·active·🎢" with '[pitch-shifter]·Pitch·processor·active·🎢'

console.log("[pitch-shifter] Pitch processor active 🎢");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] Pitch processor active 🎢");


🚫 [eslint] <@typescript-eslint/no-unsafe-call> reported by reviewdog 🐢
Unsafe call of a(n) error type typed value.


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .dispose on an error typed value.


🚫 [eslint] <@typescript-eslint/no-unnecessary-type-assertion> reported by reviewdog 🐢
This assertion is unnecessary since it does not change the type of the expression.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]Β·PitchΒ·processorΒ·stoppedΒ·πŸ“΄" with '[pitch-shifter]Β·PitchΒ·processorΒ·stoppedΒ·πŸ“΄'

console.log("[pitch-shifter] Pitch processor stopped πŸ“΄");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] Pitch processor stopped πŸ“΄");


⚠️ [eslint] <stylistic/no-mixed-operators> reported by reviewdog 🐢
Unexpected mix of '+' and '*'. Use parentheses to clarify the intended order of operations.

color = cold.map((c, i) => Math.round(c + (neutral[i] - c) * t));


⚠️ [eslint] <stylistic/no-mixed-operators> reported by reviewdog 🐢
Unexpected mix of '+' and '*'. Use parentheses to clarify the intended order of operations.

color = cold.map((c, i) => Math.round(c + (neutral[i] - c) * t));


⚠️ [eslint] <stylistic/no-mixed-operators> reported by reviewdog 🐢
Unexpected mix of '+' and '*'. Use parentheses to clarify the intended order of operations.

color = neutral.map((c, i) => Math.round(c + (warm[i] - c) * t));


⚠️ [eslint] <stylistic/no-mixed-operators> reported by reviewdog 🐢
Unexpected mix of '+' and '*'. Use parentheses to clarify the intended order of operations.

color = neutral.map((c, i) => Math.round(c + (warm[i] - c) * t));


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "," with ','

return `linear-gradient(90deg, rgb(${color.join(",")}) 0%, #fff 100%)`;


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

return `linear-gradient(90deg, rgb(${color.join(",")}) 0%, #fff 100%)`;


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .pitch on an error typed value.

if (pitchShift) pitchShift.pitch = v;


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace ".pitch-label" with '.pitch-label'

const labelEl = document.querySelector(".pitch-label");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

const labelEl = document.querySelector(".pitch-label");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "active" with 'active'

labelEl.classList.add("active");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

labelEl.classList.add("active");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "active" with 'active'

setTimeout(() => labelEl.classList.remove("active"), 200);


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

setTimeout(() => labelEl.classList.remove("active"), 200);


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically

ref={(el) => updateSliderColor(el, semitones())}


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "+"Β·:Β·"" with '+'Β·:Β·''

{semitones() >= 0 ? "+" : ""}


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

{semitones() >= 0 ? "+" : ""}


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

{semitones() >= 0 ? "+" : ""}


🚫 [eslint] <stylistic/jsx-sort-props> reported by reviewdog 🐢
Props should be sorted alphabetically


🚫 [eslint] <@typescript-eslint/no-unsafe-member-access> reported by reviewdog 🐢
Unsafe member access .pitch on an error typed value.

if (pitchShift) pitchShift.pitch = 0;


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace ".pitch-slider" with '.pitch-slider',


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace ".pitch-label" with '.pitch-label'

const labelEl = document.querySelector(".pitch-label");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

const labelEl = document.querySelector(".pitch-label");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "active" with 'active'

labelEl.classList.add("active");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

labelEl.classList.add("active");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "active" with 'active'

setTimeout(() => labelEl.classList.remove("active"), 200);


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

setTimeout(() => labelEl.classList.remove("active"), 200);


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "tp-yt-paper-tabs.tab-header-container" with ⏎······'tp-yt-paper-tabs.tab-header-container',⏎····

const tabs = document.querySelector("tp-yt-paper-tabs.tab-header-container");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

const tabs = document.querySelector("tp-yt-paper-tabs.tab-header-container");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace tabs·&&·tabs.parentElement·&&·!document.querySelector(".pitch-wrapper") with ⏎······tabs·&&⏎······tabs.parentElement·&&⏎······!document.querySelector('.pitch-wrapper')⏎····

if (tabs && tabs.parentElement && !document.querySelector(".pitch-wrapper")) {


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

if (tabs && tabs.parentElement && !document.querySelector(".pitch-wrapper")) {


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "div" with 'div'

mount = document.createElement("div");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

mount = document.createElement("div");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]Β·UIΒ·injectedΒ·viaΒ·SolidΒ·βœ…" with '[pitch-shifter]Β·UIΒ·injectedΒ·viaΒ·SolidΒ·βœ…'

console.log("[pitch-shifter] UI injected via Solid βœ…");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] UI injected via Solid βœ…");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace ".pitch-wrapper" with '.pitch-wrapper'

const existing = document.querySelector(".pitch-wrapper");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

const existing = document.querySelector(".pitch-wrapper");


🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace "[pitch-shifter]·UI·removed·❌" with '[pitch-shifter]·UI·removed·❌'

console.log("[pitch-shifter] UI removed ❌");


🚫 [eslint] <stylistic/quotes> reported by reviewdog 🐢
Strings must use singlequote.

console.log("[pitch-shifter] UI removed ❌");

Comment on lines +6 to +7

/**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Delete ⏎

Suggested change
/**
/**

* allowing users to raise or lower the key of a song dynamically.
*/
export type PitchShifterPluginConfig = {
/** Whether the plugin is enabled (active in the player). */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

Suggested change
/** Whether the plugin is enabled (active in the player). */
/** Whether the plugin is enabled (active in the player). */

* allowing users to raise or lower the key of a song dynamically.
*/
export type PitchShifterPluginConfig = {
/** Whether the plugin is enabled (active in the player). */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

*/
export type PitchShifterPluginConfig = {
/** Whether the plugin is enabled (active in the player). */
enabled: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

Suggested change
enabled: boolean;
enabled: boolean;

*/
export type PitchShifterPluginConfig = {
/** Whether the plugin is enabled (active in the player). */
enabled: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

// βš™οΈ ─────────────── Default Configuration ───────────────
config: {
enabled: false, // Plugin starts disabled by default
semitones: 0, // Neutral pitch (no shift)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ήβ†Ήsemitones:Β·0,Β·Β· with Β·Β·Β·Β·semitones:Β·0,

Suggested change
semitones: 0, // Neutral pitch (no shift)
semitones: 0, // Neutral pitch (no shift)

// βš™οΈ ─────────────── Default Configuration ───────────────
config: {
enabled: false, // Plugin starts disabled by default
semitones: 0, // Neutral pitch (no shift)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

config: {
enabled: false, // Plugin starts disabled by default
semitones: 0, // Neutral pitch (no shift)
} as PitchShifterPluginConfig,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

Suggested change
} as PitchShifterPluginConfig,
} as PitchShifterPluginConfig,

config: {
enabled: false, // Plugin starts disabled by default
semitones: 0, // Neutral pitch (no shift)
} as PitchShifterPluginConfig,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <stylistic/no-tabs> reported by reviewdog 🐢
Unexpected tab character.

semitones: 0, // Neutral pitch (no shift)
} as PitchShifterPluginConfig,

// 🎨 ─────────────── Plugin Stylesheet ───────────────
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [eslint] <prettier/prettier> reported by reviewdog 🐢
Replace β†Ή with Β·Β·

Suggested change
// 🎨 ─────────────── Plugin Stylesheet ───────────────
// 🎨 ─────────────── Plugin Stylesheet ───────────────

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant