User:Contribution/Chanofreq Project: Difference between revisions

Contribution (talk | contribs)
Contribution (talk | contribs)
No edit summary
 
(54 intermediate revisions by the same user not shown)
Line 1: Line 1:
== WARNING! ==
'''WARNING!''' The Chanofreq project has been replaced by the [[User:Contribution/Chanopif Project|Chanopif project]]!
== Chanofreq Project ==
== Chanofreq Project ==
'''Objective:''' The Chanofreq project seeks to create a standardized file format that allows precise tuning of each note on every MIDI channel to a specific frequency. The aim is to achieve this using a minimalistic data structure that prioritizes efficiency and simplicity.
'''Objective:''' The Chanofreq project seeks to create a standardized file format that allows precise tuning of each note on every MIDI channel to a specific frequency. The aim is to achieve this using a minimalistic data structure that prioritizes efficiency and simplicity.


Line 18: Line 20:
* '''X:''' An integer ≥ 1, representing the MIDI channel.
* '''X:''' An integer ≥ 1, representing the MIDI channel.
* '''Y:''' An integer ≥ 0, representing the note number.
* '''Y:''' An integer ≥ 0, representing the note number.
* '''Z:''' A decimal number such as '''minfreq''' ≤ Z < '''maxfreq''', representing the frequency in Hertz. This value is encoded by the parser as a positive integer with a bit depth defined by '''bitfreq'''.
* '''Z:''' A decimal number within the range '''minfreq''' ≤ Z < '''maxfreq''', representing the frequency in Hertz. This value is encoded as a positive integer by the parser with a bit depth defined by '''bitfreq''', using the formula: parser_frequency = int(((Z - minfreq) * (2 ** bitfreq) / (maxfreq - minfreq)) + 0.5). Original default settings are set to: minfreq = 0 Hz, maxfreq = 18446.744073709551616 Hz, and bitfreq = 64. Thus, Z has a precision of fifteen decimal places. Parsers designed for 32-bit hardware and software should adopt the alternative default settings: minfreq = 0 Hz, maxfreq = 21474.83648 Hz, and bitfreq = 32. By doing so, the Z frequencies specified by users for the original default mode remain compatible, and maintain a precision of five decimal places with an additional sixth decimal place rounded to either 0 or 5, offering a convenient solution.
With default settings, Z has a precision of five decimal places with an additional sixth decimal place that must be either 0 or 5, and is ranged between 0 Hz and 21474.83648 Hz.
 
{{todo|Simplify|inline=1|comment=Use 64-bit floating-point precision as the default standard, and make the bitfreq workaround optional for systems not supporting 64-bit floats.}}


