4个版本

0.2.2 2022年3月4日
0.2.1 2022年2月13日
0.2.0 2021年8月30日
0.1.0 2020年2月7日

#309 in 音频

每月 31次下载

MIT/Apache

1MB
4K SLoC

Floaout

Crate API

Floaout是下一代音频格式。

泡泡文件格式规范

元数据

名称 类型 (字节) 描述
规范版本 u8 (1) 泡泡文件格式规范版本。
泡泡ID u128 (16) 此文件的泡泡ID。如果泡泡未定义,则值为0。如果不为0,则必须基于bkbkb.net管理的ID。
泡泡版本 u16 (2) 泡泡版本
帧数 u64 (8) 帧数
第一个头部绝对帧 u64 (8) 第一个头部绝对帧
每秒采样数 f64 (8) 每秒采样数
LpcmKind u8 (1) LpcmKind
BubSampleKind u8 (1) BubSampleKind
名称大小 u8 (1) 名称大小 (0~255)
名称 字符串 名称 (UTF-8)
CRC-32K/4.2 u32 (4) 在汉明距离4的最大长度为2147483615(位)。在汉明距离6的最大长度为6167(位)。

LpcmKind

变体 描述 值 (类型)
F32LE f32 小端 0 (u8)
F64LE f64 小端 1 (u8)

BubSampleKind

变体 描述
Lpcm Lpcm 0
表达式 表达式 1

CRC

Algorithm::<u32> {
    endian: Endian::Little,
    poly: 0x93a409eb, // CRC-32K/4.2
    init: 0xffffffff,
    refin: true,
    refout: true,
    xorout: 0xffffffff,
    residue: 0x76e908ce,
}

每个样本

| 泡泡样本 | | BubbleSample |

泡泡样本

名称 类型 (字节) 描述
泡泡函数大小 u16 (1) 泡泡函数大小
泡泡的绝对X坐标 总和 泡泡的绝对X坐标 (X_0)
空间 char (1) ' '
泡泡的绝对Y坐标 总和 泡泡的绝对Y坐标 (Y_0)
空间 char (1) ' '
泡泡的绝对Z坐标 总和 泡泡的绝对Z坐标 (Z_0)
空间 char (1) ' '
OrOrExpr
空间 char (1) ' '
音量 总和
空间或空 char (1) ' ' 如果有另一个
脚部相对帧 u64 (8) BubFnsBlock 结尾的帧数。
下一个头部相对帧 可选<u64> (8) 在下一个 BubFnsBlock 开始的帧数。如果为0,则为 None
样本数据 样本数据
CRC-32K/4.2 u32 (4) 在每脚帧之后。从上一个CRC。

样本数据

Lpcm

名称 类型 (字节) 描述
示例 f32f64 (4 或 8) 依赖于 LpcmKind

表达式

名称 类型 (字节) 描述
表达式大小 u16 (2) 表达式大小
表达式 总和 表达式

关键字

变量

关键字 描述
X 说话者的绝对 X 坐标
Y 说话者的绝对 Y 坐标
Z 说话者的绝对 Z 坐标
x x = X - X_0 (X_0 是 Bubble 的绝对 X 坐标)。说话者的相对 X 坐标。
y y = Y - Y_0 (Y_0 是 Bubble 的绝对 Y 坐标)。说话者的相对 Y 坐标。
z z = Z - Z_0 (Z_0 是 Bubble 的绝对 Z 坐标)。说话者的相对 Z 坐标。
N 绝对帧号 n。从文件开始的帧数。(as f64)
n 相对帧号 n。从 BubFnsBlock 开始的帧数。( as f64)
F 帧 (as f64)
S 每秒采样数
常量
关键字 描述
E Euler 数
PI Pi

函数

关键字 描述
sin 正弦
cos 余弦
tan 正切
ln 数的自然对数
lg 数的以 2 为底的对数

其他

关键字 描述
b b???????? f64

标点符号

