Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issues with AlphaTab, Metronome and Tracklist #297

Closed
garthholmes opened this issue Dec 7, 2019 · 4 comments
Closed

Issues with AlphaTab, Metronome and Tracklist #297

garthholmes opened this issue Dec 7, 2019 · 4 comments
Assignees
Labels
area-player Related to the audio playback engine. area-rendering Everything related to the rendering platform-javascript Related to the JavaScript version of alphaTab state-needs-investigation
Milestone

Comments

@garthholmes
Copy link

garthholmes commented Dec 7, 2019

Question

I am having some trouble with some aspects of AlphaTab, namely the Metronome and rendering from the Tracklist.

Regarding the Metronome, it is very sporadic and only works when pressed prior to pressing play.

I looked in the documentation but it seems that MetronomeValue should be used instead but changing MetronomeVolume to MetronomeValue resulted in an error.

Also, playback stops when rendering a track in place of a previously rendered track and I'd like to know if there is a method to avert this situation, as was the case previously.

Thank you

Your environment (if applicable)

  • Version used: (develop latest)
  • Platform used: JavaScript
  • Rendering engine used: SVG
  • Browser Name and Version: Chrome/Firefox
  • Operating System and version Windows 10 desktop
@garthholmes garthholmes changed the title General issues with AlphaTab, Playback Speed, Metronome and Tracklist General issues with AlphaTab, Metronome and Tracklist solo/mute Dec 8, 2019
@garthholmes garthholmes changed the title General issues with AlphaTab, Metronome and Tracklist solo/mute Issues with AlphaTab, Metronome and Tracklist Dec 8, 2019
@Danielku15
Copy link
Member

Thanks for the report.

Regarding the Metronome, it is very sporadic and only works when pressed prior to pressing play.

Do you have a minimal reproducible example or at least some more details on that problem? Here some questions towards finding the problem:

  • Is it not working in general or does it stop working at some point?
  • Is it happening on particular files? If yes, is it happening on the same area of the song that the metronome stops working?
  • Is there some sequence of actions that leads to this issue?
  • If you can reproduce it, can you enable some detailed logging and provide the browser logs?
  • Are there some errors in the console?

I looked in the documentation but it seems that MetronomeValue should be used instead but changing MetronomeVolume to MetronomeValue resulted in an error.

Can you point me to the correct location where you got this information from? In the latest docs I cannot find any reference to a MetronomeValue only MetronomeVolume is mentioned. Also from a code perspective MetronomeVolume would be correct.

Also, playback stops when rendering a track in place of a previously rendered track and I'd like to know if there is a method to avert this situation, as was the case previously.

Could be a performance issue, I lately saw some issues there due to the latest reworks. If you can point me to a concrete example where you can see this issue I can try optimizing it.

Unfortunately the playback still has to be done in the UI thread of the browser via ScriptProcessorNode. The ScriptProcessorNode was deprecated already but the AudioWorklet which could replace it is not yet properly available in browsers to replace it.

@Danielku15 Danielku15 self-assigned this Dec 17, 2019
@Danielku15 Danielku15 added 🕷️ bug area-player Related to the audio playback engine. state-needs-investigation platform-javascript Related to the JavaScript version of alphaTab area-rendering Everything related to the rendering labels Dec 17, 2019
@Danielku15 Danielku15 added this to the 1.0.0 milestone Dec 17, 2019
@garthholmes
Copy link
Author

garthholmes commented Dec 17, 2019

Hi Daniel,

Thank you for your responses and questions.

Regarding the documentation, it is here:

https://docs.alphatab.net/develop/reference/api/metronomevolume

As for your questions regarding the metronome, my answers are as follows:

Is it not working in general or does it stop working at some point?

The metronome does work, but it must be engaged prior to commencing playback, or else playback must be stopped (paused) prior to attempting to (re)engage the metronome; otherwise the metronome must be engaged before playback is started.

Is it happening on particular files? If yes, is it happening on the same area of the song that the metronome stops working?

It happens on any or all files that I have tried.

Is there some sequence of actions that leads to this issue?

Press play, mentronome cannot be engaged unless playback is stopped or paused.

If you can reproduce it, can you enable some detailed logging and provide the browser logs?

