| 174 | } |
| 175 | |
| 176 | public applyLyrics(lyrics: Lyrics[]): void { |
| 177 | for (const lyric of lyrics) { |
| 178 | lyric.finish(); |
| 179 | } |
| 180 | const staff: Staff = this.staves[0]; |
| 181 | for (let li: number = 0; li < lyrics.length; li++) { |
| 182 | const lyric: Lyrics = lyrics[li]; |
| 183 | if (lyric.startBar >= 0 && lyric.startBar < staff.bars.length) { |
| 184 | let beat: Beat | null = staff.bars[lyric.startBar].voices[0].beats[0]; |
| 185 | for (let ci: number = 0; ci < lyric.chunks.length && beat; ci++) { |
| 186 | // skip rests and empty beats |
| 187 | while (beat && (beat.isEmpty || beat.isRest)) { |
| 188 | beat = beat.nextBeat; |
| 189 | } |
| 190 | // mismatch between chunks and beats might lead to missing beats |
| 191 | if (beat) { |
| 192 | // initialize lyrics list for beat if required |
| 193 | if (!beat.lyrics) { |
| 194 | beat.lyrics = new Array<string>(lyrics.length); |
| 195 | beat.lyrics.fill(''); |
| 196 | } |
| 197 | // assign chunk |
| 198 | beat.lyrics[li] = lyric.chunks[ci]; |
| 199 | beat = beat.nextBeat; |
| 200 | } |
| 201 | } |
| 202 | } |
| 203 | } |
| 204 | } |
| 205 | } |