符号 名称
+ 加号
- 减号
* 星号
/ 斜杠
&& AndAnd
== EqEq
!= Ne
> Gt
< Lt
>= Ge
<= Le

分隔符

符号 名称
空间
, 逗号
( ) 括号

语法

// BubFns
BubFns = BubFn ZeroOrMoreBubFns / f
ZeroOrMoreBubFns = SpaceAndBubFn ZeroOrMoreBubFns / ()

SpaceAndBubFn = Space BubFn / f

// BubFn
// BubFn = Sum Space Sum Space Sum Space OrOrExpr Space Sum
BubFn = SumAndSpace BubFn1 / f
BubFn1 = SumAndSpace BubFn2 / f
BubFn2 = SumAndSpace BubFn3 / f
BubFn3 = OrOrExprAndSpace BubFn4 / f
BubFn4 = Sum () / f

SumAndSpace = Sum Space / f
OrOrExprAndSpace = OrOrExpr Space / f

// OrOr Expr
OrOrExpr = AndAndExpr OrOrExpr1 / AndAndExpr
OrOrExpr1 = OrOr OrOrExpr / f

OrOr = "||" () / f

// AndAnd Expr
AndAndExpr = ComparisonExpr AndAndExpr1 / ComparisonExpr
AndAndExpr1 = AndAnd AndAndExpr / f

AndAnd = "&&" () / f

// Comparison Expr
ComparisonExpr = Sum ComparisonExpr1 / f
ComparisonExpr1 = Comparison Sum / f

Comparison = EqEq () / Comparison1
Comparison1 = Ne () / Comparison2
Comparison2 = Ge () / Comparison3
Comparison3 = Le () / Comparison4
Comparison4 = Gt () / Comparison5
Comparison5 = Lt () / f

EqEq = "==" () / f
Ne = "!=" () / f
Ge = ">=" () / f
Le = "<=" () / f
Gt = '>' () / f
Lt = '<' () / f

// Sum
Sum = Term ZeroOrMorePlusOrMinusAndTerms / f
ZeroOrMorePlusOrMinusAndTerms = PlusOrMinusAndTerm ZeroOrMorePlusOrMinusAndTerms / ()
PlusOrMinusAndTerm = PlusOrMinus Term / f

// Term
Term = Factor ZeroOrMoreStarOrSlashAndFactors / f
ZeroOrMoreStarOrSlashAndFactors = StarOrSlashAndFactor ZeroOrMoreStarOrSlashAndFactors / ()
StarOrSlashAndFactor = StarOrSlash Factor / f

// Factor
Factor = PlusOrMinus Factor / Power

// Power
Power = Atom PowerAndFactor / Atom
PowerAndFactor = '^' Factor / f

// Atom
Atom = ExprInParentheses () / Atom1
Atom1 = FloatLiteral () / Atom2
Atom2 = IntegerLiteral () / Atom3
Atom3 = Function () / Atom4
Atom4 = Variable () / Atom5
Atom5 = Constant () / f

// Variable
Variable = UppercaseX () / Variable1
Variable1 = UppercaseY () / Variable2
Variable2 = UppercaseZ () / Variable3
Variable3 = LowercaseX () / Variable4
Variable4 = LowercaseY () / Variable5
Variable5 = LowercaseZ () / Variable6
Variable6 = UppercaseN () / Variable7
Variable7 = LowercaseN () / Variable8
Variable8 = UppercaseF () / Variable9
Variable9 = UppercaseS () / f

UppercaseX = 'X' () / f
UppercaseY = 'Y' () / f
UppercaseZ = 'Z' () / f
LowercaseX = 'x' () / f
LowercaseY = 'y' () / f
LowercaseZ = 'z' () / f
UppercaseN = 'N' () / f
LowercaseN = 'n' () / f
UppercaseF = 'F' () / f
UppercaseS = 'S' () / f

// Constant
Constant = E () / Constant1
Constant1 = Pi () / f

