Skip to content

Commit

Permalink
svp: add interval field to CurveGenerator
Browse files Browse the repository at this point in the history
  • Loading branch information
SoulMelody committed Jul 2, 2024
1 parent b4d56d9 commit 4cbff29
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
7 changes: 5 additions & 2 deletions libresvip/plugins/svp/param_expression.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import dataclasses
import enum
import operator
from typing import TYPE_CHECKING, Union
from typing import TYPE_CHECKING, Optional, Union

from libresvip.model.point import Point
from libresvip.utils.search import find_last_index
Expand All @@ -20,6 +20,8 @@
if TYPE_CHECKING:
from collections.abc import Callable, Iterable

import portion

from libresvip.core.time_sync import TimeSynchronizer

from .model import SVNote
Expand Down Expand Up @@ -110,6 +112,7 @@ class CurveGenerator(ParamExpression):
_point_list: dataclasses.InitVar[Iterable[Point]]
_interpolation: dataclasses.InitVar[Callable[[float], float]]
_base_value: dataclasses.InitVar[int] = 0
interval: Optional[portion.Interval] = None

def __post_init__(
self,
Expand All @@ -136,7 +139,7 @@ def __post_init__(
self.base_value = _base_value

def value_at_ticks(self, ticks: int) -> float:
if len(self.point_list) == 0:
if len(self.point_list) == 0 or (self.interval is not None and ticks not in self.interval):
return self.base_value
index = find_last_index(self.point_list, lambda point: point.x <= ticks)
if index == -1:
Expand Down
6 changes: 3 additions & 3 deletions libresvip/plugins/svp/synthv_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,21 +293,21 @@ def parse_pitch_curve(
instant_interval = RangeInterval(
[
(
note.onset,
note.onset + note.duration,
position_to_ticks(note.onset),
position_to_ticks(note.onset + note.duration),
)
for note in sv_notes
if note.instant_mode is True
]
)
pitch_diff_expr += CurveGenerator(
interval=instant_interval.interval,
_point_list=[
Point(
position_to_ticks(point.offset),
round(point.value),
)
for point in self.instant_pitch.points.root
if point.offset in instant_interval
],
_interpolation=self.parse_interpolation(self.instant_pitch.mode),
)
Expand Down

0 comments on commit 4cbff29

Please sign in to comment.