[JAVA] Calculateur de frettes de guitare

Aperçu

Il a été publié sur GitHub dans un projet nommé fret-calulator, mais comme il n'y a pas de commentaires dans le programme, j'ai écrit cette phrase avec l'intention de l'expliquer. J'ai fait. Auparavant, le code source était distribué en tant qu'application pour iOS, mais comme beaucoup de gens n'avaient pas d'environnement de construction, j'en ai fait une application Web.

Lorsque vous accédez à l'application, vous verrez cet écran. Il y a 4 onglets, mais "divers fretting" n'est pas encore implémenté. Je prévois d'implémenter une fonction de calcul de frette pour les échelles non standard ici, mais je saute l'implémentation car je ne l'ai pas encore utilisée.

Utilisez votre smartphone ou tablette pour accéder à l'application et calculer lors de la découpe de la rainure de frette sur la touche.

On dirait que la rainure de la frette a été coupée.

Environnement utilisé pour le développement

Du côté serveur

Spring Boot et Java 1.8

Côté client

AngularJS 1.6.2、Angular Translate 2.13.1、Angular Translate Loader Static Files 2.13.1、HTML、CSS、JavaScript

IDE Eclipse avec le plug-in Sprint Tool Suite installé et Java 1.8

Si vous avez une application déployée sur heroku et que vous souhaitez la voir en action, vous pouvez la voir sur https://guitar-calc.herokuapp.com/.

Composant de calcul

GuitarCalculator.java est la partie principale du programme. Fabriqué en tant que composant de service.

package net.artesware.service;

import java.util.Map;

import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Component
public class GuitarCalculator {

  // [1]
  public List<Map<String, Object>> calcFretPositions(
    float scale,
    int numFrets)
  {
    float f = scale;
    float lastPos = 0.0f;
    List <Map<String, Object>>result = new ArrayList<Map<String, Object>>();
    Map<String, Object> pos;
    for(int i = 0; i < numFrets + 1; i++) {
      float fretPos = f / 17.817f;
      f -= fretPos;
      pos = new HashMap<String, Object>();
      pos.put("fret", i+1);
      pos.put("positionFromNut", lastPos + fretPos);
      pos.put("positionFromFret", fretPos);
      result.add(pos);
      lastPos += fretPos;
    }
    return result;
  }

  // [2]
  public Map<String, Object> calcBridgePosition(
    float scale,
    float jointPos,
    float neckAngle,
    float stringHeight,
    float fretHeight,
    float thickness)
  {
    float base = (float) ((scale - jointPos) * Math.cos((double)neckAngle * Math.PI / 180.0f));
    float height = (float) ((scale - jointPos) * Math.sin((double)neckAngle * Math.PI / 180.0f));
    float strHeight = (stringHeight - 0.1f) * 2.0f + fretHeight;
    Map<String, Object> result = new HashMap<String, Object>();
    result.put("saddlePosition", base);
    result.put("saddleHeight", (height + strHeight + thickness));
    return result;
  }

  // [3]
  public Map<String, Object> calcFingerboardSize(
    float scale,
    int numStrings,
    int numFrets,
    float nutPitch,
    float saddlePitch,
    float nutSpacing)
  {
    float fretboardLength = (float) (scale - scale / Math.pow(2.0f, ((numFrets+1.0f)/12.0f)));
    float nutWidth = nutPitch * (numStrings - 1) + nutSpacing * 2;
    float bw = saddlePitch * (numStrings - 1) + nutSpacing * 2;
    float endWidth = nutWidth + (bw-nutWidth) * (fretboardLength/scale);
    Map<String, Object> result = new HashMap<String, Object>();
    result.put("length", fretboardLength);
    result.put("nutWidth", nutWidth);
    result.put("endWidth", endWidth);
    return result;
  }


}

Calcul de la position des frettes

[1] est une méthode pour trouver la position des frettes de l'échelle rythmique standard. Lorsqu'il est appelé avec la longueur de l'accord et le nombre de frettes comme arguments, la position de chaque frette est calculée. Le résultat est une liste des distances de l'écrou (0 frette) et des distances de la frette précédente. Par exemple, dans le cas de Gibson Les Paul, la longueur de la corde est de 628 mm et elle est de 22 frettes, alors appelez-la comme échelle = 628, numFrets = 22.

Calcul de la position et de la hauteur du pont

[2] est une méthode pour calculer la position et la hauteur du pont. Lorsqu'il est appelé avec la longueur de la corde, la position de l'articulation du corps du cou, l'angle de préparation du manche, la hauteur de la corde à la 12e frette, la hauteur de la frette et l'épaisseur de la plaque de doigt comme arguments, la position et la hauteur du chevalet à partir du point d'articulation du cou et du corps sont calculées. ..

Calcul des dimensions de la plaque à doigts

[3] est une méthode pour calculer les dimensions de la plaque à doigts. Les dimensions de la touche peuvent être calculées en appelant avec la longueur de la corde, le nombre de cordes, le nombre de frettes, l'espacement des cordes à la position de l'écrou, l'espacement des cordes à la position de la selle et la distance entre le côté de la touche et les notes les plus hautes et les plus basses comme arguments. Calculer.

Contrôleur REST

GuitarCalcController.java est une classe de contrôleur REST. C'est aussi simple que d'appeler une méthode dans le composant GuitarCalculator lorsqu'il reçoit une requête HTTP et de renvoyer le résultat.

package net.artesware.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import net.artesware.service.GuitarCalculator;

@RestController
public class GuitarCalcController {

  @Autowired
  private GuitarCalculator calculator;

  // [1]
  @GetMapping("/calcFretPositions")
  @ResponseBody
  public List<Map<String, Object>> calcFretPositions(
    @RequestParam float scale,
    int numFrets) {
    return calculator.calcFretPositions(scale, numFrets);
  }

  // [2]
  @GetMapping("/calcBridgePosition")
  @ResponseBody
  public Map<String, Object> calcBridgePosition(
    @RequestParam float scale,
    float jointPos,
    float neckAngle,
    float stringHeight,
    float fretHeight,
    float thickness) {
    return calculator.calcBridgePosition(scale, jointPos, neckAngle, stringHeight, fretHeight, thickness);
  }

  // [3]
  @GetMapping("/calcFingerboardSize")
  @ResponseBody
  public Map<String, Object> calcFingerboardSize(
    @RequestParam float scale,
    int numStrings,
    int numFrets,
    float nutPitch,
    float saddlePitch,
    float nutSpacing) {
    return calculator.calcFingerboardSize(scale, numStrings, numFrets, nutPitch, saddlePitch, nutSpacing);
  }
}

en conclusion

Quand j'ai fait ça, je voulais juste utiliser Spring Boot. Il aurait pu être plus facile et mieux d'implémenter ce type de programme uniquement du côté client en utilisant AngularJS sans utiliser Spring. Vous êtes libre de modifier ou de déployer le code source. Aucun crédit requis.

Recommended Posts

Calculateur de frettes de guitare
Programme de calculatrice