[Info][AlphaTab][Rendering] [alphaTab] Font API signaled available null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Player] Will use webworkers for synthesizing and web audio api for playback null alphatab-0.9.5.243.js:23559 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu open @ alphatab-0.9.5.243.js:23559 alphaTab.platform.javaScript.AlphaSynthWebWorkerApi @ alphatab-0.9.5.243.js:23714 createWorkerPlayer @ alphatab-0.9.5.243.js:35155 setupPlayer @ alphatab-0.9.5.243.js:575 alphaTab.AlphaTabApi.$hx_exports.alphaTab.AlphaTabApi @ alphatab-0.9.5.243.js:316 alphaTab.platform.javaScript.AlphaTabApi.$hx_exports.alphaTab.platform.javaScript.AlphaTabApi @ alphatab-0.9.5.243.js:24116 init @ alphatab-0.9.5.243.js:1910 exec @ alphatab-0.9.5.243.js:1902 jquery.fn.alphaTab @ alphatab-0.9.5.243.js:6547 (anonymous) @ (index):653 alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] [Arial] Font API signaled available null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] [Georgia] Font API signaled available null (index):1142 Activated: ServiceWorker {scriptURL: "http://localhost/_interact/worker/cache/home_cache.js", state: "activated", onerror: null, onstatechange: null} alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Loading score from 26410 bytes using 5 importers null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Importing using importer Guitar Pro 3-5 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Guitar Pro 3-5 does not support the file null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Importing using importer Guitar Pro 6 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 6] Loading GPX filesystem null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Guitar Pro 6 does not support the file null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Importing using importer Guitar Pro 7 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Loading ZIP entries null age_stave_cache.js:10 Cache open. alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Zip entries loaded null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Start Parsing score.gpif null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] score.gpif parsed null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Start Parsing BinaryStylesheet null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] BinaryStylesheet parsed null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Start Parsing Part Configuration null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Guitar Pro 7] Part Configuration parsed null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLoader] Score imported using Guitar Pro 7 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaSynth] Start loading Soundfont from url /_files/_resources/sf2/alphasynth.sf2 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaTab] Generating Midi null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Midi] Begin midi generation null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Midi] Midi generation done null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaSynth] Loading midi from model null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaSynth] Midi successfully loaded null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaSynth] Loading soundfont from bytes null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] Rendering 1 tracks null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] Track 0: Piano null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] Rendering at scale 1 with layout PageView null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][ScoreLayout] Creating score info glyphs null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 0 to 4 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 5 to 10 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][AlphaSynth] soundFont successfully loaded null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 11 to 18 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 19 to 27 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 28 to 34 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 35 to 41 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 42 to 49 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 50 to 57 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 58 to 64 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 65 to 70 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][PageView] Rendering partial from bar 71 to 71 null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][Rendering] Rendering finished null alphatab-0.9.5.243.js:2087 [Info][AlphaTab][rendering] Rendering completed in 678ms null age_stave_cache.js:13 Cached: (13) ["/support/offline/", "/notation/age-of-extinction/stave/", "/_files/_resources/_xml/menu.xml", "/_files/_resources/_fonts/otf/banner.otf", "/_files/_resources/_fonts/woff2/open-sans-v15-latin-regular.woff2", "/_files/_resources/_fonts/woff2/lato-v14-latin-regular.woff2", "/_files/graphics/vectors/logo.svg", "/_files/graphics/apple-touch-icon.png", "/_files/graphics/vectors/safari-pinned-tab.svg", "/_files/graphics/android-chrome-192x192.png", "/_files/graphics/mstile-150x150.png", "/_files/graphics/favicon.ico", "/_files/notation/staves/age.gp"] home_cache.js:10 Cache open. The resource http://localhost/_files/_resources/_fonts/woff/bravura.woff was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally. home_cache.js:1 Uncaught (in promise) DOMException: Cache.addAll(): duplicate requests (http://localhost/_interact/worker/cache/home_cache.js)

Are there some errors in the console?

Only a warning that the AudioContext must be started via a user action in Google Chrome. Firefox has no errors or warnings. AlphaTab seems to work in iOS and Android, as well Safari functions also as far as I could test.

Regarding playback stopping when rendering a new track, I understand the change in the API, however it would be nice if a method was available that allowed playback to continue, irrespective of rendering but at this stage; I am merely glad that new tracks can be rendered.

