Csound Csound-dev Csound-tekno Search About

[Csnd] sample-accurate mechanism

Date2024-12-09 18:56
FromPhilipp Neumann <0000119f78f3a4f9-dmarc-request@LISTSERV.HEANET.IE>
Subject[Csnd] sample-accurate mechanism
Hello everyone!

I try to get my head around some plugin development and i have some questions regarding the sample-accurate mechanism.

In the floss manual we have the example at the end of the mail and my questions are:

- how often are the offset and early variables updated? every k-cycle?
- is only one of these (offset and early) > 0 ?
- what is the `early` variable representing?
- are there multiple k-cycle running out of sync at the same time?

Because when i got it right, the mechanism is working like this:
- a main csound k-cycle is running
- when the accurate flag is given, a new instrument is not starting in sync with the main k-cycle, but to the nearest sample in time; so there are two k-cycles now running which are not in sync
- Csound gives the information at which point in the main-csound-k-cycle (?) the instrument is started and represents this in the offset and early variables
- so when the the new instrument is started at the 5th sample of the main-k-cycle the offset is 5
- but what is now happening with the early variable?

- Philipp

```
    int newopc_process_audio(CSOUND *csound, newopc *p){
      int i, n = CS_KSMPS;
      MYFLT *aout = p->out;  /* output signal */
      MYFLT cnt = p->var1 + *(p->in2);
      uint32_t offset = p->h.insdshead->ksmps_offset;
      uint32_t early  = p->h.insdshead->ksmps_no_end;

      /* sample-accurate mode mechanism */
      if(offset)
        memset(aout, '', offset*sizeof(MYFLT));
      if(early) {
        n -= early;
        memset(&aout[n], '', early*sizeof(MYFLT));
      }

      if(cnt > p->var2)
        cnt = (MYFLT) 0; /* check bounds */

      /* processing loop    */
      for(i=offset; i < n; i++)
        aout[i] = *(p->in1) + cnt;

      p->var1 = cnt; /* keep the value of cnt */
      return OK;
    }
```
Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
        https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here

Date2024-12-09 19:58
Fromvlz
SubjectRe: [Csnd] sample-accurate mechanism
Offset may be nonzero at the start of the event and early may be nonzero at the end of the event. 

There is boilerplate code in the opcode_sdk repository for dealing with this in the mult.c example. 

Prof. Victor Lazzarini
Maynooth University
Ireland

> On 9 Dec 2024, at 18:56, Philipp Neumann <0000119f78f3a4f9-dmarc-request@listserv.heanet.ie> wrote:
> 
> Hello everyone!
> 
> I try to get my head around some plugin development and i have some questions regarding the sample-accurate mechanism.
> 
> In the floss manual we have the example at the end of the mail and my questions are:
> 
> - how often are the offset and early variables updated? every k-cycle?
> - is only one of these (offset and early) > 0 ?
> - what is the `early` variable representing?
> - are there multiple k-cycle running out of sync at the same time?
> 
> Because when i got it right, the mechanism is working like this:
> - a main csound k-cycle is running
> - when the accurate flag is given, a new instrument is not starting in sync with the main k-cycle, but to the nearest sample in time; so there are two k-cycles now running which are not in sync
> - Csound gives the information at which point in the main-csound-k-cycle (?) the instrument is started and represents this in the offset and early variables
> - so when the the new instrument is started at the 5th sample of the main-k-cycle the offset is 5
> - but what is now happening with the early variable?
> 
> - Philipp
> 
> ```
>    int newopc_process_audio(CSOUND *csound, newopc *p){
>      int i, n = CS_KSMPS;
>      MYFLT *aout = p->out;  /* output signal */
>      MYFLT cnt = p->var1 + *(p->in2);
>      uint32_t offset = p->h.insdshead->ksmps_offset;
>      uint32_t early  = p->h.insdshead->ksmps_no_end;
> 
>      /* sample-accurate mode mechanism */
>      if(offset)
>        memset(aout, '', offset*sizeof(MYFLT));
>      if(early) {
>        n -= early;
>        memset(&aout[n], '', early*sizeof(MYFLT));
>      }
> 
>      if(cnt > p->var2)
>        cnt = (MYFLT) 0; /* check bounds */
> 
>      /* processing loop    */
>      for(i=offset; i < n; i++)
>        aout[i] = *(p->in1) + cnt;
> 
>      p->var1 = cnt; /* keep the value of cnt */
>      return OK;
>    }
> ```
> Csound mailing list
> Csound@listserv.heanet.ie
> https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
> Send bugs reports to
>        https://github.com/csound/csound/issues
> Discussions of bugs and features can be posted here

Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
        https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here

