user: Converte this assembly snippet into its equivalent C code:

```asm
<draw_notempo>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x30,%rsp
  mov    %rdi,%rbx
  mov    %esi,%ebp
  movss  %xmm0,0xc(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  cvtss2sd %xmm0,%xmm0
  lea    D67(%rip),%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  lea    0x20(%rsp),%rcx
  lea    0x1c(%rsp),%rdx
  lea    0x24(%rsp),%r8
  mov    %ebp,%esi
  mov    %rbx,%rdi
  call   <identify_note@plt>
  mov    0x1c(%rsp),%eax
  cmp    $0x1,%eax
  je     L3
  cmp    $0x2,%eax
  jne    L113
  lea    D65(%rip),%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
L132:
  mov    0x20(%rsp),%eax
  mov    D151(%rip),%ebx
  test   %eax,%eax
  je     L89
  movss  D142(%rip),%xmm5
  movss  %xmm5,0x8(%rsp)
  cmpl   $0x0,0x24(%rsp)
  jle    L65
  movss  D128(%rip),%xmm6
  movss  %xmm6,0x8(%rsp)
L65:
  mov    0x1c(%rsp),%edx
  cmp    $0x1,%edx
  je     L23
  sub    $0x2,%edx
  cmp    $0x1,%edx
  ja     L97
  movss  0x8(%rsp),%xmm4
  addss  D133(%rip),%xmm4
  movss  %xmm4,0x8(%rsp)
L97:
  sub    $0x1,%eax
  mov    %eax,0x20(%rsp)
  js     L158
  lea    D109(%rip),%r12
L76:
  pxor   %xmm0,%xmm0
  cvtss2sd 0x8(%rsp),%xmm0
  mov    %r12,%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  movss  0x8(%rsp),%xmm1
  movd   %xmm1,%ebx
  movss  D146(%rip),%xmm2
  addss  %xmm1,%xmm2
  movss  %xmm2,0x8(%rsp)
  mov    0x20(%rsp),%eax
  sub    $0x1,%eax
  mov    %eax,0x20(%rsp)
  jns    L76
L89:
  cmp    $0x5ff,%ebp
  jg     L1
  mov    0x24(%rsp),%esi
  test   %esi,%esi
  jle    L122
  mov    $0x14,%edx
  lea    D124(%rip),%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  movss  D164(%rip),%xmm0
  movd   %ebx,%xmm7
  comiss %xmm7,%xmm0
  jbe    L1
  movd   %xmm0,%ebx
  jmp    L1
L3:
  lea    D140(%rip),%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  jmp    L132
L113:
  lea    D99(%rip),%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  jmp    L132
L23:
  movss  0x8(%rsp),%xmm6
  addss  D134(%rip),%xmm6
  movss  %xmm6,0x8(%rsp)
  jmp    L97
L158:
  mov    D151(%rip),%ebx
  jmp    L89
L122:
  mov    $0x14,%esi
  lea    D71(%rip),%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
L1:
  movd   %ebx,%xmm0
  addss  D35(%rip),%xmm0
  mulss  0xc(%rsp),%xmm0
  cvtss2sd %xmm0,%xmm0
  lea    D155(%rip),%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L17
  add    $0x30,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L17:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D67
type: string
name: parse_data
arguments: label: D65
type: string
name: parse_data
arguments: label: D151
type: byte[4]
name: parse_data
arguments: label: D142
type: byte[4]
name: parse_data
arguments: label: D128
type: byte[4]
name: parse_data
arguments: label: D133
type: byte[4]
name: parse_data
arguments: label: D109
type: string
name: parse_data
arguments: label: D146
type: f32
name: parse_data
arguments: label: D124
type: string
name: parse_data
arguments: label: D164
type: byte[4]
name: parse_data
arguments: label: D140
type: string
name: parse_data
arguments: label: D99
type: string
name: parse_data
arguments: label: D134
type: byte[4]
name: parse_data
arguments: label: D71
type: string
name: parse_data
arguments: label: D35
type: byte[4]
name: parse_data
arguments: label: D155
type: string

tool: D67: gsave %.2f dup scale 8 3 RM currentpoint 

tool: D65: HD

tool: {"D151": [0x00,0x00,0x80,0x40]}

tool: {"D142": [0x00,0x00,0x00,0x41]}

tool: {"D128": [0x00,0x00,0x40,0x41]}

tool: {"D133": [0x00,0x00,0x00,0x40]}

tool: D109:  %.1f 0 dt

tool: D146: 3.5

tool: D124:  %d %d sfu

tool: {"D164": [0x00,0x00,0xc0,0x40]}

tool: D140: Hd

tool: D99: hd

tool: {"D134": [0x00,0x00,0x80,0x3f]}

tool: D71:  %d su

tool: {"D35": [0x00,0x00,0x70,0x41]}

tool: D155:  grestore %.1f 0 RM


assistant: ```c
void draw_notempo(struct SYMBOL *s, int len, float sc) {
  int head, dots, flags;
  float dx;
  a2b("gsave %.2f dup scale 8 3 RM currentpoint ", sc);
  identify_note(s, len, &head, &dots, &flags);
  switch (head) {
  case 2:
    a2b("HD");
    break;
  case 1:
    a2b("Hd");
    break;
  default:
    a2b("hd");
    break;
  }
  dx = 4;
  if (dots) {
    float dotx;
    dotx = 8;
    if (flags > 0)
      dotx += 4;
    switch (head) {
    case 3:
    case 2:
      dotx += 2;
      break;
    case 1:
      dotx += 1;
      break;
    }
    while (--dots >= 0) {
      a2b(" %.1f 0 dt", dotx);
      dx = dotx;
      dotx += 3.5;
    }
  }
  if (len < 1536) {
    if (flags <= 0)
      a2b(" %d su", 20);
    else {
      a2b(" %d %d sfu", flags, 20);
      if (dx < 6)
        dx = 6;
    }
  }
  a2b(" grestore %.1f 0 RM\n", (dx + 15) * sc);
}
```