E = 'E' () / f
Pi = "PI" () / f

// Function
Function = Sine () / Function1
Function1 = Cosine () / Function2
Function2 = Tangent () / Function3
Function3 = Ln () / Function4
Function4 = Lg () / f

Sine = "sin" Factor / f
Cosine = "cos" Factor / f
Tangent = "tan" Factor / f
Ln = "ln" Factor / f
Lg = "lg" Factor / f

// Delimiters
ExprInParentheses = '(' ExprAndClose / f
ExprAndClose = Sum ')' / f

// Integer
IntegerLiteral = DecLiteral () / f

// Float
FloatLiteral = DecLiteral PointAndDecLiteral / BytesF64Literal
PointAndDecLiteral = '.' DecLiteral / f

BytesF64Literal = 'b' ???????? / f

// Dec
DecLiteral = DecDigit ZeroOrMoreDecDigits / f
ZeroOrMoreDecDigits = DecDigit ZeroOrMoreDecDigits / ()

DecDigit = '0' () / DecDigit1
DecDigit1 = '1' () / DecDigit2
DecDigit2 = '2' () / DecDigit3
DecDigit3 = '3' () / DecDigit4
DecDigit4 = '4' () / DecDigit5
DecDigit5 = '5' () / DecDigit6
DecDigit6 = '6' () / DecDigit7
DecDigit7 = '7' () / DecDigit8
DecDigit8 = '8' () / '9'

// Others
PlusOrMinus = Plus () / PlusOrMinus1
PlusOrMinus1 = Minus () / f
Plus = '+' () / f
Minus = '-' () / f

StarOrSlash = Star () / StarOrSlash1
StarOrSlash1 = Slash () / f
Star = '*' () / f
Slash = '/' () / f

Space = ' ' () / f

Floaout 文件格式规范

元数据

名称 类型 (字节) 描述
规范版本 u8 (1) Floaout 文件格式规范版本
Floaout ID u128 (16) Floaout 文件此文件的 Floaout ID。如果歌曲未定义,值为 0。如果不为 0,它必须基于 bkbkb.net 管理的 ID。
Floaout 版本 u16 (2) Floaout 版本
泡泡 u16 (2) 泡泡数量
帧数 u64 (8) 帧数
每秒采样数 f64 (8) 每秒采样数
LpcmKind u8 (1) LpcmKind
标题大小 u8 (1) 标题大小 (0~255)
标题 字符串 标题 (UTF-8)
艺术家大小 u8 (1) 艺术家大小 (0~255)
艺术家 字符串 艺术家 (UTF-8)
CRC-32K/4.2 u32 (4) 在汉明距离4的最大长度为2147483615(位)。在汉明距离6的最大长度为6167(位)。

每个泡泡

泡泡文件将是 'i.bub' (i = 0, ... , 泡泡数量 - 1)

名称 类型 (字节) 描述
文件名大小 u8 (1) 文件名大小 (0~255)
文件名 字符串 不带 ".bub" 的泡泡文件名 (UTF-8)
泡泡起始帧 u16 (2) 泡泡起始帧的数量
泡泡起始帧 u64 (8) 泡泡起始帧
... ... ...
泡泡起始帧 u64 (8) 泡泡起始帧
CRC-32K/4.2 u32 (4) 从上一个 CRC。

库许可证

格式许可证

  • 除修改或派生自这些格式规范外,任何人都可以按照自己的意愿使用或创建这些格式。

  • 这些格式 = { Bubble, Floaout }

(作为预防措施,版权和其他知识产权属于艺术家及其关联方。)

待办事项

  • ColorSpace 中使用泛型类型。
  • 在 BubFrameReader 中添加 read_bub_fns_block
  • 错误处理
  • 阐明是否需要 #[derive(Order)]
  • 在 BubfnsInterpreter 中添加位置字段
  • 检查文件是否支持版本
  • 并行计算
  • 添加 pow、sinh 等函数

依赖项