⚠ 계약 상태: 공정은 현재, 코드는 오래됨
이 스택의 출력 프레임워크는 Remotion + React (
/hyperframes-core)입니다. 여기 있는 모션 공정은 여전히 유효합니다: 타이밍, 이징 선택, 움직임의 형태, 명명된 규칙 및 청사진. 코드는 유효하지 않습니다: 예제와 어댑터는 더 이상 사용되지 않는 HTML + 일시 중지된 GSAP 타임라인 런타임을 대상으로 작성되었습니다.읽으면서 번역하세요:
여기 Remotion에서 gsap.fromTo(el, {x:-40}, {x:0, duration:0.5})interpolate(frame, [0, SEC(0.5)], [-40, 0], {…"clamp"})ease: "back.out(1.7)"spring({frame, fps, config:{damping}}), 눈으로 조정window.__timelines[id]의 일시 중지된 타임라인없음; 모든 값은 useCurrentFrame()의 함수클립의 data-start/data-duration<Sequence from>/durationInFrames, 프레임 단위CSS 키프레임 또는 트랜지션 프레임에서 파생된 인라인 style(CSS 애니메이션은 렌더링되지 않음)이 스킬의 예제를 수정 없이 Remotion 프로젝트에 붙여넣지 마십시오.
HyperFrames 오디오
믹스는 프로세서의 스택이 아니라 관계의 집합입니다. 각각 혼자서는 완벽하게 들리는 두 트랙이 함께 있을 때는 듣기 어려울 수 있으며, 해결책이 거의 "하나를 줄이는 것"이 아닙니다. 그것은 그들이 무엇을 놓고 싸우고 있는지 찾아서 필요한 쪽에 주는 것입니다. 여기 있는 모든 도구는 그러한 관계 중 하나를 표현하기 위해 존재합니다.
이펙트는 엘리먼트의 data-fx-chain에 있으며, 미리보기와 렌더링은 동일한 Web Audio 그래프를 실행합니다. 라이브 컨텍스트에서는 스튜디오, 오프라인 컨텍스트에서는 이미 구동 중인 브라우저 내부의 엔진입니다. 각 이펙트의 구현은 하나이므로, 스크러빙 중 듣는 것이 기록되는 것입니다. 두 번 튜닝할 필요가 없습니다.
클립 타이밍은 /hyperframes-core에 속합니다: 오디오/비디오 트림 및 소스 범위는 data-start, data-duration, data-media-start를 사용하며, 크로스페이드는 다른 트랙의 클립을 겹칩니다. 이 스킬은 배치된 트랙의 페이드인/페이드아웃, 크로스페이드 엔벨로프, 트랙 게인/트랙 볼륨, 볼륨 및 이펙트 오토메이션, 덕킹/보이스오버 캐브, 그리고 이펙트 체인을 담당합니다. /media-use는 소싱, 생성 및 전처리를 담당합니다.
상수 data-playback-rate (0.1..5)는 오디오/비디오 엘리먼트가 동일한 타이밍, 소스 오프셋 및 속도를 사용할 때 픽처 및 피치 보존 사운드에 대해 렌더링에 안전합니다. 속도 램프는 지원되지 않습니다(속도 엔벨로프가 없음). 파생된 동기화된 에셋을 전처리하십시오. HyperFrames는 자동 파형 동기화 또는 드리프트 보정을 제공하지 않습니다.
복사 가능한 컷/크로스페이드/재타이밍 레시피는 /hyperframes-core → references/editing-recipes.md를 사용하십시오.
세 가지 속성이 모든 것을 전달하며, 모두 오디오/비디오 엘리먼트 자체에 있습니다:
| 속성 | 보유 |
|---|---|
data-fx-chain | 이펙트, 신호 순서대로 |
data-automation | 이 트랙의 볼륨 또는 이펙트 파라미터에 대한 엔벨로프 |
data-fx-carve | 캐브 자체의 설정, 재파생 가능하도록 |
제공되는 이펙트 패밀리는 게인, EQ(하이패스, 로우패스, 피킹, 쉘프), 컴프레서, 리미터, 게이트, 새츄레이트, 딜레이, 리버브, 코러스, 페이저, 비트크러시입니다.
각각의 정확한 JSON 및 레인이 충족해야 하는 규칙: references/attributes.md.
파라미터, 범위 및 단위와 함께 모든 이펙트: references/fx-registry.md.
들을 수 없는 파일의 문제를 해결하는 방법: references/diagnosis.md.
프리셋, 명명된 작업 및 원노브 프로파일, 증상-수정 표: references/presets.md — 체인을 수동으로 구축하기 전에 읽으십시오. 프리셋이나 명명된 작업 중 하나가 일반적으로 문제를 이미 지목하기 때문입니다.
어떻게 함께 작동하는가
두 개의 저작 표면이 이러한 속성을 작성합니다. 두 개의 런타임이 동일한 빌더를 통해 이를 읽습니다. 이러한 공유 중간 계층이 미리보기가 렌더링을 예측하는 이유입니다.
flowchart TB
voice["음성 트랙<br/>미디어 파일"]
bed["배경음악 트랙<br/>미디어 파일"]
subgraph AUTHOR["저작 — 속성을 작성하는 유일한 것"]
panel["스튜디오<br/>보이스오버 캐브 컨트롤"]
script["scripts/carve.mjs<br/>쌍을 감지, 기본적으로 동적"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["배경음악 엘리먼트에 기록됨"]
carveAttr["data-fx-carve<br/>source · strength · dynamic"]
chainAttr["data-fx-chain<br/>peaking xN + gain, tagged fromCarve"]
autoAttr["data-automation<br/>조각된 파라미터당 하나의 레인"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["하나의 구현, 둘 다 읽음"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["미리보기<br/>라이브 AudioContext<br/>attachElementFxChain"]
sched --> preview
build --> render["렌더링<br/>헤드리스 브라우저의 OfflineAudioContext<br/>applyAudioFxChain"]
sched --> render
preview --> heard["스크러빙 중 듣는 것"]
render --> wav["처리된 WAV<br/>+ 믹스가 테일을 통과시키도록 chainTailSeconds"]
wav --> mix["엔진 · audioMixer<br/>여기서 PCM에 볼륨 레인이 베이킹됨, 그래프 아님"]
mix --> out["렌더링된 믹스"]
edit["재생 중 속성 편집"] -.->|MutationObserver| preview
캐브 자체의 설정은 재생 시 절대 읽히지 않습니다. 그것이 생성한 체인과 레인이 재생됩니다. data-fx-carve는 기존 캐브에서 강도를 추측하여 되찾는 대신 변경할 수 있도록 존재합니다.
조각된 배경음악 내부에서 신호는 먼저 딥을 통과한 다음 레벨 매치를 거친 후 사용자가 직접 구축한 모든 것을 통과합니다. 이것이 추가하는 리미터가 여전히 마지막 천장 역할을 하는 이유입니다:
flowchart LR
src["디코딩된 배경음악"] --> p1["peaking<br/>400 Hz"]
p1 --> p2["peaking<br/>1 kHz"]
p2 --> p3["peaking<br/>1.6 kHz"]
p3 --> g["gain<br/>레벨 매치"]
g --> hand["사용자 자신의 이펙트<br/>예: 리미터"]
hand --> dest["트랙 게인, 그런 다음 출력"]
l1["lane fx.n1.gain"] -.->|"해당 대역에서<br/>음성 레벨의 엔벨로프"| p1
l4["lane fx.n4.gain"] -.->|"배경음악이<br/>전체적으로 덕킹되는 정도"| g
정적 캐브는 고정된 값과 레인이 전혀 없는 동일한 그래프입니다.
먼저, 무엇이 잘못되었는지 파악하십시오
아래 표는 "웅웅거리는 소리가 난다"에서 시작합니다. 이는 누군가가 이미 듣고 그렇게 말했다는 것을 전제로 합니다. "이걸 고쳐라"는 파일을 받았지만 그러한 문장도 없고 들을 수도 없다면 측정해야 합니다. 하나의 규칙이 모든 것을 지배합니다:
알 수 없는 단일 음성의 절대 스펙트럼은 진단할 수 없습니다. 포먼트는 ±10 dB이고, 기본 주파수는 85–255 Hz이며, 문장은 끝날 때 5–6 dB 감소합니다. 이 모든 것은 각각 결함으로 읽히며, 모두 화자에게서 비롯됩니다.
따라서 비교하십시오. 동일한 파일 내의 무언가와 비교하십시오: 깨끗한 원본이 있다면 그것과, 그렇지 않으면 일시 정지 구간과 — 갭에서 들리는 것은 모두 추가적인 것이며, 갭의 스펙트럼은 음성이 아닌 채널입니다. 게시된 평균 스펙트럼이나 합성된 제어 음성과 비교하는 것은 작동하지 않습니다. 두 화자는 대부분의 결함보다 더 다르며, 이 지침 뒤에 있는 평가에서 잘못된 두 답변 모두 정확히 그 이유에서 비롯되었습니다.
원본도 사용 가능한 침묵도 없을 때, 정적 음색 결함은 사실상 결정 불가능합니다. 그렇게 말하고 적합한 판독값을 제공하되, 하나를 선택하고 그 위에 체인을 구축하지 마십시오.
명령, 함정 및 작업 레시피: references/diagnosis.md. 아무도 설명하지 않은 파일을 진단하기 전에 읽으십시오.
증상부터 시작하십시오
대역과 종류를 파악한 후 오디오의 문제가 무엇인지 이름을 지정하십시오. 대부분의 나쁜 오디오는 이 중 하나 또는 두 가지이며, 각각에 대해 제공된 답변이 있습니다:
| 소리가 이런 경우 | 사용할 것 |
|---|---|
| 아래에 웅웅거림 또는 둔탁한 소리 | rumble-cut, 또는 80 Hz에서 highpass |
| 웅웅거림, 가슴을 울리는 듯 | Tame Boominess 작업 (200 Hz) |
| 먹먹함, 판지 뒤에 있는 듯 | Reduce Mud 작업 (250 Hz) |
| 단어를 알아듣기 어려움 | Add Clarity 작업 (3 kHz), 또는 배경음악 캐브 |
| 거칠고 피곤하게 함 | Soften Harshness 작업 (3.2 kHz) |
| 어떤 단어가 다른 단어보다 훨씬 큼 | 컴프레서의 Evenness, 또는 Even Out Levels |
| 문장 사이의 룸 톤 | room-gate |
| 음성과 음악이 충돌함 | Voiceover 캐브 — 둘 중 하나에 EQ가 아님 |
| 건조함, 어디에도 녹음되지 않은 듯 | room-tight 또는 room-natural |
| 그냥 "아마추어" 같음 | voice-clean (위의 네 가지를 순서대로 적용한 것) |
전체 카탈로그, 각 프리셋의 내용, 대역 용어 및 의도적으로 포함되지 않은 것(디에싱, 노이즈 제거, 톤 매치): references/presets.md.
추가하기 전에 빼고, 필터 후 레벨, 레벨 후 관계, 특성 및 천장은 마지막에. 각 단계는 다음 단계가 듣는 것을 변경합니다. 하이패스 전에 설정된 컴프레서는 럼블을 쫓는 데 시간을 보냅니다.
이름이 아닌 문제에 따라 패밀리를 사용하십시오
필터 (highpass, lowpass, peaking, lowshelf, highshelf)는 트랙이 점유할 수 있는 주파수를 결정합니다. 이는 두 소스가 충돌할 때 첫 번째 도구입니다. 충돌은 대역에서 발생하기 때문입니다. 배경음악과 음성 모두 1–3 kHz를 원하며, 배경음악에서 그것을 빼는 것은 전체를 낮추는 것보다 믹스에 훨씬 적은 비용이 듭니다. 음성의 하이패스는 럼블에 대한 표준 수정입니다. 로우패스는 의도적으로 어둡게 하거나 먹먹하게 만듭니다.
다이나믹스 (gain, compressor, limiter, gate)는 트랙의 레벨이 시간에 따라 어떻게 행동할지 결정합니다. 컴프레션은 크고 작은 소리 사이의 거리를 좁혀 작은 부분이 올라올 수 있게 합니다. 리미터는 천장입니다. 어떤 것도 형성하지 않으며, 아무것도 지나치지 않도록 보장합니다. 게이트는 임계값 아래의 것을 제거하며, 이것이 구문 사이의 룸 톤을 침묵시키는 방법입니다. gain은 평범한 레벨 단계이며, 트랙이 비켜서야 할 때 오토메이션 레인이 타는 것입니다.
비선형 (saturate, bitcrush)은 파형의 모양을 변경하여 원래 없었던 고조파를 추가합니다. 보정보다는 트랙에 특성이나 거친 느낌이 필요할 때 사용하십시오. 생성적이라는 점을 기억하십시오: 얇은 소스를 더 조밀하게 만들지만 더 깨끗하게 만들지는 않습니다.
시간 기반 (delay, reverb, chorus, phaser)은 트랙을 공간에 배치하거나 너비를 부여합니다. 이들은 믹스를 가장 쉽게 망칠 수 있는 것들입니다. 테일이나 디튠된 복사본은 음성이 필요한 동일한 공간을 차지하기 때문입니다. 다른 것 뒤에 있어야 하는 것에 사용하고, 웻 양을 단독으로 들을 때 괜찮게 들리는 것보다 낮게 유지하십시오.
체인은 직렬입니다: 각 이펙트는 이전 이펙트가 생성한 것을 처리합니다. 따라서 교정 필터링은 초기에, 특성은 중간에, 리미터는 실제로 천장 역할을 할 수 있도록 마지막에 배치됩니다.
보이스오버 캐브
해결하는 문제. 음성 아래의 배경음악은 음성을 따라가기 어렵게 만듭니다. 본능은 전체 배경음악을 덕킹하는 것이며, 이는 작동하지만 배경음악의 모든 존재감을 희생합니다. 음악은 전체 보이스오버 동안 축 늘어집니다. 그러나 음성은 전체 스펙트럼이 필요하지 않습니다. 실제로 점유하는 몇 개의 대역만 필요합니다. 캐브는 그것들만 가져가고 배경음악은 저음과 고음을 유지하므로, 음성이 여전히 알아들을 수 있는 동안 음악은 여전히 음악입니다.
이펙트가 아니라 관계입니다. 설정은 _배경음악_에 있습니다. 처리되는 트랙이며, 사이드체인 컴프레서가 정확히 하는 것처럼 듣고 있는 음성의 이름을 지정합니다: 작아지는 트랙을 선택하고 무엇이 작아지게 하는지 선택합니다. 절대 음성 트랙에 캐브를 넣지 마십시오. 스스로에 대해 캐브되는 음성은 미묘한 믹스 선택이 아니라 버그입니다.
하나가 아닌 모든 음성. sources는 목록입니다. 배경음악은 일반적으로 전체 시퀀스 아래에서 실행되기 때문입니다. 내레이터, 인터뷰 답변, 두 번째 발표자. 이들은 측정되기 전에 배경음악 자체의 클록에 합산됩니다(mixCarveSources). 따라서 하나의 분석이 모든 것을 포함합니다: 대역은 거기에 있는 모든 음성에서 나오며, 엔벨로프는 그 중 어떤 것이든 발생하는 곳에서 올라갑니다. 배경음악이 재생되는 동안 재생되지 않는 음성은 제외됩니다. 배경음악을 마스킹할 수 없기 때문입니다.
하나의 손잡이. strength는 0..1이며 모든 것을 파생시킵니다: 얼마나 깊이 자를지, 몇 개의 대역, 얼마나 넓게, 명료도를 음성 원래 에너지보다 얼마나 선호할지, 레벨이 얼마나 떨어질 수 있는지, 음성 아래를 얼마나 목표로 할지. 이 여섯 가지는 실제 믹스에서 함께 움직입니다. 부드러운 캐브는 덕킹이 거의 없는 적은 수의 대역에서 얕은 컷이며, 강한 캐브는 더 많은 대역에서 더 깊습니다. 따라서 그것들은 carveProfile에 한 번 작성된 하나의 관계입니다. 기본값은 0.25입니다. 세 개의 대역에서 6 dB 딥, 6 dB의 레벨 여유를 가지며, 구멍처럼 들리지 않으면서 들을 수 있습니다. 0.5에서 딥은 10 dB에 도달하며, 이는 캐브가 음성을 위한 공간이 아닌 이펙트로 들리기 시작하는 지점입니다. 그 이상은 조용한 음성 아래 큰 배경음악을 위한 의도적인 영역입니다. 0은 스펙트럴 전용입니다. 하나의 대역, 레벨 매치가 전혀 없습니다.
기본적으로 캐브. 내레이션 아래에서 재생되는 배경음악은 캐브를 원합니다. 시간이 있다면 마무리 단계가 아닙니다. 두 트랙을 배치하고 아래 명령을 실행한 다음 들어보십시오. 음악이 아래에 있을 내레이션이 없는 경우(뮤직 비디오, 타이틀 카드, 트랙에 맞춘 몽타주 컷)에만 건너뛰십시오.
항상 음성을 따릅니다. 정적 모드는 없습니다. 고정된 깊이는 모든 일시 정지를 통해 배경음악을 얇게 만듭니다. 둘 다 들어본 후에는 선택의 여지가 없습니다.
[원문이 잘려서 여기서부터는 번역되지 않았습니다. 전체 문서의 나머지 부분은 이 패턴을 따라야 합니다.]