Commands can be separated by a semicolon (';') or a newline.
Commands can be separated by a semicolon (';') or a newline.
Line 26: Line 29:
  channel X1 note Y1 frequency Z1; channel X2 note Y2 frequency Z2
  channel X1 note Y1 frequency Z1; channel X2 note Y2 frequency Z2
  channel X3 note Y3 frequency Z3
  channel X3 note Y3 frequency Z3
{{todo|'''Chanofreq Modes Implementation'''|inline=1|comment=Propose offering three distinct modes for chanofreq file structures:
* '''chanofreq mode A''': define the frequencies for each note on every channel individually
* '''chanofreq mode B''': define the frequencies for one channel, and an equave between each channel (a factor defined by a floating-point number)
* '''chanofreq mode C''': define the frequencies for one or more starting notes (referred to as a pattern), a sub-equave between each repetition of the pattern within one channel (a factor defined by a floating-point number), and an equave between each channel (a factor defined by a floating-point number)
'''Calculation:'''
parser_frequency = frequency * (sub-equave ** p) * (equave ** c)
'''Precision Handling:'''
To maintain precision when the parser calculates frequencies using equaves or sub-equaves, implement the following options:
* 64-bit Floating-Point Precision: This option simply sets the parser's frequency calculations to use 64-bit floats. (enough for mode A)
* 128-bit Floating-Point Precision: This option increases calculation precision to 128-bit floats. (mandatory for modes B and C. Otherwise, the error is too big.)
This precision level should be defined in the first line of the file with a specific syntax, for example:
chanofreq version ?.?.? mode ? precision x4
* 64-bit floating-point precision: Denoted as precision x2
* 128-bit floating-point precision: Denoted as precision x4
Note: Even if 128-bit precision is used for internal calculations, the output frequencies can be rounded to 64-bit float for compatibility with software and hardware devices.
'''Question:'''
* Would it be advisable to offer modes B and C, given that significant errors can arise with 64-bit floats when using large exponents?
'''Answer:'''
* It should be fine to use 64-bit float, as long as no rounding is applied, we stay within the human hearing range, and the number of notes remains reasonable. For example, if [[125000edo|125,000-EDO]] is programmed from a base frequency (20 Hz) and a factor (1.000005545192819) with exponents to map the entire multi-channel keyboard, after 10 octaves (20480 Hz), one phase error occurs every 2.04 days between two adjacent 64-bit float factor values. For the [[402653184edo|402,653,184-EDO]] tuning scheme within chanofreq using factor and exponents, the phase precision between 64-bit float steps is only 78.9 seconds: 1/(440*(2**(-69/12))*1.0000000017214499**(402653184*(32/3)) - 440*(2**(-69/12))*1.0000000017214496**(402653184*(32/3))) = 78.9 seconds.
In comparison, the phase precision between 32-bit steps in 402,653,184-EDO is 12.86 hours, as calculated here: 1/(440*2**((127-69)/12)*2**(1/402653184)-440*2**((127-69)/12))/(60*60) = 12.86 hours.
This shows that even with 64-bit floating-point precision, the factor and exponent solution is far less efficient than other tuning methods, but remains practical for moderately sized musical scales up to approximately [[125000edo|125,000-EDO]], a size that still ensure a precision equivalent to 6 decimal places rounding in cents. However, using Mode B or C as a mediator for [[402653184edo|32-bit MIDI tuning]] should be avoided.
'''Open Questions:'''
* Should cents or intervals be allowed as an alternative to frequencies? In this case, a base frequency, base note, and base channel would be required. Refer to the .kbm format for guidance. For chanofreq, only a single file should be used to define the full multi-channel keyboard mapping.
* Should hexadecimal representation of frequencies be allowed as an alternative to decimal?
* Should the bitfreq workaround be maintained, or should the standard align with OddSound’s 64-bit floating-point format?
}}


== Syntax ==
== Syntax ==
Line 38: Line 80:
  YAML content
  YAML content
  </meta>
  </meta>
=== Comments ===
Inline comment:
# Inline comment
Multiline comment:
/* Multiline
comment */
Nota bene: YAML metadata only supports inline comment.


=== Tuning control ===
=== Tuning control ===
Line 47: Line 98:
  default note Y frequency Z
  default note Y frequency Z


=== Alias support ===
=== Frequency settings ===
Frequency values are encoded by the parser as positive integers with the help of three settings:
* '''minfreq''': Defines the lower bound of frequencies.
* '''maxfreq''': Defines the upper bound of frequencies.
* '''bitfreq''': Specifies the bit depth for the positive integer representation.


To assign an alias for a keyword (e.g., <code>channel</code>, <code>note</code>, <code>frequency</code>, <code>internal</code>,<code>default</code>):
Frequencies are encoded according to the formula: parser_frequency = int(((FREQUENCY - minfreq) * (2 ** bitfreq) / (maxfreq - minfreq)) + 0.5)
@alias keyword: your_custom_alias


To remove an alias:
Each unit increase in the encoded integer corresponds to a frequency increment of (maxfreq - minfreq) / (2 ** bitfreq).
@unalias keyword


For assigning or removing for multiple keywords at once, use a comma-separated list:
The original default settings are configured as follows: minfreq = 0 Hz, maxfreq = 18446.744073709551616 Hz, and bitfreq = 64-bit. These values are intentionally chosen to ensure compatibility with the range of MIDI note frequencies (approximately 8.18 Hz to 12543.85 Hz) and 64-bit systems. This configuration avoids imposing any humanly perceptible or observable limitations on precision (1 phase error occurs once every ~63 million years).
@alias keyword1: alias1, keyword2: alias2
@unalias keyword1, keyword2