In the first instance, it would be nice if AlphaTab could simply pick up from where it left off in terms of playback of the song so I am not sure that there is a bug in this case and I may have to submt a new issue.

As for the metronome, I was concerned there may be a z-index problem but I don't believe this to be the case in this instance.

Thank you, and all the best

@Danielku15
Copy link
Member

Thanks for pointing me to the correct location, I fixed the docs. Somehow Notepad++ couldn't find it due to wrong search settings. Now the page is corrected to the expectations of MetronomeVolume

While testing today I found a channel volume related issue which matches your description. If you activated the metronome on-the-fly it did not start playing, if it was activated before playing it was working.

Regarding playback stopping when rendering a new track, I understand the change in the API, however it would be nice if a method was available that allowed playback to continue, irrespective of rendering but at this stage; I am merely glad that new tracks can be rendered.

I also found this issue and fixed it, it was not really on purpose that the playback stops on track changes. Due to some logic-unification the midi was regenerated on all render requests which is not needed. Now it is only regenerated if the score changes which should resolve the issue.

Please check again with the latest build 0.9.5.245 if it resolves your issues.

@garthholmes
Copy link
Author

garthholmes commented Dec 18, 2019

Metronome issue is fixed in 0.9.5.245 and playback doesn't stop upon rendering of new tracks however I have had to change some of the classes in the AlphaTab.js file itself, as per #300.

Thank you very much for giving your time to comment.

@garthholmes garthholmes reopened this Dec 18, 2019
Danielku15 added a commit that referenced this issue Jul 25, 2020
* Package all JavaScript files on build

