user: Translate the below assembly code into C programming language:

```asm
<draw_notempo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  movss  %xmm0,-0x30(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm2,%xmm2
  cvtss2sd -0x30(%rbp),%xmm2
  movq   %xmm2,%rax
  movq   %rax,%xmm0
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  lea    -0x14(%rbp),%rdi
  lea    -0x18(%rbp),%rcx
  lea    -0x1c(%rbp),%rdx
  mov    -0x2c(%rbp),%esi
  mov    -0x28(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <identify_note@plt>
  mov    -0x1c(%rbp),%eax
  cmp    $0x1,%eax
  je     L82
  cmp    $0x2,%eax
  jne    L156
  lea    D93(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  jmp    L87
L82:
  lea    D163(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  jmp    L87
L156:
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  nop
L87:
  movss  D80(%rip),%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x18(%rbp),%eax
  test   %eax,%eax
  je     L91
  movss  D32(%rip),%xmm0
  movss  %xmm0,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  test   %eax,%eax
  jle    L90
  movss  -0xc(%rbp),%xmm1
  movss  D80(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
L90:
  mov    -0x1c(%rbp),%eax
  cmp    $0x1,%eax
  je     L45
  test   %eax,%eax
  jle    L149
  sub    $0x2,%eax
  cmp    $0x1,%eax
  ja     L149
  movss  -0xc(%rbp),%xmm1
  movss  D60(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  jmp    L37
L45:
  movss  -0xc(%rbp),%xmm1
  movss  D98(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  nop
L37:
  jmp    L149
L38:
  pxor   %xmm3,%xmm3
  cvtss2sd -0xc(%rbp),%xmm3
  movq   %xmm3,%rax
  movq   %rax,%xmm0
  lea    D101(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  movss  -0xc(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0xc(%rbp),%xmm1
  movss  D135(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
L149:
  mov    -0x18(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  test   %eax,%eax
  jns    L38
L91:
  cmpl   $0x5ff,-0x2c(%rbp)
  jg     L123
  mov    -0x14(%rbp),%eax
  test   %eax,%eax
  jg     L27
  mov    $0x14,%esi
  lea    D107(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  jmp    L123
L27:
  mov    -0x14(%rbp),%eax
  mov    $0x14,%edx
  mov    %eax,%esi
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <a2b@plt>
  movss  D148(%rip),%xmm0
  comiss -0x10(%rbp),%xmm0
  jbe    L123
  movss  D148(%rip),%xmm0
  movss  %xmm0,-0x10(%rbp)
L123:
  movss  -0x10(%rbp),%xmm1
  movss  D55(%rip),%xmm0
  addss  %xmm1,%xmm0
  mulss  -0x30(%rbp),%xmm0
  pxor   %xmm4,%xmm4
  cvtss2sd %xmm0,%xmm4
  movq   %xmm4,%rax
  movq   %rax,%xmm0
  lea    D115(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <a2b@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L75
  call   <__stack_chk_fail@plt>
L75:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D20
type_infered: string
name: extract_symbolic_data
arguments: label: D93
type_infered: string
name: extract_symbolic_data
arguments: label: D163
type_infered: string
name: extract_symbolic_data
arguments: label: D15
type_infered: string
name: extract_symbolic_data
arguments: label: D80
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D32
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D60
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D98
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D101
type_infered: string
name: extract_symbolic_data
arguments: label: D135
type_infered: f32
name: extract_symbolic_data
arguments: label: D107
type_infered: string
name: extract_symbolic_data
arguments: label: D90
type_infered: string
name: extract_symbolic_data
arguments: label: D148
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D55
type_infered: byte[4]
name: extract_symbolic_data
arguments: label: D115
type_infered: string

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

tool: D93: HD

tool: D163: Hd

tool: D15: hd

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

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

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

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

tool: D101:  %.1f 0 dt

tool: D135: 3.5

tool: D107:  %d su

tool: D90:  %d %d sfu

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

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

tool: D115:  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);
}
```