@ihabdevteam/core 0.273.0 → 0.281.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +351 -0
- package/dist/components.cjs.js +185 -185
- package/dist/components.esm.css +2 -2
- package/dist/hooks.cjs.js +1 -1
- package/dist/i18n.cjs.js +1 -1
- package/dist/ihabdevteam-core.cjs.js +183 -183
- package/dist/ihabdevteam-core.d.ts +18 -2
- package/dist/packages/core/src/components/Button.css +10 -2
- package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +73 -18
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.css +26 -0
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +94 -37
- package/dist/packages/core/src/components/Training/TrainingStepCard.d.ts +17 -1
- package/dist/packages/core/src/components/Training/TrainingStepCard.js +10 -1
- package/dist/packages/core/src/components/Training/audioPlaybackRules.js +11 -26
- package/dist/packages/core/src/components/Training/audioTimeline.d.ts +81 -0
- package/dist/packages/core/src/components/Training/audioTimeline.js +71 -0
- package/dist/packages/core/src/utils/audioPeaks.d.ts +9 -2
- package/dist/packages/core/src/utils/audioPeaks.js +43 -8
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,357 @@ All notable changes to this project will be documented in this file.
|
|
|
7
7
|
> 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
|
|
8
8
|
> 제 이야기를 못 찾는다.
|
|
9
9
|
|
|
10
|
+
## 0.281.0
|
|
11
|
+
|
|
12
|
+
### 앞뜸에서 ⏸ 가 **안 멈추고 단어가 두 번 났다** — 같은 판단이 두 벌이었다 (말귀 실측)
|
|
13
|
+
|
|
14
|
+
사용자가 화면에서 짚었다: *"뜸 중에 멈춤을 눌러도 멈추지 않아."* 말귀 재현(0.280.0,
|
|
15
|
+
`같은 소리 고르기`, 앞뜸 300ms 에 ⏸):
|
|
16
|
+
|
|
17
|
+
1619ms 소음 play() ← 앞뜸 시작
|
|
18
|
+
1944ms ★ ⏸ 누름 → 소음 play() 가 또 불림(재생 갈래를 탔다)
|
|
19
|
+
2622ms 단어 play() ← 원래 사슬
|
|
20
|
+
2945ms 단어 play() ← 누른 것이 건 사슬 — **같은 단어가 또**
|
|
21
|
+
|
|
22
|
+
0.278.0 에서 고친 바로 그 결함이다. **한 벌만 고쳤다.** `handleToggle` 안에 같은
|
|
23
|
+
`if (a.paused) … else …` 가 **두 벌** 있었다 — 저장소 소리 갈래와 TTS 주소 갈래. "뜸 중이면
|
|
24
|
+
재생 중이다" 를 저장소 갈래에만 가르쳤고, 합성 단어는 TTS 주소 길이라 **안 고친 벌**을 탔다.
|
|
25
|
+
|
|
26
|
+
`요소토글` 한 자리로 모았다.
|
|
27
|
+
|
|
28
|
+
> **못이 고친 벌만 재고 있었다.** `audioPlayerTimelinePin` 의 33가지가 전부 저장소 소리로만
|
|
29
|
+
> 돌았다 — 그래서 "앞뜸에서 ⏸ → 소리가 안 난다" 가 초록인데 실물에서는 났다. 이 밤에
|
|
30
|
+
> *"같은 결정이 여러 자리에 적혀 한쪽만 안 따라간다"* 를 몇 번이나 적어 놓고 같은 자리에
|
|
31
|
+
> 걸렸다. **못을 두 길 다로 돌린다**(`describe.each(['저장소 소리', 'TTS 주소'])`) — 66가지.
|
|
32
|
+
> 못이 한 길만 재면 다른 길은 못이 없는 것과 같다.
|
|
33
|
+
|
|
34
|
+
### TTS 길에서 듣기 단추를 연타하면 **소리가 누른 만큼 났다**
|
|
35
|
+
|
|
36
|
+
못을 TTS 길로 돌리자 **바로 하나가 더 나왔다**: 연타 3번 → `play()` 3번. 저장소 갈래는
|
|
37
|
+
`fetchAndPrepare` 가 `fetchingRef` 로 되들어옴을 막는데 TTS 갈래에는 그 문이 없었다 —
|
|
38
|
+
`stateLocal` 이 아직 'active' 인 같은 틀 안에서 리졸버와 재생 사슬이 누른 만큼 섰다.
|
|
39
|
+
터치 화면의 겹누름에서 날 수 있는 자리다. 같은 문을 달았다.
|
|
40
|
+
|
|
41
|
+
두 결함 모두 뿌리가 같다 — **두 길이 같은 일을 따로 한 벌씩 들고 있다.** (85) 가 걷어 낼
|
|
42
|
+
자리이고, 그때까지는 못이 두 길을 함께 본다.
|
|
43
|
+
|
|
44
|
+
## 0.280.0
|
|
45
|
+
|
|
46
|
+
셋 다 **사용자가 화면에서 보고 정한 것**이다(말귀가 전했고 조건·실측을 함께 보냈다).
|
|
47
|
+
|
|
48
|
+
### 가려진 단추의 **테두리 선을 걷는다** — `disabled-covered` (말귀 요청 (88))
|
|
49
|
+
|
|
50
|
+
*"꽤 오래전부터 보더가 추가됐는데 보더 안 나오도록 해 줘."* 같은 날 한 번 더 *"보더 제거."*
|
|
51
|
+
|
|
52
|
+
선이 생긴 때는 `67c946d4`(2026-08-02)다. 그전에는 `--color-color-darkWhite` **오타** 때문에
|
|
53
|
+
`border` 선언이 통째로 무효라 안 그려지고 있었고, 오타를 고치며 `border-color:
|
|
54
|
+
var(--color-whiteLine)` 이 함께 살아났다. **고친 것은 맞는 일이었지만 보던 모습을 바꿨다.**
|
|
55
|
+
선은 **투명으로 남긴다** — 없애면 단추가 1px 씩 줄어 옆 단추와 어긋난다(198.664 × 56 그대로).
|
|
56
|
+
|
|
57
|
+
### 소음이 없으면 **뜸 자리도 비운다** (말귀 요청 (87))
|
|
58
|
+
|
|
59
|
+
*"소음 비율이 0 이거나 소음 종류가 없음일 때 노이즈 파형은 없어야 해. 흰 줄 나오는 것 안
|
|
60
|
+
나오게 해."* 그 흰 줄은 소음 층이 아니라 **단어 층의 뜸 자리 바닥값**이었다 — 0.266.0 에서
|
|
61
|
+
깔고 0.275.0 에서 뜸 자리로 좁힌 그 4px. **걷는다.**
|
|
62
|
+
|
|
63
|
+
깐 까닭은 "양끝이 잘려 보인다" 였는데 그것은 **내가 놀이터에서 본 것**이다. 쓰는 사람이
|
|
64
|
+
화면에서 보고 빈 쪽을 골랐다. 소음이 없으면 뜸 자리에서는 정말로 아무 소리도 안 난다 —
|
|
65
|
+
비어 있는 것이 맞다. 작은 막대를 숨기는 옛 규칙 하나만 남는다(소음이 있든 없든 같다).
|
|
66
|
+
|
|
67
|
+
> 이 4px 는 세 판에 걸쳐 **깔고(0.266.0) → 좁히고(0.275.0) → 걷었다(0.280.0).** 처음부터
|
|
68
|
+
> 물었으면 한 번이었다. 그림이 어떻게 보여야 하는지는 **내 눈으로 정할 것이 아니었다.**
|
|
69
|
+
|
|
70
|
+
### 소음 1배가 **어느 음원에서도** 문제 소리와 같은 높이다 (말귀 요청 (89))
|
|
71
|
+
|
|
72
|
+
사용자 규칙(2026-09-13): **소음 1배 = 문제 소리와 같은 높이**, 2배까지는 더 크게.
|
|
73
|
+
*"그 기능이 사라졌네?"* — 사라진 것이 아니라 **음원에 따라 서고 안 섰다.** 말귀 실측:
|
|
74
|
+
|
|
75
|
+
짧은 이야기(녹음 문장) 문제 소리 45px 소음 1배 40~42px 2배 68~70px ← 선다
|
|
76
|
+
단어 훈련(합성 단어) 문제 소리 44px 소음 1배 20~23px 2배 41~46px ← 절반
|
|
77
|
+
|
|
78
|
+
0.124.0 의 셈은 `소음 봉우리 ÷ 문제 소리 최고치 × 비율` 이라 **두 파일의 봉우리가 같을 때만**
|
|
79
|
+
규칙이 선다. 합성 단어의 봉우리가 녹음 문장의 두 배쯤이라 같은 셈으로 소음이 절반이 됐다.
|
|
80
|
+
|
|
81
|
+
이제 소음을 **제 최고치로** 잰다 — 가장 큰 소음 막대 = `M × R`. 1배에서 문제 소리의 가장
|
|
82
|
+
큰 막대와 같고 2배에서 눈금 끝(74px)에 닿는다. 칸도 그만큼 자란다. 파일 게인으로 되돌릴
|
|
83
|
+
것도 없어졌다(제 최고치로 나누면 약분된다).
|
|
84
|
+
|
|
85
|
+
> **이것은 그림이다. 소리는 안 바뀐다.** 같은 "1배" 에서 합성 단어가 녹음 문장보다 소음
|
|
86
|
+
> 대비 두 배쯤 크게 실린다는 사실(봉우리 기준)은 그대로다 — 훈련 조건의 문제라 소리를
|
|
87
|
+
> 맞출지는 따로 정한다. 그림은 이제 **설정한 비율**을 보여 주고 실제 진폭의 비는 보여 주지
|
|
88
|
+
> 않는다. 알고 맞바꾼 것이다.
|
|
89
|
+
|
|
90
|
+
> **(83) 에서 한 것을 여기서 뒤집었다.** 0.276.0 은 "칸은 그릴 것의 실제 최대" 로 풀었고
|
|
91
|
+
> 그때 나는 *"소음 봉우리가 문장의 절반인 흔한 꼴"* 이라고 적었다. 말귀가 재 보니 그 꼴은
|
|
92
|
+
> **단어 쪽에서만** 그렇고 문장 쪽은 거의 1:1 이었다 — 그리고 사용자가 원한 것은 칸이
|
|
93
|
+
> 막대에 맞는 것이 아니라 **막대가 규칙대로 서는 것**이었다. 증상(2배가 안 커 보인다)은
|
|
94
|
+
> 같았는데 물음이 달랐다.
|
|
95
|
+
|
|
96
|
+
## 0.279.0
|
|
97
|
+
|
|
98
|
+
### 재생 시간표를 **값으로** 둔다 — `audioTimeline` (말귀 요청 (85) 1단계, **동작 불변**)
|
|
99
|
+
|
|
100
|
+
재생기에는 "지금 시간표의 어디인가" 를 쥔 주인이 없었다. 시간표는 이벤트 손잡이 · 타이머 ·
|
|
101
|
+
토큰이 맞물린 **결과로 생길 뿐**이라, 그것을 알아야 하는 자리마다 메인 `<audio>` 를 보고
|
|
102
|
+
**제각기 짐작했다**:
|
|
103
|
+
|
|
104
|
+
- 소음 감시는 "메인이 도나" 를 묻다가 **뜸에서 소음을 껐다**(0.268.0)
|
|
105
|
+
- 토글은 `a.paused` 를 보다가 **뜸에서 소리를 두 번 냈다**(0.278.0)
|
|
106
|
+
- 재생판은 `play` 사건을 기다리다 **앞뜸 내내 비어 있었다**(0.278.0)
|
|
107
|
+
|
|
108
|
+
셋 다 같은 뿌리이고, 새 개념이 하나 생길 때마다 네 군데를 가르쳐야 했다.
|
|
109
|
+
|
|
110
|
+
그 첫걸음으로 **시간표 자체를 값으로** 둔다. `buildTimeline({ durationsSec, leadInMs, tailMs })`
|
|
111
|
+
은 시계도 요소도 없이 **구간 목록**(트랙마다 앞뜸 · 소리 · 뒤뜸)을 낸다. 그 값을 읽는 것도
|
|
112
|
+
같은 자리에 둔다 — `timelineProgress`(트랙 안에서 얼마나 왔나) · `timelineBarSpans`(막대 나눔) ·
|
|
113
|
+
`gapAfterTrackMs`(소리 사이) · `soundStartMs`.
|
|
114
|
+
|
|
115
|
+
`progressWithPad` · `padBarSpans` 는 **그 값을 읽는 얇은 함수**가 됐다(꼴은 그대로라 부르는
|
|
116
|
+
쪽은 안 바뀐다). 옛 값은 `test/audioLeadInTail.test.ts` 가 그대로 지킨다 — 그 파일은 안 고쳤다.
|
|
117
|
+
|
|
118
|
+
**재생기 본체는 아직 이 값을 안 읽는다.** 그건 2단계(진행기)다. 그때 시간표가 안 달라지려면
|
|
119
|
+
**지금 둘이 같은 숫자여야** 하므로, 그 다리를 못으로 박았다 — 가짜 시계로 재생기를 돌려
|
|
120
|
+
**실제로 소리가 난 때**가 `soundStartMs(tl, k)` 와 같고, 소리 사이가 `gapAfterTrackMs(tl, k)` 와
|
|
121
|
+
같은지(소리 하나 · 둘 · 셋 · 뜸 0). 못은 33가지가 됐다.
|
|
122
|
+
|
|
123
|
+
> **진행과 막대는 트랙마다 따로 잰다** — 지금 동작 그대로다. 재생바는 트랙이 바뀌면 처음으로
|
|
124
|
+
> 돌아가고, 파형도 그 트랙의 `앞뜸 + 소리 + 뒤뜸` 을 한 폭에 그린다. 시간표 **전체**로 재면
|
|
125
|
+
> 둘째 트랙이 절반에서 출발하게 되는데, 그건 다른 설계라 값에 박아 두었다.
|
|
126
|
+
|
|
127
|
+
## 0.278.0
|
|
128
|
+
|
|
129
|
+
### 앞뜸 동안 **재생기가 텅 비었다** — 재생판을 시간표가 시작할 때 켠다 (말귀 요청 (86))
|
|
130
|
+
|
|
131
|
+
사용자가 화면에서 짚었다: *"재생을 누르면 플레이어에 아무것도 안 나온다."* 이어서
|
|
132
|
+
*"재생바가 자꾸 단어 소리 시작할 때 나오는데 그러면 안 돼. **완전 처음 재생부터** 나와야지."*
|
|
133
|
+
|
|
134
|
+
말귀 실측(40ms 간격): 1577ms 돌림판 꺼짐 → 2583ms 재생판 보임 — **정확히 앞뜸 1초가 빈칸**
|
|
135
|
+
이었다. 돌림판도 없고 듣기 단추도 없고 재생판은 투명하다. 소음만 난다.
|
|
136
|
+
|
|
137
|
+
재생판은 `playMode` 일 때 보이는데, `playMode` 를 `await tryPlayWithRetry(a)` **뒤**에 세웠다.
|
|
138
|
+
앞뜸 기다림이 그 안에 있으니, 돌림판을 끄고 재생판을 켜는 사이에 **뜸이 통째로 끼었다.**
|
|
139
|
+
이제 뜸이 시작되기 **전에** 켠다(`재생판켜기` — 세 갈래에 흩어져 있던 것을 한 자리로).
|
|
140
|
+
앞뜸부터 **재생 중**으로 세워 단추도 ⏸ 로 선다.
|
|
141
|
+
|
|
142
|
+
> **값은 맞는데 눈에는 안 보였다.** 진행 값은 0.266.0 부터 앞뜸에서 출발했고 그렇게 재서
|
|
143
|
+
> 확인도 했다 — 그런데 그 마커가 담긴 판이 가려져 있었다. (74) 때 사용자가 말한 *"노이즈가
|
|
144
|
+
> 나오는 순간부터 재생바도 움직여야"* 가 **값으로만** 서 있었다. 내가 (85) 0단계에서 박은 못
|
|
145
|
+
> ("앞뜸 동안에도 나아간다")도 `style.left` 만 재고 통과했다. **보이는 것**을 따로 박았다 —
|
|
146
|
+
> 재생판 · 재생바가 앞뜸에 보이는가, 앞뜸 내내 빈칸이 없는가, 단추가 ⏸ 인가.
|
|
147
|
+
|
|
148
|
+
### 뜸 중에 ⏸ 를 누르면 **소리가 두 번 났다** — (85) 0단계가 찾은 결함
|
|
149
|
+
|
|
150
|
+
`playMode` 의 토글이 `a.paused` 만 봤다. 그런데 뜸 동안 메인 요소는 **멈춰 있다** — 앞뜸에는
|
|
151
|
+
`play()` 전이고 사이·뒤뜸에는 이미 `ended` 다. 그래서 ⏸ 로 보이는 단추를 뜸 중에 누르면
|
|
152
|
+
**멈춤이 아니라 재생 갈래**를 탔다: 돌고 있는 뜸 사슬 옆에 사슬이 하나 더 서고 **다음 소리가
|
|
153
|
+
두 번 났다**(가짜 시계: 사이 뜸 500ms 에 누르면 `b.mp3` 가 +1000ms, +1500ms 에).
|
|
154
|
+
|
|
155
|
+
감시 타이머가 0.268.0 에서 배운 것을 이 단추가 못 배우고 있었다 — **뜸은 소리가 안 나는
|
|
156
|
+
구간이지 멈춘 구간이 아니다.** 말귀가 (85) 에서 짚은 뿌리 그대로다: "지금 시간표의 어디인가"
|
|
157
|
+
를 쥔 주인이 없어서, 묻는 자리마다 메인 요소를 보고 **제각기 짐작한다.**
|
|
158
|
+
|
|
159
|
+
고친 동작:
|
|
160
|
+
- 뜸 중 ⏸ → 뜸이 걷히고 소음이 멎는다. 소리는 안 난다.
|
|
161
|
+
- **앞뜸**에서 멈췄다 이으면 **앞뜸부터 다시** — 앞뜸은 귀가 소음에 자리를 잡는 시간인데
|
|
162
|
+
멈추면 소음도 멎으니, 남은 뜸만 채우면 그 시간이 잘린다.
|
|
163
|
+
- **사이·뒤뜸**에서 멈췄다 이으면 **다음 소리로**(마지막이면 완료로) — 끝난 요소에 `play()` 를
|
|
164
|
+
걸면 방금 들은 소리가 처음부터 또 난다.
|
|
165
|
+
|
|
166
|
+
### 재생기의 시간표를 **못 박았다** — (85) 0단계
|
|
167
|
+
|
|
168
|
+
`test/audioPlayerTimelinePin.test.tsx`, 29가지. 가짜 시계 + 가짜 소리 요소로 재생기 **본체**를
|
|
169
|
+
돌려 "몇 ms 에 무엇이 일어나는가" 를 잰다 — 앞뜸 1000 · 소리 사이 2000 · 소음이 0ms 부터
|
|
170
|
+
시간표 내내 · 진행이 앞뜸부터 뒤뜸 끝까지 · 뜸 중에 떠나면 소리 0번 · 연타에 한 번만.
|
|
171
|
+
지금까지는 순수 함수 · 배선 · 틱 · 감시가 **따로따로** 박혀 있었고, 그것들이 맞물려 나오는
|
|
172
|
+
시간표는 브라우저 실측에만 있었다. 구조를 고치는 동안 이 파일은 안 고친다.
|
|
173
|
+
|
|
174
|
+
## 0.277.0 — **레지스트리에 없다**
|
|
175
|
+
|
|
176
|
+
> 러너 배정 실패(새벽 다섯 중 셋째). 다시 걸어 둔 것이 줄에 선 채로 0.278.0 을 내게 되어
|
|
177
|
+
> **걷었다** — 둘이 다 줄에 서면 낮은 판이 나중에 끝나 `latest` 가 뒤로 갈 수 있다.
|
|
178
|
+
> **아래 내용은 0.278.0 에 들어 있다.**
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
### 오디오 미터가 **옆 단추와 같은 높이 사다리**를 탄다 (말귀 요청 (80))
|
|
182
|
+
|
|
183
|
+
미터를 켜고 끌 때마다 바닥 띠가 79↔75px 로 바뀌어 **위쪽 전체가 2px 들썩였다**(말귀 실측:
|
|
184
|
+
재생기 y 196↔198, 파형 204↔206, `다음 문제` 753↔755).
|
|
185
|
+
|
|
186
|
+
바닥 띠는 `align-items: center` 라 **가장 큰 아이가 띠 높이를 정한다.** 미터에 높이를 안
|
|
187
|
+
잡아 속에 든 두 줄로 54px 이 됐는데, 옆의 `훈련 설정` 은 `.button56` 이고 그것은 **폭 따라
|
|
188
|
+
내려가는 사다리**다:
|
|
189
|
+
|
|
190
|
+
.button56 56px
|
|
191
|
+
.button56 @media (max-width: 1024px) 50px
|
|
192
|
+
.button56 @media (max-width: 768px) 46px
|
|
193
|
+
|
|
194
|
+
그래서 **769~1024px 에서만** 미터(54)가 단추(50)보다 커져 들썩인다. 넓은 화면에서는 단추가
|
|
195
|
+
더 커서 안 난다. 미터 높이를 **같은 사다리**로 묶는다 — 테두리·안쪽 여백을 높이 안으로
|
|
196
|
+
넣어야 하므로 `border-box` 다.
|
|
197
|
+
|
|
198
|
+
`test/bottomMetersMatchButtonLadder.test.ts` 가 **두 사다리가 같은지** 센다(값이 아니라
|
|
199
|
+
같음을). 한쪽만 고치면 그 폭에서 다시 들썩인다 — 한 칸 어긋내 보고 빨개지는지 확인했다.
|
|
200
|
+
|
|
201
|
+
말귀가 **다섯 폭 + 경계 넷**에서 재서 닫았다(조건: 링크 상태 · `dist` 0.277.0 · dev 서버
|
|
202
|
+
새로 · 뷰포트 에뮬레이션):
|
|
203
|
+
|
|
204
|
+
폭 훈련 설정 미터 띠 끔→켬→끔 재생기 y 끔→켬→끔
|
|
205
|
+
1485 56 56 81 → 81 → 81 439.5 → 439.5 → 439.5
|
|
206
|
+
1025 56 56 81 → 81 → 81 178 → 178 → 178
|
|
207
|
+
1024 50 50 75 → 75 → 75 180.5 → 180.5 → 180.5
|
|
208
|
+
952 50 50 75 → 75 → 75 189.5 → 189.5 → 189.5
|
|
209
|
+
769 50 50 75 → 75 → 75 239.5 → 239.5 → 239.5
|
|
210
|
+
768 46 46 71 → 71 → 71 241.5 → 241.5 → 241.5
|
|
211
|
+
|
|
212
|
+
**경계 넷이 다 제값이다** — 1024 는 50 쪽(`max-width` 는 그 값을 포함한다), 1025 는 56 쪽,
|
|
213
|
+
768 은 46 쪽, 769 는 50 쪽.
|
|
214
|
+
|
|
215
|
+
> **46px 칸은 "혹시" 가 아니라 실제로 쓰인다 — 내가 틀렸다.** 나는 *"줄 안 미터는 `!폰` 일
|
|
216
|
+
> 때만 그려지니 폰 폭은 안 쓰인다"* 고 적었는데, 말귀가 **768px 에서 줄 안 미터가 46px 로
|
|
217
|
+
> 그려지는 것**을 쟀다. 까닭은 **두 문턱이 한 칸 어긋나 겹치기 때문**이다:
|
|
218
|
+
>
|
|
219
|
+
> 폰 판정 useMediaQuery('(max-width: 767px)') → 768 은 폰이 아니다(줄 안 미터)
|
|
220
|
+
> 단추 사다리 @media (max-width: 768px) → 768 은 이미 46px
|
|
221
|
+
>
|
|
222
|
+
> **정확히 768px 한 칸**이 그 띠다. 사다리를 끝까지 안 채웠으면 거기서 다시 들썩였을 것이다.
|
|
223
|
+
> "안 쓰일 것 같지만 채워 둔다" 가 아니라 **쓰이는 자리였다.**
|
|
224
|
+
|
|
225
|
+
> **이 건은 폭을 안 적어 한 번 어긋났다.** 처음 보고에 `훈련 설정` 이 50px 이라고만 적혀
|
|
226
|
+
> 있었고, 코어 CSS 를 읽은 나는 `@media` 밖의 56px 만 보고 **"숫자가 안 맞는다"** 고 되물었다.
|
|
227
|
+
> 둘 다 맞는 값이었고 **잰 폭(952px)이 안 적혀 있었을 뿐**이다. 치수는 **어느 폭에서 쟀는지**
|
|
228
|
+
> 와 함께 적어야 한다 — 측정 조건을 적는다는 것이 여기서는 창 폭이다.
|
|
229
|
+
|
|
230
|
+
### (81) 은 **안 한다** — 사용자 결정
|
|
231
|
+
|
|
232
|
+
파형의 재생된 층과 미재생 층이 **처음부터 같은 색**이라는 것은 확인됐다(두 쪽이 따로 재서
|
|
233
|
+
같은 값을 봤다. z-index 61/62 만 다르다). 두 층·`clip-path`·`--progress` 를 다 세워 놓고
|
|
234
|
+
**마지막 한 가지를 안 만든 것**이다.
|
|
235
|
+
|
|
236
|
+
그래도 **그대로 둔다**(사용자 결정, 2026-10-06: *"할 필요 없어"*). 뜸 동안 진행은 세로
|
|
237
|
+
마커(`.audio-player__fill`)가 보여 주고 그것으로 충분하다는 쪽이다. 소음 층에 진행 짝을
|
|
238
|
+
두는 것도 함께 접는다 — 색이 같은 한 짝만 둬서는 **눈에 아무 변화가 없다.**
|
|
239
|
+
|
|
240
|
+
> 다음에 이 자리를 보는 사람에게: 이것은 **안 고친 것이지 못 본 것이 아니다.**
|
|
241
|
+
|
|
242
|
+
### 관문이 **못 재는 것을 못 잰다고 말한다** — 걸어 둔 소비자
|
|
243
|
+
|
|
244
|
+
`audit:consumers` 는 소비자의 `node_modules` 에서 깔린 판을 읽어 `RELEASE.md` 표와 맞춰
|
|
245
|
+
본다. 그런데 그 자리가 **이 저장소를 가리키는 심링크**면 읽히는 것은 **지금 내 작업 복사본의
|
|
246
|
+
판**이지 그 앱이 받아서 쓰는 판이 아니다.
|
|
247
|
+
|
|
248
|
+
이번에 실제로 걸렸다 — 표를 0.272.0 으로 맞춰 뒀는데 관문이 *"실물은 0.277.0"* 이라 울었다.
|
|
249
|
+
**아직 내보내지도 않은 판**이다. 보니 `speechear-v2` 가 이 저장소로 걸려 있었다. 그대로
|
|
250
|
+
두면 낼 때마다 어긋났다고 울고(내 판과 늘 같으므로), 더 나쁘게는 **그 숫자를 믿게 된다.**
|
|
251
|
+
|
|
252
|
+
**못 재는 것은 못 잰다고 말한다** — 틀린 값을 들고 맞다고 하는 것보다 낫다.
|
|
253
|
+
|
|
254
|
+
## 0.276.0 — **레지스트리에 없다**
|
|
255
|
+
|
|
256
|
+
> 0.274.0 과 같은 까닭으로 안 나갔다 —
|
|
257
|
+
> *"The job was not acquired by Runner of type hosted even after multiple attempts"*.
|
|
258
|
+
> 2026-10-06 새벽에 발행 일감 넷 중 **둘**이 이렇게 떨어졌다(깃헙 쪽 사정, 관문은 통과했다).
|
|
259
|
+
> **아래 내용은 0.277.0 에 들어 있다.**
|
|
260
|
+
|
|
261
|
+
### 소음 2배가 **눈금 끝에 안 닿았다** — 칸을 설정이 아니라 그릴 것에 맞춘다 (말귀 요청 (83))
|
|
262
|
+
|
|
263
|
+
사용자: *"2배인데도 1배처럼 보이네?"* 말귀가 "어느 쪽 셈이 맞느냐" 를 물어 왔다. **둘 다
|
|
264
|
+
맞는데 서로 다른 것을 재고 있었다.**
|
|
265
|
+
|
|
266
|
+
- **칸**(`--wave-h`)은 **비율 설정**으로 컸다 — `waveBarPx(max(1, R))`, R=2 면 74px.
|
|
267
|
+
- **막대**는 **잰 진폭**으로 큰다 — `a = 봉우리/문장최고치 × M × R ÷ gain`.
|
|
268
|
+
|
|
269
|
+
소음 파일의 봉우리가 문장 최고치와 **같지 않으면** 막대는 `R` 에 못 닿는데 칸은 `R` 만큼
|
|
270
|
+
자란다. 말귀 실측(R=2): 칸 45 → 74px, 막대 20 → 41px. **막대는 분명히 두 배가 됐는데**
|
|
271
|
+
칸이 같이 커져 칸 대비 44% → 55% 라 눈에는 그대로다. 위아래로 **닿을 수 없는 29px** 이
|
|
272
|
+
남고, 그 빈자리가 막대를 작아 보이게 한다.
|
|
273
|
+
|
|
274
|
+
설계는 *"2배가 정확히 HMAX(74px)에 닿는다"*(사용자 결정 2026-09-13)인데, 그 말이 서려면
|
|
275
|
+
칸이 **닿을 수 있는 것**에 맞아야 한다.
|
|
276
|
+
|
|
277
|
+
이제 칸은 **그릴 막대의 실제 최대**로 잡는다. 흔한 꼴(소음 봉우리가 문장의 절반)에서 R=2 면
|
|
278
|
+
a=1 이라 칸은 45px 에 머물고 막대만 20 → 41px 로 **눈에 두 배가 된다.** 칸은 소음이
|
|
279
|
+
**정말로** 문장보다 커질 때만 자라고, 그때는 그 큰 막대가 꼭대기에 닿는다.
|
|
280
|
+
|
|
281
|
+
> **어느 셈도 안 고쳤다.** 소리 쪽 잣대(`noiseElementVolume`)와 그림 쪽 잣대(`noiseAmp`)는
|
|
282
|
+
> 그대로다 — 그 둘은 맞게 맞물려 있다(0.127.0). 고친 것은 **칸을 무엇으로 재는가** 하나다.
|
|
283
|
+
|
|
284
|
+
> **시험 둘을 쓰다 이 파일 머리글이 경고하는 함정에 그대로 빠졌다.** 소음 막대에는 바닥값이
|
|
285
|
+
> 깔려 있어 `Math.max(...) > 0` 으로 기다리면 **계산 전에 즉시 통과한다** — 4px(바닥값)을
|
|
286
|
+
> 22.5px 로 읽을 뻔했다. 머리글에 *"이 시험 넷이 그렇게 헛통과했다"* 고 적혀 있는 바로 그
|
|
287
|
+
> 자리다. 받아온 것과 층이 선 것을 기다리게 고쳤다. **적어 둔 경고도 제가 걸리면 안 보인다.**
|
|
288
|
+
|
|
289
|
+
## 0.275.0
|
|
290
|
+
|
|
291
|
+
### 진폭이 **진짜 0 인 자리**에 막대를 그리지 않는다 (말귀 요청 (82))
|
|
292
|
+
|
|
293
|
+
둘이 겹쳐 있었다. 하나는 **내가 0.266.0 에서 넣은 규칙이 너무 넓었던 것**이고, 하나는
|
|
294
|
+
**소음 파일 자체**였다.
|
|
295
|
+
|
|
296
|
+
**(가) 바닥값을 뜸 자리에만 깐다.** 0.266.0 은 "깔개(소음 층)가 없으면 문장 막대를 안
|
|
297
|
+
숨긴다" 였는데, 그 **모든** 칸에 깔았다. 그래서 **소리 구간 한가운데의 진짜 무음까지** 4px
|
|
298
|
+
막대가 되어 **없는 소리를 있다고 그렸다** — 말귀 실측(소음 비율 0): 100칸 중 0 인 칸이
|
|
299
|
+
하나도 없고 최소가 바닥값 0.0889. 사용자가 그 가로줄을 짚었다.
|
|
300
|
+
|
|
301
|
+
가름선은 **왜 비었나** 다. 뜸 자리는 **설계로** 소리가 없는 곳이라 끊기면 파형이 잘려
|
|
302
|
+
보이고, 소리 구간 안의 무음은 **그 소리가 실제로 조용한 것**이라 그리면 거짓이 된다.
|
|
303
|
+
이제 바닥은 뜸 자리에만 깔린다.
|
|
304
|
+
|
|
305
|
+
> 0.266.0 때 "양끝이 잘려 보인다" 고 적은 것은 **내가 놀이터에서 본 것**이었고, 사용자가
|
|
306
|
+
> 짚은 것은 소음 층 쪽이었다(그건 (76) 에서 따로 고쳤다). **내 눈보다 쓰는 사람의 눈이
|
|
307
|
+
> 먼저다.** 그때 쓴 시험 둘이 이번에 막아섰는데 — **그 둘이 지키던 값이 틀린 값**이었다.
|
|
308
|
+
|
|
309
|
+
**(나) 루프되는 바탕 소리는 앞머리 무음을 건너뛰고 뜬다.** mp3 는 인코더 지연 때문에 앞에
|
|
310
|
+
무음이 붙는다. 실측(2026-10-06, 소음 파일 넷 · 48kHz):
|
|
311
|
+
|
|
312
|
+
noise1 45.6ms noise4 62.0ms
|
|
313
|
+
noise2-01 66.3ms noise3-01 62.4ms
|
|
314
|
+
|
|
315
|
+
**하나도 빠짐없이** 46~78ms 가 비어 있다. 긴 창에서는 안 보이는데 **창이 짧으면 그 무음이
|
|
316
|
+
앞칸 여럿을 먹는다** — 1초 창에 100칸이면 한 칸이 10ms 라 **앞 6~8칸**이 봉우리 0 이 된다
|
|
317
|
+
(말귀가 화면에서 센 수와 같다: *"앞부분 노이즈 파형이 왜 작아?"*).
|
|
318
|
+
|
|
319
|
+
게다가 소음은 **루프**라 그 무음은 맨 처음 한 번만 지나가는데 그림은 내내 보여 준다 —
|
|
320
|
+
**들리는 것과 다른 것을 그리고 있었다.** 그래서 소음만 앞머리 무음을 건너뛰고 뜬다.
|
|
321
|
+
**문장에는 안 켠다**: 문장의 앞 무음은 진짜 그 소리의 일부이고 앞뒤 뜸((74))이 그 위에서
|
|
322
|
+
셈된다.
|
|
323
|
+
|
|
324
|
+
고친 뒤 실측(놀이터, 소음 켠 재생기): 소음 앞 10칸이 **0.383~0.393** 이고 바닥값과 같은
|
|
325
|
+
칸이 **0개**(전에는 앞 6~8칸이 0.0889 로 눌려 있었다).
|
|
326
|
+
|
|
327
|
+
## 0.274.0 — **레지스트리에 없다**
|
|
328
|
+
|
|
329
|
+
> 이 판은 **안 나갔다.** 발행 일감이 깃헙 쪽 사정으로 떨어졌다 —
|
|
330
|
+
> *"The job was not acquired by Runner of type hosted even after multiple attempts"*.
|
|
331
|
+
> 코어 코드·관문과는 무관하다(관문은 통과했다).
|
|
332
|
+
>
|
|
333
|
+
> **아래 내용은 0.275.0 에 그대로 들어 있다.** 쓰는 쪽은 범위로 받으므로(`^0.272.0` 등)
|
|
334
|
+
> 번호 하나가 비는 것은 받는 데 지장이 없다.
|
|
335
|
+
>
|
|
336
|
+
> **지금도 살릴 수는 있다 — 일부러 안 한다.** 다시 돌리면 그 run 의 커밋(`2f33c56b`)을
|
|
337
|
+
> 그대로 짓는다(run 은 걸릴 때의 SHA 에 묶인다 — 떠 보고 알았다. 그 전에 "되살릴 길이 없다",
|
|
338
|
+
> "판을 올리기 전에만 된다" 고 두 번 틀리게 적었다). 안 하는 까닭은 `latest` 다: 낮은 판을
|
|
339
|
+
> 나중에 올리면 꼬리표가 뒤로 간다. `RELEASE.md` 에 적어 뒀다.
|
|
340
|
+
|
|
341
|
+
### `모두 듣기` 의 **낱말 사이 뜸** — `playAllGapMs` (말귀 요청 (79))
|
|
342
|
+
|
|
343
|
+
`TrainingStepCard` 의 `모두 듣기` 는 앞 카드가 끝나자마자 다음을 틀었다. 그래서 들리는
|
|
344
|
+
사이가 **설계된 값이 아니라 그 카드를 받아 오는 시간**이었다 — 남은 시간이지 정한 시간이
|
|
345
|
+
아니다. 말귀 실측(`첫 음절이 같은 단어 맞히기` 카드 셋): 안 받아 둔 판 1895ms · 555ms,
|
|
346
|
+
**같은 단추를 다시 누른 판 11ms · 9ms.**
|
|
347
|
+
|
|
348
|
+
낱말끼리 **견주는** 훈련인데 9ms 면 세 낱말이 한 숨처럼 이어져 가를 수가 없다. 그리고
|
|
349
|
+
그 사이가 **망 속도로 정해진다** — 빠른 망에서 더 어려워지는 훈련은 조건이 안 선다
|
|
350
|
+
((74) 에서 겹치기를 안 한 까닭과 같다).
|
|
351
|
+
|
|
352
|
+
`playAllGapMs` 를 더한다(기본 0 — 안 주면 전과 똑같다). **앞 카드가 끝난 뒤부터** 세고,
|
|
353
|
+
마지막 뒤에는 안 둔다. 멈춤 신호와 함께 기다려 **누르는 순간 바로 걷힌다.**
|
|
354
|
+
|
|
355
|
+
`leadInMs`·`tailMs` 와 같은 결이다 — 그쪽은 한 소리의 앞뒤, 이쪽은 카드와 카드 사이.
|
|
356
|
+
뜸이 그렇듯 **재생 속도를 타지 않는다**(0.273.0).
|
|
357
|
+
|
|
358
|
+
`test/cardPlayAllGap.test.tsx` 는 **값이 아니라 차례**를 묻는다 — 앞 카드가 *끝난 뒤* 세는가,
|
|
359
|
+
마지막 뒤에는 안 두는가, 기본 0 이면 전과 같은가. 뜸을 빼 보고 빨개지는지 확인했다.
|
|
360
|
+
|
|
10
361
|
## 0.273.0
|
|
11
362
|
|
|
12
363
|
### **뜸은 재생 속도를 안 탄다** — 정한 자리를 적어 둔다
|