Date2024-12-09 21:04
FromPhilipp Neumann <0000119f78f3a4f9-dmarc-request@LISTSERV.HEANET.IE>
SubjectRe: [Csnd] sample-accurate mechanism
ah, now i guess i got it:

offset is only important, when a event is starting.
so it creates a offset, just for the first k-cycle and only for this k-cycle it may be nonzero.

early is only important, when a event is stopped.
so it’s making the buffer writing process stop at the time, the instrument is stopped, and the remaining samples of the k-cycle are set to zero.

Thanks!

> Am 09.12.2024 um 20:58 schrieb vlz :
> 
> Offset may be nonzero at the start of the event and early may be nonzero at the end of the event. 
> 
> There is boilerplate code in the opcode_sdk repository for dealing with this in the mult.c example. 
> 
> Prof. Victor Lazzarini
> Maynooth University
> Ireland
> 
>> On 9 Dec 2024, at 18:56, Philipp Neumann <0000119f78f3a4f9-dmarc-request@listserv.heanet.ie> wrote:
>> 
>> Hello everyone!
>> 
>> I try to get my head around some plugin development and i have some questions regarding the sample-accurate mechanism.
>> 
>> In the floss manual we have the example at the end of the mail and my questions are:
>> 
>> - how often are the offset and early variables updated? every k-cycle?
>> - is only one of these (offset and early) > 0 ?
>> - what is the `early` variable representing?
>> - are there multiple k-cycle running out of sync at the same time?
>> 
>> Because when i got it right, the mechanism is working like this:
>> - a main csound k-cycle is running
>> - when the accurate flag is given, a new instrument is not starting in sync with the main k-cycle, but to the nearest sample in time; so there are two k-cycles now running which are not in sync
>> - Csound gives the information at which point in the main-csound-k-cycle (?) the instrument is started and represents this in the offset and early variables
>> - so when the the new instrument is started at the 5th sample of the main-k-cycle the offset is 5
>> - but what is now happening with the early variable?
>> 
>> - Philipp
>> 
>> ```
>>   int newopc_process_audio(CSOUND *csound, newopc *p){
>>     int i, n = CS_KSMPS;
>>     MYFLT *aout = p->out;  /* output signal */
>>     MYFLT cnt = p->var1 + *(p->in2);
>>     uint32_t offset = p->h.insdshead->ksmps_offset;
>>     uint32_t early  = p->h.insdshead->ksmps_no_end;
>> 
>>     /* sample-accurate mode mechanism */
>>     if(offset)
>>       memset(aout, '', offset*sizeof(MYFLT));
>>     if(early) {
>>       n -= early;
>>       memset(&aout[n], '', early*sizeof(MYFLT));
>>     }
>> 
>>     if(cnt > p->var2)
>>       cnt = (MYFLT) 0; /* check bounds */
>> 
>>     /* processing loop    */
>>     for(i=offset; i < n; i++)
>>       aout[i] = *(p->in1) + cnt;
>> 
>>     p->var1 = cnt; /* keep the value of cnt */
>>     return OK;
>>   }
>> ```
>> Csound mailing list
>> Csound@listserv.heanet.ie
>> https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
>> Send bugs reports to
>>       https://github.com/csound/csound/issues
>> Discussions of bugs and features can be posted here
> 
> Csound mailing list
> Csound@listserv.heanet.ie
> https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
> Send bugs reports to
>        https://github.com/csound/csound/issues
> Discussions of bugs and features can be posted here
> 

Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
        https://github.com/csound/csound/issues
Discussions of bugs and features can be posted here