* Added click listener to attempt resume of audio context if not running (fixes #200), Added patch for iOS to potentially initialize correct sample rate

* Added catch for zip file (Haxe throws string)

* Improved handling of Tied notes for MusicXML

* Corrected audio generation for grace notes

* Added additional output activation to start audio context in Browsers

* Reworked staff display to respect GP file contents

* Parse PartConfig also for GPX files

* Added chord diagram rendering to page layout

* Added chord support to alphaTex

* Fixed compilation issues

* Fixed wrong error message for tuning change

* Bump version number

* Bump version number in appveyor

* Update alphaTex chord documentation

* Added IDs to headings for better linking

* Fixed rhythm notation positioning

* Fixed issue on tied notes causing stack-overflow

* Fixed issue in alphaTex importer that notes were added to a beat before it is known whether it is stringed

* Introduced consistent API across all platforms, integrated alphaSynth into .net version

* Added support for multiple tracks and staffs in alphaTex #207

* Fixed null reference for new "all" track rendering

* Added short track name reading to alphaTex and made track names optional #207

* Rebuild

* Updated documentation with new "all" tracks and multi-staff/track alphaTex features #207

* Attempt to make appveyor push back version number

* Bump version number

* Moved builds to appveyor as artifact repository

* Minor update on readme

* Added notes about GH releases

* Always publish release nuget

* Fixed compilation issues with string escaping

* Reworked to async test suite and added Karma testrunner for JS tests

* Fixed syntax error

* Test to set NODE_PATH

* Test to set NODE_PATH

* Use long test names for JS tests to distinguish them from .net tests

* Install chrome-launcher explicitely

* Add CHROME_BIN variable to config

* Install puppeteer

* Removed redundant chrome installation

* Small extension on testrunner script

* Publish TRX for problem investiation

* Formatted error message

* Reduced test output

* Reorganized tie origin detection for guitar pro files (#206)

* Improved tied note support for non stringed instruments on alphaTex (#206)

* Minor fix on wrong note ties

* Updated documentation regarding tied notes

* Fixed unit tests

* Reenabled MusicXML tests for parsing and rendering (no content validation yet)

* Ensure correct branch name in output files

* Fixed MusicXML tests for JS

* Reworked slur rendering to really be a slur from one note to another, added special effect slur for hopo/slide slurs, added support for MusicXML slurs (#204)

* Modernized layout of player sample and fixed metronome issues (#208, #209)

* Update nuget packages and target frameworks

* Moved rendering resources to settings including custom font support #215

* Adjusted slur height calculation to be logarithmic, fixed minor display issue of annotation

* Added test sdk package

* Fixed issue on layout creation

* Ensure MSBuild.Sdk.Extras are correctly initialized

* Reorganized folder structure for testdata

* Added initial set of visual tests for alphaTab

* Updated documentation scripts for latest Wyam version

* Fixed documentation compilation issue

* Enabled unsafe code for release mode

* Fixed signature for JS tests

* Workaround for buggy SkiaSharp native lib loading

* Added missing reference file for tuplet test

* Corrected asset link in new help page

* Ensure tests are run again

* Ensure MSBuild SDK extras are correctly initialized for the .net library

* Use UI abstraction on xamarin controls, added missing copyright comments

* Added documentation to the public methods and types

* Minor change on docs

* Reworked tuplet grouping to make beaming prefer tuplet grouping for beaming (fixes #222)

* Fixed wrong JsObject serialization that caused cyclic dependency (fixes #224)

* Added missing slides to alphaTex (fixes #223)

* Added quotes to copy step to overcome issues on spaces in folders

* Correctly register mouse events on html element instead of window (fixes #231)

* Added tapping effect to alphaTex #225

* Added triplet feel to alphaTex #230

* Changed tap effect to tt as tp is used for tremolo picking

* Do not break beams for grace notes

* Restore correct font on tab note rendering

* Updated reference image after fix on grace note font

* Added shorthand notation for tuplets via duration ranges #228

* Extended asserts to accept second parameter

* Ensure tuplet is not overwritten (fxies #233)

* Minor fix on log level setting #235

* Ensure triplet feel is copied from previous bars #239

* Removed duplicate triplet feel effect on tab configuration (fixes #238)

* Added anacrusis parsing for GP formats

* Added anacrusis parsing to AlphaTex

* Added anacrusis sample to alphaTex docs

* Corrected docs to actually use anacrusis

* Respect new anacrusis flag on audio generation

* Added section parsing to alphaTex (fixes #245)

* Added section documentation for alphaTex

* Added rendering of section marker

* Improved example on sections to eliminate cropping

* Update README.md

* Calculate discarded samples on pause to synth and seek back in time (fixes 255)

* Reworked cursor handling to restart playback on highlighted beat #255

* Changed license info across source

* Some code style and formatting.

* Fixed compilation issues.

* Fixed issue on missing static variable initialization

* Various fixes on samples (fixes #271)

* Changed null-coalescing as compiler does not handle it yet properly.

* Add reference documentation for properties, methods and events (#262)

* Added new structure for reference documentation. Updated Wyam

* Some small fixes

* Added docs for Properties > Core

* Added docs for importer

* Added docs for JS specific properties

* Fixed broken test

* Added docs for layout settings

* Added docs for player properties

* Added docs for rendering resources

* Added staves docs

* Auto generate rendering resources table, added docs for vibrato

* Added docs for core API + some API extension for consistency.

* Fixed compilation issues.

* Fixed compilation issues.

* Docs for player api added.

* Moved loadsoundfont to correct section

* Docs for the api props

* Some type infos for API props

* Remove from sidebar again

* Docs for jQuery, made jQuery plugin consistent with API

* Removed separate jquery docs

* Added jQuery event listening to docs.

* Added played api methods and docs to be consistent with current version.

* Fixed compilation issues

* Fixed minor issue and updated player sample after "autoscroll" removal

* Add version tag to docs, bump to 0.9.4

* Corrected wrong number

* Replaces the current Synthesis Engine by a port of TinySoundFont (#261)

* Replaced old synth with TinySoundFont

* Fixed some issues on synthesis due to compiler behavior, added copyright notice and thanks to readme for TinySoundFont and SFZero.

* Consider mix volume correctly on synthesis, ensure track volumes are correctly initialized.

* Added TSF and SFZero info in alphaTab output license header

* Fixed compilation issues

* Fixed tests

* Corrected behavior where initial midi events were re-generated after sequencer finish.

* Always execute stop to ensure seek to start

* Ensure midi event dispatching does not exceed playback range

* Fixed metronome

* Fixed issue on GP7 files that midi settings are not correctly loaded.

* Pulled public alphaSynth API to main API layer and added docs. (fixes #269)

* Introduce consistent rendering and loading API (#272)

* Introduced consistent load/render API, removed width configuration from settings

* Updated documentation

* Introduces ES5 properites and camelCase naming conventions (#273)

* Updated compiler to respect new camelCase naming conventions

* Some small renames and refactorings to avoid name clashes

* Added ES5 property generation to compiler

* Fixed some serialization issues on dynamics

* Updated documentation pages

* Bump version number to indicate bigger change

* Updated reference images for visual suite

* Adds support for any font as rendering resource (#274)

* Added initial forwarding of font sizes to worker

* Added font loading check mechanism to workflow to ensure it is loaded before rendering

* Integrated dynamic font size generation into already existing workflows

* Updated samples and docs

* Some cleanup work

* Ensure track indexes are initialized correctly if no track list is given (fixes #280)

* Ensure metronome volume is not reset to 1 (fixes #279)

* Some docs adjusted and events modified

* Fixed issue with metronome not hearable all the time (related to #297)

* Added new sample using most alphaTab features in a nicer UI

* Corrected wrong docs

* Ensure initial DOM elements are embedded before render finish events #303

* Add dynamic enable/disable of player and cursor feature (#305)

* Added notice that player must be enabled to load soundfonts.

* Added dynamic setup/destroy of player and cursors

* Add support for triplet feel on audio generation (#306)

* Added triplet feel generation for playback (base rules)

* Added docs for triplet feel

* Added test for triplet feel generation

* Updated compiler to fix type check issue

* Fix scrolling on mobile devices (#308)

* Consolidation of Settings (#307)

* Reworked settings structure.

* Added new json serialization generation via haxe macro

* Added cloning of arrays on serialization

* Fixed issues after rebase.

* Bump version

* Added immutable annotation to handle deserialization accordingly

* Adapted serializer generation to be data annotations compatible

* Enabled data attribute serialization

* Various setting changes to simplify things

* Documented breaking changes

* Updated docs.

* More docs on settings changes.

* Ensure songbook mode is fully activated if specified

* Updated samples fixed some minor issues

* Some docs updates

* Updated reference docs on properties.

* Polished all prop docs

* Create workers via blobs by default (#312)

* Switch to blob workers by default

* Added polyfill for IE

* Fixed wrong repeat group generation for alphaTex (#314)

* Disable API docs in favor of Reference docs

* Remove decoupling of render result appending (#316)

* Fixed jumping on cursor for multi staff setups (#324)

* Fixed jumping on cursor for multi staff setups

* removed karma CLI as it is not needed anymore

* Ensure mix volume is not reset on seeking (#325)

* Ensure correct display transposition pitches on alphaTex (#327)

* Add dynamics support to alphaTex (#329)

* Added support for combined slidein slideout on notes (#330)

* Updated data model

* Updated importers

* Updated midi generator

* Updated rendering

* Updated docs

* Reviewed visual changes and updated test suite

* Added docs for css styles (fixes #300)

* Improved grace note positioning (#336)

* Ignore grace notes for cursor positioning

* Consider preceeding beat for grace display positions

* Extended visual tests

* Precache notes to highlight for multi stave/track note highlighting (#337)

* Add support for crescendo and decrescendo in alphaTex (#338)

* Added crescendo/decrescendo parsing to alphaTex

* Added docs for crescendo

* Handle missing startNoteRenderer due to partial renders (#339)

* Remember dynamics on alphaTex (fixes #340)

* Changed tuplet grouping behavior (#342)

* Added activate to playPause to ensure web audio context is active on playback start (#343)

* Minor fixes on multi track handling in alphaTex

* Reset dynamics on staves and tracks back to default (#346)

* Setting to disable default user interaction (#350)

* Reintroduce setting to disable default user interaction behavior of alphaTab

* Added new events for mouse events on beats

* Bump version

* Fixed compilation error

* Adjusted scroll element selection (#357)

* Be more explicit on the usage of templates.

* Make logger public

* AlphaTab based on TypeScript (#356)

* Attempt on 1.0 alpha+latest publish

* Update dependencies

* Minor WPF fixes (fixes #373)

* Slight adjustments on publish scripts for release

+ adding nuget symbols

* Use portable PDBs

* New workflow for final tagged release

Co-authored-by: Daniel Kuschny <danielku15+gitkraken@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-player Related to the audio playback engine. area-rendering Everything related to the rendering platform-javascript Related to the JavaScript version of alphaTab state-needs-investigation
Projects
None yet
Development

No branches or pull requests

2 participants