Given the suggestions of Scott and James, a solution would be easy. Clearly, as you just started with SC, this is not obvious and nearby: a pseudo ugen class fitting your needs. The definition would be really short, here’s a quick variant:
RingSync : UGen {
*ar { |in, freq|
var phase = Sweep.ar(in, freq);
var synced = SinOsc.ar(0, (phase % 1) * 2pi);
^synced * in
}
}
Save as .sc file in the Extensions folder, restart SC and then the bespoken example turns into a one-liner:
{ RingSync.ar(LFTri.ar(250), 300) * 0.1 }.play
{ RingSync.ar(LFTri.ar(250), [300, 1000]) * 0.1 }.play
Further variants: choice of synced waveform per integer argument or by passed buffer(s), differing modulation algebra, leaking option etc.
BTW you can also search the mailing lists for “hard sync”:
For sc-users it gives 19 hits, including historically interesting ones:
https://www.listarc.bham.ac.uk/lists/sc-users-2004/msg07779.html