Practical example of shorthands:
For 32-bit hardware and software, the default frequency parameters are adjusted to minfreq = 0 Hz, maxfreq = 21474.83648 Hz, and bitfreq = 32-bit. These settings are designed to maintain compatibility with the frequency inputs specified for the 64-bit systems, while minimizing frequency approximation errors, providing a convenient solution where frequencies are accurate to five decimal places with an additional sixth decimal rounded to either 0 or 5. Under these conditions, 1 phase error occurs once every ~4.63 days, at worst.
@alias channel: c, note: n, frequency: f, internal: i, default: d


=== Comments ===
While these default settings are suitable for most applications, users have the flexibility to adjust '''minfreq''' and '''maxfreq''' values and choose smaller or larger integer data types for '''bitfreq''', allowing for customized precision and compatibility tailored to specific needs.
Inline comment:
# Inline comment
Multiline comment:
/* Multiline
comment */
 
Nota bene: YAML metadata only supports inline comment.
 
=== Frequency settings ===
 
By default, the frequency parameters are set to: minfreq = 0 Hz, maxfreq = 21474.83648 Hz, and bitfreq = 32-bit.
 
With these default settings, Z has a precision of five decimal places with an additional sixth decimal place that must be either 0 or 5. This configuration is optimized for compatibility with the human hearing range and 32-bit hardware and software systems, while minimizing phase errors across all frequencies. In the worst-case scenario, 1 phase error would occur approximately once every 4.6 days. These default settings are suitable for most applications, but there is flexibility to modify '''minfreq''' and '''maxfreq''', and to use smaller or larger integer data types with '''bitfreq''' as needed.


To change a setting:
To change a setting:
Line 88: Line 125:


Practical example of custom settings:
Practical example of custom settings:
  @set bitfreq: 64, minfreq: 0, maxfreq: 18446.744073709551616 # 1 phase error would occur approximately once every 63 million years.
  @set bitfreq: 16, minfreq: 0, maxfreq: 6553.6 # 1 phase error would occur once every 20 seconds.
 
=== Alias support ===
To assign an alias for a keyword (e.g., <code>channel</code>, <code>note</code>, <code>frequency</code>, <code>internal</code>, <code>default</code>, <code>minfreq</code>, <code>maxfreq</code>, <code>bitfreq</code>):
@alias keyword: your_custom_alias
 
To remove an alias:
@unalias keyword
 
For assigning or removing for multiple keywords at once, use a comma-separated list:
@alias keyword1: alias1, keyword2: alias2
@unalias keyword1, keyword2
 
Practical example of shorthands:
@alias channel: c, note: n, frequency: f, internal: i, default: d, minfreq: min, maxfreq: max, bitfreq: bit


== Behavior on Loading ==
== Behavior on Loading ==
Upon loading a Chanofreq file, all notes start in an inactive state. As the file is read, each channel and internal command activates the specified note and assigns it the corresponding frequency. If a note that is already active is specified again, its frequency is updated to the new value provided. The same process applies to any default settings defined in the file. After processing the entire file, any notes that remain unspecified are assigned the default frequency if one is set. If no default frequency is provided, these notes remain inactive.
Upon loading a Chanofreq file, all notes start in an inactive state. As the file is read, each channel and internal command activates the specified note and assigns it the corresponding frequency. If a note that is already active is specified again, its frequency is updated to the new value provided. The same process applies to any default settings defined in the file. After processing the entire file, any notes that remain unspecified are assigned the default frequency if one is set. If no default frequency is provided, these notes remain inactive.
The parser encodes frequencies according to the formula: parser_frequency = int(((FREQUENCY - minfreq) * (2 ** bitfreq) / (maxfreq - minfreq)) + 0.5). Once a frequency setting is changed, it stays effective throughout the entire file until a new modification replaces it.


Once an alias is assigned to a keyword, it stays effective throughout the entire file until a new alias replaces it. The original keyword can still be used alongside the alias.
Once an alias is assigned to a keyword, it stays effective throughout the entire file until a new alias replaces it. The original keyword can still be used alongside the alias.